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

16

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

J'en suis venu à utiliser des types de messages personnalisés dans de nombreux projets différents et je 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 très bien, 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 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 ça, 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 cependant d'autres 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 voir, j'essaie de configurer les choses de manière à ce que mes scripts soient appelés UNIQUEMENT lorsque j'ajoute ou modifie une publication dans le type de publication "é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 message "événements", donc je pense que l'instruction if est correcte.

Le problème semble cependant être que le script ne se charge que lorsque je crée un nouveau message dans ce type de message, mais il ne semble pas fonctionner lorsque je modifie un message existant.

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

Voici le code exact que j'utilise ... peut-être y a-t-il un moyen meilleur ou simple 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, puis-je simplement dupliquer le code ci-dessus trois fois 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; En haut de mon fichier de fonctions ou est-ce important ou compliqué lorsque je le copie plusieurs fois?

Sur un problème différent lié au même ... J'utilise par exemple le plugin "gravity forms" mais j'ai remarqué que leurs scripts s'exécutent sur chaque page de l'administrateur, ce qui cause des problèmes avec d'autres plugins. Comment pourrais-je modifier leur script pour m'assurer que les scripts ne sont 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 un NOUVEAU message ou une nouvelle page. Cela signifie que lorsque vous essayez de créer une NOUVELLE publication ou 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és. Le code proposé par Mike fonctionne sur toutes les autres pages d'administration et il FONCTIONNE lorsque vous "MODIFIEZ" une publication / page existante ou un type de publication 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");
    }
   }
?> 
NetConstructor.com
la source
2
@ NetConstuctor.com: Ne soyez pas choqué, de nombreuses personnes écrivant des plugins ont appris à programmer pour pouvoir écrire le plugin et donc avoir très peu de connaissances en programmation. Ils se démangent et ne suivent pas les meilleures pratiques.
MikeSchinkel

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, ce dont vous avez besoin est 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_initavec la fonction load_my_script()pour tester le global $pagenowpour une correspondance avec la page d'administrationedit.php , et le global $typenowpour voir si le type de publication est celui que vous voulez.

Le reste n'est que des détails que vous pouvez lire ici si vous avez besoin d'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'));
  }
}

MISE À JOUR

Je réponds à votre mise à jour. Malheureusement ( pour une raison quelconque ) $typenown'a pas de valeur pendant admin_init, vous devrez donc l'obtenir post_typeen chargeant la publication en fonction du paramètre URL 'post'comme vous le voyez dans l'exemple suivant (j'ai copié la ligne ci-dessus et la ligne ci-dessous de votre exemple afin 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') {

PS Quant à vos autres questions, merci de les poster comme nouvelle question sur le site pour que moi ou d'autres y répondent. Étant donné que nous travaillons si dur pour vous aider, veuillez prendre grand soin de donner à votre titre le meilleur titre possible et veuillez également écrire vos questions aussi clairement et succinctement que possible avec un bon formatage et un anglais correct. Si vous le faites, cela aidera les mêmes problèmes à reconnaître que votre question est similaire à ce dont ils ont besoin et cela facilitera la tâche de nous qui répondons à vos questions.

Je vous le demande ( et à tous ceux qui posent des questions sur WordPress Answers ) en guise de faveur en échange de prendre le temps de répondre à vos questions parce que moi et les autres modérateurs voulons faire de WordPress Answers une ressource formidable pour la communauté au lieu de encore un autre forum bâclé qui est difficile à lire et difficile à 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 instruction if, mais lorsque j'ai testé avant, je ne l'ai pas rencontré. Si cela se comporte comme vous le dites, alors vous le faites presque certainement, essayez-le à la place (désolé, je n'ai pas le temps de le tester 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'));
    }
  }
}
MikeSchinkel
la source
salut mike ... voir mon commentaire ci-dessous ... désolé, j'ai posté dans la mauvaise case
NetConstructor.com
@ NetConstuctor.com : veuillez ne pas apporter de clarifications à votre question à l'endroit prévu pour les réponses . J'ai déplacé le contenu que vous avez mis dans une réponse dans votre question et je vote pour fermer cette réponse.
MikeSchinkel
Salut Mike ... votre code fonctionne parfaitement sauf pour un problème ... Lorsque vous êtes sur la page d'administration où vous pouvez ajouter un nouveau post ou une nouvelle page (je parle du post / page par défaut) le code javascript qui ne devrait être chargé pour le type de publication personnalisé DOIT être chargé. À part ce problème, il semble fonctionner parfaitement et ne charge le javascript que sur les types de publication spécifiés. Avez-vous des modifications à proposer?
NetConstructor.com
Désolé Mike - Mon hypothèse initiale était en fait incorrecte. Il semble que le code que vous avez fourni inclut également le javascript sur les autres types de messages que j'ai. Je suis allé et j'ai inclus le script exactement comme vous l'avez suggéré. Pourriez-vous s'il vous plaît revoir ceci une fois de plus?
NetConstructor.com
1
OK ... Donc, après avoir examiné cela encore plus loin, j'ai découvert que le code de Mike fonctionne bien partout, sauf lorsque vous créez un "NOUVEAU" message. D'après ce que je vois ici, le javascript est incorrectement inclus lorsque vous créez une nouvelle page, un nouveau message pour les pages / messages wordpress par défaut ainsi que tout type de message personnalisé que vous pourriez avoir. Le code fonctionne (la mesure du javascript n'est pas incluse) lorsque vous modifiez une publication ou une page existante qui est soit une publication ou une page wordpress par défaut, soit un type de publication personnalisé. Quelqu'un peut-il proposer une modification pour résoudre ce problème?
NetConstructor.com
3

Je pensais que j'ajouterais ici du code qui a résolu un problème connexe. Dans mon cas, j'essaie d'obtenir JavaScript et CSS à charger uniquement sur les pages et les messages et (modifier et créer) et nulle part ailleurs.

J'avais trouvé une solution viable basename( $_SERVER[ 'SCRIPT_FILENAME' ] )pour déterminer où j'étais sur le backend. J'étais cependant inquiet car la disponibilité de $_SERVER[ 'SCRIPT_FILENAME' ]pourrait varier d'un serveur à l'autre (quelqu'un sait-il à quel point il est probable qu'il $_SERVER[ 'SCRIPT_FILENAME' ]ne soit pas disponible sur un serveur?)

Puis je suis tombé sur cette question et la réponse de MikeSchinkel. 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", cela 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 sur la base de $ pagenow car l'URL qui apparaît est admin.php? Page = themeoptions et je ne veux pas les scripts sur chaque administrateur Page .php, uniquement sur cette page spécifique (ma page d'options de 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' );

 }
Ashley G
la source
2

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

}
?> 
grappler
la source
1

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;
}
marque
la source
Les globaux ne changeront pas, ils sont donc sûrs à utiliser. De plus, il existe des crochets spécifiques à ces pages, vous n'avez donc pas besoin de cette fonction ni de cet effort. Dernier point mais non des moindres: vous vérifiez les chaînes non strictes et non-yoda, donc elles pourraient échouer. S'appuyer $_GETuniquement sur peut échouer. Quoi qu'il en soit: Bienvenue sur WPSE.
kaiser
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' ) );


}
chifliiiii
la source
0

Cette

$ 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 de message comme Ajouter un nouveau, liste de taxonomie, liste de modification et d'entrée de taxonomie, mais il n'en a pas dans l'écran "Modifier votre type de post".

En outre, comme d'autres l'ont souligné, le crochet correct à utiliser pour ajouter des feuilles de style et des scripts à WP Admin est admin_enqueue_scripts. Si vous utilisez ce crochet, vous n'avez pas besoin de le 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

Elliot
la source