¿Carga scripts externos en Admin pero SOLO para un tipo de publicación específico?

16

Así que sigo encontrándome con este problema y solo estoy buscando la mejor y más simple solución para resolver este problema.

He llegado a hacer uso de tipos de publicación personalizados en muchos proyectos diferentes y los he extendido con metaboxes personalizados que luego he ampliado agregando scripts personalizados como selectores de calendario de eventos jQuery ... Todo esto funciona muy bien, excepto por un tema clave ... No quiero que estos scripts personalizados de jQuery se carguen en cada página del administrador.

Básicamente, solo estoy buscando una manera de cargar estos campos jquery personalizados cuando estoy en la página "editar publicación" para un tipo de publicación ESPECÍFICO.

¿Cuál es la mejor solución aquí?


ACTUALIZACIÓN 1

Antes que nada, muchas gracias.

En realidad, estoy sorprendido de que los desarrolladores de complementos no se aseguren de cosas como esta porque, como estoy descubriendo, esta es una de las razones clave por las que existen problemas con diferentes complementos.

Estoy teniendo algunos problemas adicionales con esto. Por ejemplo...

He modificado el script para llamar a la declaración if de esta manera:

if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events')

Como puede ver, estoy tratando de configurar las cosas para que mis guiones SOLAMENTE se llamen cuando agrego o edito una publicación dentro del tipo de publicación de "eventos".

No quiero que el script se cargue en ninguna otra página y tampoco quiero que se ejecute en la lista de páginas dentro del tipo de publicación de "eventos", por lo que creo que la declaración if es correcta.

Sin embargo, el problema parece ser que el script solo se carga cuando creo una nueva publicación dentro de este tipo de publicación, pero no parece funcionar cuando estoy editando una publicación existente.

¿Podría probar esto y quizás decirme qué podría estar haciendo mal?

Aquí está el código exacto que estoy usando ... ¿tal vez hay una manera mejor o simple de hacer esto?

<?php
// INCLUDE METABOX CUSTOM JQUERY DATEPICKER 2
add_action('admin_init','load_admin_datapicker_script');
function load_admin_datapicker_script() {
  global $pagenow, $typenow;
  if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {
    $ss_url = get_bloginfo('stylesheet_directory');
    wp_enqueue_script('jquery');
    wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
    wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
    wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
    wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
    wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
  }
}

Además ... si quisiera agregar tres tipos de publicación y cargar diferentes scripts JS para cada tipo de publicación, ¿simplemente duplicaría el código anterior tres veces por separado o no es esta una buena manera de hacerlo? Por ejemplo ... ¿sería mejor simplemente llamar: global $ pagenow, $ typenow; En la parte superior de mi archivo de funciones, ¿importa o complica las cosas cuando lo duplico más de una vez?

En un problema diferente relacionado con el mismo ... Por ejemplo, estoy utilizando el complemento "formas de gravedad", pero he notado que sus scripts se ejecutan en cada página del administrador, lo que está causando problemas con otros complementos. ¿Cómo haría para modificar su script para asegurar que los scripts solo se carguen cuando los necesite?


ACTUALIZACIÓN 2

Modifiqué mi archivo functions.php con el código proporcionado por Mike (a continuación), sin embargo, parece que el javascript aplicable todavía se incluye cuando crea una NUEVA publicación o página. Esto significa que cuando intenta crear una NUEVA publicación o página al crear una nueva publicación / página predeterminada de WordPress o cuando crea una NUEVA publicación / página basada en uno de sus tipos de publicaciones personalizadas. El código propuesto por Mike ESTÁ funcionando en todas las demás páginas de administración y sí funciona cuando "EDITAS" una publicación / página existente o un tipo de publicación personalizada. ¿Alguna modificación sugerida para hacer que este trabajo sea correcto?

Aquí está mi código actual:

<?php
   add_action('admin_init','load_admin_datapicker_script');
   function load_admin_datapicker_script() {
    global $pagenow, $typenow;
    if (empty($typenow) && !empty($_GET['post'])) {
        $post = get_post($_GET['post']);
        $typenow = $post->post_type;
    }
    if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {
        $ss_url = get_bloginfo('stylesheet_directory');
        wp_enqueue_script('jquery');
        wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
        wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
        wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
        wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
        wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
    }
   }
?> 
NetConstructor.com
fuente
2
@ NetConstuctor.com: No se sorprendan, muchas personas que escriben complementos aprendieron a programar para poder escribir el complemento y, por lo tanto, tener muy poca experiencia en programación. Se rascan una picazón, no siguen las mejores prácticas.
MikeSchinkel

Respuestas:

14

Primero, supongo que estás usando wp_enqueue_script()para cargar tus scripts , ¿verdad?

Dicho esto, si entiendo tu pregunta, entonces lo que necesitas es algo como lo siguiente . Tendrás que editarlo para tus detalles, por supuesto, pero te da el marco general.

Estamos conectando admin_initcon la función load_my_script()para probar el global $pagenowpara una coincidencia con la página de administración edit.php, y el global $typenowpara ver si el tipo de publicación es el que desea.

El resto son solo detalles sobre los que puede leer aquí si necesita obtener más información:

<?php
add_action('admin_init','load_my_script');
function load_my_script() {
  global $pagenow, $typenow;
  if ($pagenow=='edit.php' && $typenow=='my-custom-type') {
    $ss_url = get_bloginfo('stylesheet_directory');
    wp_enqueue_script('jquery');
    wp_enqueue_script('my-custom-script',"{$ss_url}/js/my-custom-script.js",array('jquery'));
  }
}

ACTUALIZAR

Estoy respondiendo a tu actualización. Desafortunadamente ( por cualquier razón ) $typenowno tiene un valor durante, admin_initpor lo que deberá obtenerlo post_typecargando la publicación según el parámetro de URL 'post'como se ve en el siguiente ejemplo (he copiado la línea de arriba y la de abajo de tu ejemplo para que pueda ver dónde colocarlo):

<?php
global $pagenow, $typenow;
if (empty($typenow) && !empty($_GET['post'])) {
  $post = get_post($_GET['post']);
  $typenow = $post->post_type;
}
if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') {

PD En cuanto a sus otras preguntas, publíquelas como una nueva pregunta en el sitio para que yo u otros respondan. Dado que estamos trabajando arduamente para ayudarlo, tenga mucho cuidado de darle a su título el mejor título posible y también escriba sus preguntas de la manera más clara y sucinta posible con un buen formato y un inglés adecuado. Si hace esto, ayudará con los mismos problemas a reconocer que su pregunta es similar a lo que necesitan y nos facilitará la tarea de responder sus preguntas.

Les pido esto ( y a todos los demás que hacen preguntas sobre las respuestas de WordPress ) como un favor a cambio de tomarse el tiempo para responder sus preguntas porque yo y los otros moderadores queremos hacer que las respuestas de WordPress sean un recurso tremendo para la comunidad en lugar de otro foro descuidado que es difícil de leer y difícil de encontrar respuestas como muchos otros sitios en la web.

ACTUALIZACIÓN # 2

Pensé que podría haber tenido problemas de precedencia de operadores en su declaración if, pero cuando lo probé antes no me encontré con él. Si se comporta como dice, entonces casi seguro que lo intente en su lugar (lo siento, no tengo tiempo para probar esto ahora para asegurarme de que funciona):

<?php
add_action('admin_init','load_my_script');
function load_my_script() {
  global $pagenow, $typenow;
  if (empty($typenow) && !empty($_GET['post'])) {
    $post = get_post($_GET['post']);
    $typenow = $post->post_type;
  }
  if (is_admin() && $typenow=='events') {
    if ($pagenow=='post-new.php' OR $pagenow=='post.php') { 
      $ss_url = get_bloginfo('stylesheet_directory');
      wp_enqueue_script('jquery');
      wp_enqueue_script('my-custom-script',"{$ss_url}/js/my-custom-script.js",array('jquery'));
    }
  }
}
MikeSchinkel
fuente
hola mike ... mira mi comentario a continuación ... lo siento,
publiqué
@ NetConstuctor.com : no proporcione aclaraciones a su pregunta en el lugar diseñado para las respuestas . He movido el contenido que pones en una respuesta a tu pregunta y estoy votando para cerrar esa respuesta.
MikeSchinkel
Hola Mike ... tu código funciona perfectamente, excepto por un problema ... Cuando estás en la página de administración donde puedes agregar una nueva publicación o página nueva (estoy hablando de la publicación / página predeterminada), el código de JavaScript que solo debería ser cargado para el tipo de mensaje personalizado SE carga. Aparte de este problema, parece estar funcionando perfectamente y solo está cargando el JavaScript en los tipos de publicación especificados. ¿Tiene alguna modificación que pueda sugerir?
NetConstructor.com
Lo siento, Mike: mi suposición inicial era realmente incorrecta. Parece que el código que proporcionó ES incluido el javascript en otros tipos de publicaciones que tengo también. He ido e incluido el guión exactamente como me lo sugirió. ¿Podría por favor revisar esto una vez más?
NetConstructor.com
1
OK ... Luego de revisar esto aún más, descubrí que el código de Mike funciona correctamente en todas partes, excepto cuando creas una publicación "NUEVA". Por lo que veo aquí, el javascript se incluye incorrectamente cuando crea una PÁGINA NUEVA, NUEVA PUBLICACIÓN para las páginas / publicaciones predeterminadas de WordPress, así como cualquier tipo de publicación personalizada que pueda tener. El código ESTÁ funcionando (no se incluye el javascript) cuando EDITAS una publicación o página existente que es una publicación o página predeterminada de WordPress o un tipo de publicación personalizada. ¿Alguien puede proporcionar una modificación sugerida para solucionar este problema?
NetConstructor.com
3

Pensé que agregaría un código aquí que resolviera un problema relacionado mío. En mi caso, intento que JavaScript y css se carguen solo en páginas y publicaciones y (editar y crear) y en ningún otro lugar.

Había encontrado una solución viable basename( $_SERVER[ 'SCRIPT_FILENAME' ] )para determinar en qué parte del backend estaba. Sin embargo, me preocupaba ya que la disponibilidad de $_SERVER[ 'SCRIPT_FILENAME' ]un servidor podría variar de un servidor a otro (¿alguien sabe qué posibilidades hay de $_SERVER[ 'SCRIPT_FILENAME' ]que no esté disponible en un servidor?)

Entonces me encontré con esta pregunta y MikeSchinkel respondió. Con una pequeña modificación, lo hice funcionar para mí, excepto por una cosa. Parece que, por cualquier motivo, cuando se crea una nueva publicación a través de "Agregar nuevo", no funciona.

Con los siguientes ajustes lo puse a funcionar y lo estoy compartiendo aquí con la esperanza de ayudar a otros y mejorarlo.

add_action( 'admin_init','imp_add_admin_scripts' );

function imp_add_admin_scripts() {

 $urljs = get_bloginfo( 'template_directory' ).IMP_JS;
 $urlcss =get_bloginfo( 'template_directory' ).IMP_STYLES;

 // Register our scripts
 wp_register_script('imp_jquerytools', $urljs.'jquery/imp_tabs_jquery.tools.min.js' );
 wp_register_style( 'rpanel-css', $urlcss.'impoweradmin.css' );


 global $pagenow, $typenow;
 if ( empty( $typenow ) && !empty( $_GET['post'] ) ) {
  $post = get_post( $_GET['post'] );
  $typenow = $post->post_type;
 } elseif ( empty( $typenow ) && ( $pagenow == 'post-new.php' ) ){ 
  $typenow = 'post';
 }

 if ( is_admin() && ( ( $typenow == 'page') || ( $typenow == 'post') ) ){

  if ( $pagenow == 'post-new.php' OR $pagenow == 'post.php' ) {

   wp_enqueue_script( 'imp_jquerytools' );
   wp_enqueue_style( 'rpanel-css' );

  }
 }
}

A continuación, estoy tratando de limitar algunos scripts a mi página de opciones de tema, lo que no se puede hacer en base a $ pagenow ya que la url que aparece es admin.php? Page = themeoptions y no quiero los scripts en cada administrador .php, solo en esa página específica (página de opciones de mi tema)

¿Alguien sabe cómo se puede hacer esto mejor?

Y para responder mi propia pregunta:

if( is_admin() && ( $_GET['page'] == 'themeoptions' ) ){
  wp_enqueue_script( 'my-script' );

 }
Ashley G
fuente
2

Sé que la pregunta ha sido respondida. Creo que esta es una solución más simple.

<?php
add_action( 'admin_enqueue_scripts', 'load_admin_datapicker_script' );

function load_admin_datapicker_script() {

    $current_screen = get_current_screen();

    if ( $current_screen->post_type === 'events' )  {
        $ss_url = get_bloginfo('stylesheet_directory');
        wp_enqueue_script('jquery');
        wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery'));
        wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery'));
        wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE);
        wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css");
        wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css");
    }

}
?> 
luchador
fuente
1

Creé una versión que no usa la variable $ typenow:

function isPostEditPage($strCheckType="")
{
    //This function will test for a post type and return true if it is the edit page for this type
    //an empty value means checking for native (original, not custom) post type
    $strCheckType=$strCheckType==""?"post":$strCheckType;
    $blnReturn=false;
    if(is_Admin())  
    {
        $strPage=basename($_SERVER['SCRIPT_FILENAME']);
        switch($strPage)
        {
            case "post.php":
                if(isset($_GET["post"]))
                {
                    $intPostID=$_GET["post"];
                    $strThisPostType=get_post_type($intPostID);
                    if($strCheckType==$strThisPostType)
                    {
                        $blnReturn=true;
                    }
                }
            break;
            case "post-new.php":
                $strThisPostType="post";
                if(isset($_GET["post_type"]))
                {
                    $strThisPostType=$_GET["post_type"];
                }
                if($strCheckType==$strThisPostType)
                {
                    $blnReturn=true;
                }

            break;
        }
    }
    return $blnReturn;
}
marca
fuente
Los globales no cambiarán, por lo que son seguros de usar. Además, hay ganchos que son específicos de esas páginas, por lo que no necesita esa función y ese esfuerzo. Por último, pero no menos importante: está comprobando cadenas no estrictas y también de estilo no yoda, por lo tanto, podrían fallar. También confiar en $_GETsolo podría fallar. De todos modos: Bienvenido a WPSE.
kaiser
1

Qué pasa:

add_action( 'admin_init', 'scripts_admin' );

function scripts_admin($hook){

    global $typenow;
    if (empty($typenow) && !empty($_GET['post'])) {
         $post = get_post($_GET['post']);
             $typenow = $post->post_type;
     }
     if( 'post.php' != $hook && 'CUSTOMPOSTTYPE' != $typenow)
        return;

        wp_enqueue_script( 'google-api','http://maps.googleapis.com/maps/api/js?key=AIzaSyCD5TwT3vXLfYEv9WD-kOcEg7YQLcncsls&sensor=true', array( 'jquery' ) );


}
chifliiiii
fuente
0

Esta

$ typenow no tiene un valor durante admin_init

No es del todo correcto. Tiene un valor establecido en admin_init en la mayoría de las pantallas de tipo de publicación como Agregar nuevo, lista de taxonomía, edición de taxonomía y lista de entradas, pero no tiene uno en la pantalla "Editar su tipo de publicación".

Además, como otros señalaron, el gancho correcto para usar para agregar hojas de estilo y scripts a WP Admin es admin_enqueue_scripts. Si usa este gancho, no necesita verificarlo, is_admin()ya que solo se activa en WP Admin y obtiene como parámetro la pantalla actual. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

Elliot
fuente