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

15

Por lo tanto, continúo encontrando este problema y solo busco la mejor y más sencilla solución para resolver este problema.

He venido a hacer uso de tipos de publicación personalizados en muchos proyectos diferentes y los he ampliado con metaboxes personalizados que luego he ampliado añadiendo scripts personalizados como los selectores de calendario de eventos jQuery ... Todo esto funciona muy bien, excepto un problema clave ... No quiero que estos scripts jQuery personalizados se carguen en todas las páginas del administrador.

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

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

ACTUALIZACIÓN 1

En primer lugar, muchas gracias.

Estoy realmente sorprendido de que los desarrolladores de complementos no se aseguren de cosas como esta porque, al descubrir que esta es una de las principales razones por las que existen problemas con diferentes complementos.

Aunque estoy teniendo algunos problemas adicionales con esto. Por ejemplo ...

He modificado la secuencia de comandos para llamar a la instrucción if como esta:

  

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

Como puede ver, estoy tratando de configurar las cosas para que SOLAMENTE se llame a mis scripts cuando estoy agregando o editando 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 instrucción if es correcta.

Sin embargo, el problema parece ser que la secuencia de comandos 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 tal vez me haga saber qué podría estar haciendo mal?

Aquí está el código exacto que estoy usando ... ¿quizás haya una forma mejor o más 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");
  }
}

También ... si quisiera agregar tres tipos de publicaciones y cargar diferentes scripts de JS para cada tipo de publicación, ¿simplemente duplicaría el código tres veces por separado o no es una buena forma de hacerlo? Por ejemplo ... sería mejor simplemente llamar: global $ pagenow, $ typenow; ¿En la parte superior de mi archivo de funciones o 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 puedo modificar su secuencia de comandos para garantizar que las secuencias de comandos solo se carguen cuando las necesito?

ACTUALIZACIÓN 2

He modificado mi archivo functions.php con el código proporcionado por Mike (a continuación), sin embargo, parece que el javascript correspondiente aún se incluye cuando crea una publicación o página NUEVA. Esto significa que cuando intenta crear una publicación o página NUEVA mediante la creación de una nueva publicación / página de wordpress predeterminada o cuando crea una publicación / página NUEVA basada en uno de sus tipos de publicación personalizada. El código propuesto por Mike ESTÁ trabajando en todas las demás páginas de administración y FUNCIONA cuando "EDITA" una publicación / página existente o un tipo de publicación personalizada. ¿Alguna modificación sugerida para hacer este trabajo 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");
    }
   }
?> 
    
pregunta NetConstructor.com 31.08.2010 - 09:31

7 respuestas

14

Primero, asumo que está utilizando wp_enqueue_script() para cargar sus scripts , ¿verdad?

Dicho esto, si entiendo su pregunta, entonces lo que necesita es algo como lo siguiente . Tendrá que editarlo para sus detalles, por supuesto, pero le da el marco general.

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

El resto son solo detalles que puede leer sobre 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'));
  }
}

ACTUALIZACIÓN

Estoy respondiendo a tu actualización. Desafortunadamente ( por cualquier motivo ) $typenow no tiene un valor durante admin_init , por lo que deberá obtener el post_type cargando la publicación según el parámetro de URL 'post' a medida que vea el siguiente ejemplo (He copiado la línea de arriba y la línea de abajo de su 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') {

P.S. En cuanto a sus otras preguntas, publíquelas como nuevas preguntas en el sitio para que yo u otras personas las respondan. Ya 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 e inglés adecuado. Si va a hacer esto, ayudará con los mismos problemas a reconocer que su pregunta es similar a lo que necesitan y nos facilitará a quienes respondemos sus preguntas.

Le pido esto a usted ( y a todos los demás que hacen preguntas en WordPress Answers ) como un favor a cambio de dedicar tiempo para responder sus preguntas porque yo y los otros moderadores queremos hacer WordPress responde a un tremendo recurso para la comunidad en lugar de a otro foro descuidado que es difícil de leer y difícil de encontrar, como tantos 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 lo encontré. Si se está comportando como usted dice, es casi seguro que lo haga, intente esto en su lugar (lo siento, no tengo tiempo para probarlo ahora mismo para asegurarme de que funcione):

<?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'));
    }
  }
}
    
respondido por el MikeSchinkel 31.08.2010 - 12:07
3

Pensé que agregaría algún código aquí que resolviera un problema relacionado mío. En mi caso, estoy intentando que JavaScript y css se carguen solo en Páginas y Publicaciones y (editar y crear) y en ninguna otra parte.

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

Luego 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 nueva" no funciona.

Con los siguientes ajustes conseguí que funcionara y lo comparto aquí con la esperanza de ayudar a los demás 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 temas, lo cual 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 página admin.php, solo en esa página específica (mi página de opciones de tema)

¿Alguien sabe cuál es la mejor manera de hacer esto?

Y para responder a mi propia pregunta:

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

 }
    
respondido por el Ashley G 22.09.2010 - 09:31
2

Según Justin Tadlock, debe enlazar admin_enqueue_scripts en lugar de wp_enqueue_scripts para complementos o scripts de solo administración:

enlace

add_action('admin_enqueue_scripts','load_admin_datapicker_script');
    
respondido por el Nathaniel Schweinberg 05.09.2012 - 18:36
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;
}
    
respondido por el Mark 17.02.2012 - 01:30
1

¿Qué pasa con:

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' ) );


}
    
respondido por el chifliiiii 14.07.2012 - 01:03
0

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");
    }

}
?> 
    
respondido por el grappler 24.07.2013 - 20:40
0

Esto

  

$ 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 correo".

También, como han señalado otros, el enganche correcto para agregar hojas de estilo y scripts a WP Admin es admin_enqueue_scripts . Si usa este gancho, no necesita verificar is_admin() , ya que solo se activa en WP Admin y obtiene como parámetro la pantalla actual. enlace

    
respondido por el Elliot 28.01.2015 - 17:33

Lea otras preguntas en las etiquetas