Chargement des scripts externes dans Administrateur, mais seulement pour un type spécifique post?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/1058

Question

Alors je continue à courir dans cette question et je cherche juste le meilleur et le plus simple solution pour résoudre ce problème.

Je suis venu d'utiliser des types de postes personnalisés dans de nombreux projets différents et ont étendu ces derniers avec Metaboxes personnalisés que je puis encore étendu en ajoutant des scripts personnalisés tels que les sélecteurs de calendrier des événements jQuery ... Tout cela fonctionne très bien, sauf pour une question clé ... Je ne veux pas que ces scripts jQuery personnalisés à charge sur chaque page dans l'admin.

Je suis essentiellement juste à la recherche d'une manière juste ces champs ont jquery personnalisés chargés quand je suis sur la page « post modifier » pour un type de poste SPECIFIQUE.

Quelle est ici la meilleure solution?


Mise à jour 1

Tout d'abord, je vous remercie beaucoup.

Je suis choqué en fait que les développeurs de plugin ne faites que des choses comme ça parce que je trouve c'est l'une des principales raisons pour lesquelles des problèmes existent avec des plugins différents.

J'ai quelques autres questions mais avec cela. Par exemple ...

Je l'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, je suis en train de choses mis en place afin que mes scripts que s'appeler quand je suis ajout ou la modification d'un poste dans le type poste de « événements ».

Je ne veux pas le script à la charge sur toute autre page et aussi ne veulent pas à courir sur la liste de la page dans le type poste de « événements » Je pense donc que l'instruction if est correcte.

Le problème semble toutefois que le script est chargé uniquement lorsque je crée un nouveau poste au sein de ce type de poste, mais il ne semble pas fonctionner quand j'édite un poste existant.

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

Voici le code exact que je suis en utilisant ... peut-être il y a une façon meilleure 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 postes et charger différents scripts JS pour chaque type de poste alors que je dupliquant le code ci-dessus à trois reprises ou est-ce pas une bonne façon de le faire? Par exemple ... serait-il préférable de simplement appel: pagenow global $, typenow $; En haut de mon dossier de fonctions ou est-il important ou compliquer les choses quand je dupliquer plus d'une fois?

Sur un autre problème lié à la même ... Je suis par exemple en utilisant le plug-in « formes de gravité » mais je l'ai remarqué leurs scripts exécutés sur chaque page de l'administration qui est à l'origine des problèmes avec d'autres plug-ins. Comment puis-je aller sur la modification de leur script pour assurer que les scripts ne se charger quand je les 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 est toujours inclus lorsque vous créez un nouveau message ou la page. Cela signifie que lorsque vous essayez de créer un nouveau poste ou la page soit en créant un nouveau poste / page wordpress par défaut ou lorsque vous créez un message NEW / page basée une de vos types de postes personnalisés. Le code proposé par Mike travaille sur toutes les autres pages d'administration et il ne fonctionne lorsque vous « EDIT » un poste existant / page ou le type poste personnalisé. Toutes les modifications suggérées pour faire 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");
    }
   }
?> 
Était-ce utile?

La solution

D'abord, je suppose que vous utilisent wp_enqueue_script() pour charger vos scripts , droit?

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

Nous accrochait admin_init avec la fonction load_my_script() aux tests du $pagenow mondial pour un match avec la edit.php page d'administration, et la $typenow mondiale pour voir si le type poste est celui que vous voulez.

Les autres sont juste des détails que vous pouvez lire sur le si vous avez besoin pour 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épondre à votre mise à jour. Malheureusement ( pour quelque raison que ce ) $typenow n'a pas de valeur au cours admin_init vous aurez donc besoin d'obtenir le post_type en chargeant le poste en fonction du paramètre d'URL 'post' que vous voyez dans l'exemple de suivi (I » avez copié la ligne ci-dessus et ci-dessous la ligne de votre exemple afin que vous puissiez voir où 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, s'il vous plaît les afficher comme nouvelle question sur le site pour moi ou les autres à répondre. Étant donné que nous travaillons si dur pour vous aider, s'il vous plaît prendre soin de donner à votre titre le meilleur titre que vous le pouvez aussi écrire vos questions s'il vous plaît aussi clairement et succinctement que possible avec une bonne mise en forme et un anglais correct. Si vous faites cela, il vous aidera avec les mêmes problèmes reconnaître votre question comme étant semblable à ce dont ils ont besoin et il sera plus facile de nous qui répondre à vos questions.

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

Mise à jour # 2

Je pensais que vous pourriez avoir eu un problèmes de priorité de l'opérateur dans votre instruction if mais quand je l'ai essayé avant que je ne l'ai pas courir dedans. Si elle se comporte comme par exemple, alors vous certainement n'essayez donc de ce lieu (désolé, je n'ai pas le temps de tester ce moment pour assurer avec certitude 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'));
    }
  }
}

Autres conseils

Je pensais que je voudrais ajouter un code ici qui a résolu un problème lié à moi. Dans mon cas, je suis en train d'obtenir JavaScript et CSS pour charger uniquement sur les pages et les messages et (éditer et créer) et nulle part ailleurs.

Je l'avais trouvé une solution viable à l'aide basename( $_SERVER[ 'SCRIPT_FILENAME' ] ) pour déterminer où je me trouvais sur le back-end. Je craignais que que la disponibilité de $_SERVER[ 'SCRIPT_FILENAME' ] peut varier serveur à serveur (quelqu'un sait comment il est probable pour $_SERVER[ 'SCRIPT_FILENAME' ] de ne pas être disponible sur un serveur?)

Alors je suis tombé sur cette question et la réponse MikeSchinkel. Avec une petite modification je l'ai fait travailler pour moi, sauf pour une chose. Il semble que, pour une raison quelconque lorsqu'un nouveau poste est créé par « Ajouter » il ne fonctionne pas.

Avec les réglages suivants, je l'ai reçu au travail 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, je suis en train de limiter certains scripts à mes options de thème page, qui ne peut être fait sur la base $ pagenow comme le l'URL qui apparaît est admin.php? Page = themeoptions et je ne veux pas les scripts sur chaque page admin.php, uniquement sur cette page spécifique (mes options de thème la page)

Quelqu'un sait comment cela pourrait mieux faire?

Et pour répondre à ma propre question:

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

 }

Par Justin Tadlock, vous devez brancher dans admin_enqueue_scripts par opposition à wp_enqueue_scripts pour les plugins ou admin uniquement des scripts:

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

add_action('admin_enqueue_scripts','load_admin_datapicker_script');

Je le sais, a répondu à la question. Je pense que cela 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");
    }

}
?> 

Je créé une version qui n'utilise pas la variable typenow de $:

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

Qu'en est-il:

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


}

  

$ typenow n'a pas de valeur au cours admin_init

est pas tout à fait correct. Il a un ensemble de valeur sur admin_init dans plus écrans de type poste comme Ajouter nouvelle liste de taxonomie, modifier la taxonomie et la liste d'entrée, mais il n'a pas un dans l'écran « Modifier YourPostType ».

En outre, comme d'autres ont souligné, le crochet correct à utiliser pour ajouter des scripts à feuilles de style et WP Admin est admin_enqueue_scripts. Si vous utilisez ce crochet vous n'avez pas besoin de vérifier is_admin() car il est tiré seulement dans wp et vous obtenez en tant que paramètre l'écran actuel. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top