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

15

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 utiliser des types de publication personnalisés dans de nombreux projets et les ai étendus avec des métabox personnalisés, que j'ai ensuite étendus en ajoutant des scripts personnalisés tels que des sélecteurs d'agenda jQuery ... Tout cela fonctionne parfaitement sauf pour Un problème clé ... Je ne veux pas que ces scripts jQuery personnalisés se chargent sur chaque page de l’administrateur.

Je cherche essentiellement un moyen de ne charger que 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 vraiment choqué que les développeurs de plugins ne s'assurent pas de choses comme ça parce que je découvre que 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 configurer les choses de manière à ce 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 soit chargé sur une autre page ni sur la liste des pages dans le type de message "événements". Je pense donc 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 d'article, mais il semble ne pas fonctionner lorsque je modifie un article existant.

Pourriez-vous tester ceci 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 le faire?

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

Sur un problème différent lié au même ... J'utilise par exemple le plug-in "Gravity forms" mais j'ai remarqué que leurs scripts s'exécutaient 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 EST fonctionnant sur toutes les autres pages d’administration 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");
    }
   }
?> 
    
posée NetConstructor.com 31.08.2010 - 09:31

7 réponses

14

Tout d'abord, je suppose que vous utilisez wp_enqueue_script() pour charger vos scripts non?

Cela dit, si je comprends votre question, alors vous avez besoin de 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 d'administration edit.php et le global $typenow 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'));
  }
}

UPDATE

Je réponds à votre mise à jour. Malheureusement ( pour une raison quelconque ), $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' . voir dans l'exemple suivant (j'ai copié la ligne ci-dessus et la ligne ci-dessous de votre exemple afin de 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. En ce qui concerne vos autres questions, merci de les publier en tant que nouvelle question sur le site pour que je puisse répondre à d'autres personnes. Étant donné que nous travaillons si dur pour vous aider, prenez le plus grand soin possible pour 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 le faites, cela aidera avec les mêmes problèmes à reconnaître 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 les autres qui posent des questions sur WordPress Answers ) en échange de prendre le temps nécessaire pour répondre à vos questions car moi-même et les autres modérateurs voulons faire WordPress Answers est une formidable ressource pour la communauté au lieu d’un autre forum bâclé, difficile à lire et à trouver des réponses comme beaucoup d’autres sites sur le Web.

MISE À JOUR N ° 2

Je pensais que vous aviez peut-être eu un problème de priorité d'opérateur dans votre déclaration if, mais lorsque j'ai testé auparavant, je ne l'avais pas rencontré. Si tel est votre comportement, essayez-le plutôt (vous n’aurez pas le temps de le tester maintenant 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'));
    }
  }
}
    
réponse donnée MikeSchinkel 31.08.2010 - 12:07
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 backend. Je craignais cependant que la disponibilité de $_SERVER[ 'SCRIPT_FILENAME' ] puisse varier d’un serveur à l’autre (tout le monde sait-il à quel point il est probable que $_SERVER[ 'SCRIPT_FILENAME' ] ne soit pas disponible sur un serveur?)

Ensuite, 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 les scripts. sur chaque page admin.php, uniquement sur cette page spécifique (la page d'options de mon thème)

Quelqu'un sait-il comment cela pourrait être fait?

Et pour répondre à ma propre question:

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

 }
    
réponse donnée Ashley G 22.09.2010 - 09:31
2

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

enlace

add_action('admin_enqueue_scripts','load_admin_datapicker_script');
    
réponse donnée Nathaniel Schweinberg 05.09.2012 - 18:36
1

J'ai créé une version n'utilisant 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;
}
    
réponse donnée Mark 17.02.2012 - 01:30
1

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


}
    
réponse donnée chifliiiii 14.07.2012 - 01:03
0

Je sais que la question a été répondue. 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");
    }

}
?> 
    
réponse donnée grappler 24.07.2013 - 20:40
0

Ceci

  

$ 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 la plupart des écrans de type publication tels que Ajouter, liste de taxonomie, modification de taxonomie et liste d'entrées, mais il n'en a pas dans l'écran "Modifier votre type de message".

En outre, comme d'autres l'ont souligné, le point d'ancrage correct à 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. enlace

    
réponse donnée Elliot 28.01.2015 - 17:33

Lire d'autres questions sur les étiquettes