it-swarm-es.com

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

Así que continúo teniendo 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 por un problema clave ... No quiero que estos scripts personalizados de jQuery 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 este tipo de cosas porque, como he descubierto, esta es una de las razones principales por las que existen problemas con los diferentes complementos.

Estoy teniendo algunos problemas más con esto. Por ejemplo...

He modificado el script 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 intentando configurar las cosas para que SOLAMENTE se llame a mis scripts cuando añado 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 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 quizás decirme qué podría estar haciendo mal?

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

Además ... si quisiera agregar tres tipos de publicaciones y cargar diferentes scripts 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 observado 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 provisto 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 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 publicaciones personalizadas. El código propuesto por Mike IS funciona 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 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");
    }
   }
?> 
16
NetConstructor.com

Primero, asumo que estás usando wp_enqueue_script() para cargar tus 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 conectando 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 la que usted desea.

El resto son solo detalles que puede leer sobre aquí si necesita aprender más:

<?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 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 la URL 'post' como ve en el siguiente ejemplo (he copió la línea de arriba y la línea de abajo de su ejemplo para que pueda ver dónde colocarla):

<?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 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 a responder sus preguntas porque yo y los otros moderadores queremos hacer de WordPress Answers una tremenda recurso 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 operador 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'));
    }
  }
}
14
MikeSchinkel

Por Justin Tadlock, debe conectarse a admin_enqueue_scripts en lugar de a wp_enqueue_scripts para plugins o scripts solo de administración:

http://justintadlock.com/archives/2011/07/12/how-to-load-javascript-in-the-wordpress-admin

add_action('admin_enqueue_scripts','load_admin_datapicker_script');
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 ningún otro lugar.

Encontré una solución viable utilizando basename( $_SERVER[ 'SCRIPT_FILENAME' ] ) para determinar dónde estaba el backend. Sin embargo, me preocupaba ya que la disponibilidad de $_SERVER[ 'SCRIPT_FILENAME' ] puede variar de un servidor a otro (¿alguien sabe si es probable 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 el motivo que sea, 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 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 todos los administradores. Página .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 a mi propia pregunta:

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

 }
3
Ashley G

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


}
1
chifliiiii

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;
}
1
Mark

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

}
?> 
1
grappler

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

Además, como han señalado otros, el enlace correcto a usar 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 dispara en WP Admin y aparece como parámetro la pantalla actual. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot