web-dev-qa-db-fra.com

Chargement de scripts externes dans Admin, mais UNIQUEMENT pour un type de message spécifique?

Je continue donc à me heurter à ce problème et je cherche simplement la solution la plus simple et la meilleure pour résoudre ce problème.

Je suis venu pour utiliser des types de publications personnalisés dans de nombreux projets différents et les ai étendus avec des métaboxes personnalisés que j'ai ensuite étendus en ajoutant des scripts personnalisés tels que des sélecteurs de calendrier d'événements jQuery ... Tout cela fonctionne parfaitement sauf pour un problème clé ... Je ne veux pas que ces scripts jQuery personnalisés soient chargés sur toutes les pages de l'administrateur.

Je cherche essentiellement à trouver un moyen de simplement charger ces champs jQuery personnalisés lorsque je suis sur la page "modifier le message" pour un type de message SPÉCIFIQUE.

Quelle est la meilleure solution ici?


MISE À JOUR 1

Tout d'abord, merci beaucoup.

Je suis en fait choqué que les développeurs de plugins ne s'assurent pas de choses comme celle-ci car, comme je le découvre, c'est l'une des principales raisons pour lesquelles des problèmes existent avec différents plugins.

J'ai encore quelques problèmes avec cela. Par exemple...

J'ai modifié le script pour appeler l'instruction if comme ceci:

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

Comme vous pouvez le constater, j'essaie de mettre les choses en place de sorte que mes scripts ne soient appelés que lorsque j'ajoute ou modifie un message dans le type de message "événements".

Je ne veux pas que le script se charge sur une autre page et je ne veux pas non plus qu'il s'exécute sur la liste des pages dans le type de publication "événements", donc je penserais que l'instruction if est correcte.

Cependant, le problème semble être que le script est chargé uniquement lorsque je crée un nouveau message dans ce type de message, mais cela ne semble pas fonctionner lorsque je modifie un message existant.

Pourriez-vous tester cela et peut-être me faire savoir ce que je pourrais mal faire?

Voici le code exact que j'utilise ... peut-être existe-t-il un moyen plus simple ou meilleur de procéder?

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

Aussi ... si je voulais ajouter trois types de publication et charger différents scripts JS pour chaque type de publication, est-ce que je dupliquerais simplement le code ci-dessus à trois reprises ou n'est-ce pas une bonne façon de procéder? Par exemple ... serait-il préférable d'appeler simplement: global $ pagenow, $ typenow; Au sommet de mon fichier de fonctions ou est-ce important ou complique-t-il les choses lorsque je le duplique plus d'une fois?

Par exemple, j’utilise le plug-in "Gravity forms" mais j’ai remarqué que leurs scripts étaient exécutés sur toutes les pages de l’administrateur, ce qui posait problème avec d’autres plugins. Comment pourrais-je modifier leur script pour que les scripts ne soient chargés que lorsque j'en ai besoin?.


MISE À JOUR 2

J'ai modifié mon fichier functions.php avec le code fourni par Mike (ci-dessous), mais il semble que le javascript applicable soit toujours inclus lorsque vous créez une nouvelle publication ou une nouvelle page. Cela signifie que lorsque vous essayez de créer une nouvelle publication ou une nouvelle page, soit en créant une nouvelle publication/page wordpress par défaut, soit lorsque vous créez une nouvelle publication/page basée sur l'un de vos types de publication personnalisée. Le code proposé par Mike IS fonctionne sur toutes les autres pages d’administrateur et fonctionne lorsque vous "MODIFIEZ" un article/une page existant ou un type d’article personnalisé. Des modifications suggérées pour rendre ce travail correct?

Voici mon code actuel:

<?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

Premièrement, je suppose que vous utilisez wp_enqueue_script() pour charger vos scripts , n'est-ce pas?

Cela dit, si je comprends votre question, alors il vous faut quelque chose comme ce qui suit . Vous devrez le modifier pour vos détails, bien sûr, mais cela vous donne le cadre général.

Nous accrochons admin_init avec la fonction load_my_script() pour tester le $pagenow global en vue d'une correspondance avec la page administrateur edit.php et le $typenow global pour voir si le type de publication est celui que vous voulez.

Le reste ne sont que des détails que vous pouvez lire sur ici si vous souhaitez en savoir plus:

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

METTRE À JOUR

Je réponds à votre mise à jour. Malheureusement, (quelle que soit la raison _) $typenow n'a pas de valeur pendant admin_init, vous devez donc obtenir le post_type en chargeant la publication en fonction du paramètre d'URL 'post' comme vous le voyez dans l'exemple suivant (j'ai copiez la ligne ci-dessus et la ligne ci-dessous de votre exemple pour que vous puissiez voir où le placer):

<?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. Quant à vos autres questions, merci de les poster en tant que nouvelle question sur le site pour que je puisse répondre à d’autres personnes. Puisque nous travaillons si dur pour vous aider, veuillez prendre le plus grand soin de donner à votre titre le meilleur titre possible et rédigez vos questions aussi clairement et succinctement que possible avec un bon formatage et un anglais correct. Si vous faites cela, cela vous aidera avec les mêmes problèmes. Identifiez votre question comme étant similaire à ce dont ils ont besoin et cela facilitera la tâche de ceux qui répondent à vos questions.

Je vous le demande (et à tous ceux qui posent des questions sur WordPress Answers _) comme une faveur en échange de prendre le temps de répondre à vos questions car moi et les autres modérateurs voulons faire de WordPress Answers un outil formidable. ressource pour la communauté au lieu d’un autre forum bâclé qui est difficile à lire et à trouver des réponses comme tant d’autres sites sur le Web.

MISE À JOUR # 2

Je pensais que vous aviez peut-être eu un problème de priorité d'opérateur dans votre déclaration if, mais lorsque je l'ai testé avant, je ne l'ai pas rencontré. Si vous vous comportez comme vous le dites, essayez plutôt plutôt ceci (désolé, je n’ai pas le temps de le tester pour le moment, pour vous assurer que cela fonctionne):

<?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

Selon Justin Tadlock, vous devez vous connecter à admin_enqueue_scripts, par opposition à wp_enqueue_scripts pour les plugins ou les scripts admin uniquement:

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

Je pensais ajouter ici du code qui résoudrait un problème connexe. Dans mon cas, j'essaie de charger JavaScript et les CSS uniquement sur Pages et Posts et (modifier et créer) et nulle part ailleurs.

J'avais trouvé une solution pratique en utilisant basename( $_SERVER[ 'SCRIPT_FILENAME' ] ) pour déterminer où j'étais sur le serveur. Je craignais cependant que la disponibilité de $_SERVER[ 'SCRIPT_FILENAME' ] puisse varier d’un serveur à l’autre (quelqu'un sait à quel point il est probable que $_SERVER[ 'SCRIPT_FILENAME' ] ne soit pas disponible sur un serveur?)

Puis je suis tombé sur cette question et MikeSchinkel a répondu. Avec une petite modification, je l'ai fait fonctionner pour moi, sauf pour une chose. Il semble que, pour une raison quelconque, lorsqu'un nouveau message est créé via "Ajouter un nouveau", il ne fonctionne pas.

Avec les ajustements suivants, je l'ai fait fonctionner et je le partage ici dans l'espoir d'aider les autres et de l'améliorer.

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

  }
 }
}

Ensuite, j'essaie de limiter certains scripts à ma page d'options de thème, ce qui ne peut pas être fait avec $ pagenow car l'URL affichée est admin.php? Page = themeoptions et je ne veux pas de scripts sur tous les administrateurs. page .php, uniquement sur cette page spécifique (page des options de mon thème)

Quelqu'un sait comment cela pourrait être mieux fait?

Et pour répondre à ma propre question:

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

 }
3
Ashley G

Qu'en est-il de:

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

J'ai créé une version qui n'utilise pas 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

Je sais que la question a été répondu. Je pense que c'est une solution plus 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

Ce

$ typenow n'a pas de valeur pendant admin_init

n'est pas tout à fait correct. Il a une valeur définie sur admin_init dans Most écrans de type post tels que Ajouter, liste de taxonomie, modification de taxonomie et liste d'entrée, mais il n'en a pas dans l'écran "Modifier votre type de message".

De plus, comme d'autres l'ont souligné, le bon raccord à utiliser pour ajouter des feuilles de style et des scripts à WP Admin est admin_enqueue_scripts. Si vous utilisez ce hook, vous n'avez pas besoin de vérifier is_admin() car il est uniquement déclenché dans WP Admin et vous obtenez comme paramètre l'écran actuel. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot