Caricamento di script esterni nell'amministratore ma SOLO per un tipo di post specifico?


16

Quindi continuo a riscontrare questo problema e sto solo cercando la soluzione migliore e più semplice per risolvere questo problema.

Sono venuto a fare uso di tipi di post personalizzati in molti progetti diversi e li ho estesi con metabox personalizzati che ho ulteriormente esteso aggiungendo script personalizzati come i selettori del calendario degli eventi jQuery ... Tutto questo funziona benissimo tranne un problema chiave ... Non voglio che questi script jQuery personalizzati vengano caricati su ogni pagina dell'amministratore.

Sto essenzialmente cercando un modo per avere questi campi jquery personalizzati caricati quando mi trovo nella pagina "modifica post" per un tipo di post SPECIFICO.

Qual è la soluzione migliore qui?


AGGIORNAMENTO 1

Prima di tutto, grazie mille.

In realtà sono scioccato dal fatto che gli sviluppatori di plug-in non si assicurino di cose del genere perché, come sto scoprendo, questo è uno dei motivi principali per cui esistono problemi con plug-in diversi.

Sto avendo ulteriori problemi con questo. Per esempio...

Ho modificato lo script per chiamare l'istruzione if in questo modo:

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

Come puoi vedere, sto cercando di impostare le cose in modo tale che i miei script vengano richiamati SOLO quando aggiungo o modifico un post nel tipo di post "eventi".

Non voglio che lo script venga caricato su qualsiasi altra pagina e inoltre non voglio che venga eseguito nell'elenco di pagine all'interno del tipo di post "eventi", quindi penso che l'istruzione if sia corretta.

Il problema tuttavia sembra essere che lo script viene caricato solo quando creo un nuovo post all'interno di questo tipo di post, ma non sembra funzionare quando sto modificando un post esistente.

Potresti provarlo e magari farmi sapere cosa potrei fare di sbagliato?

Ecco il codice esatto che sto usando ... forse c'è un modo migliore o semplice per farlo?

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

Inoltre ... se volessi aggiungere tre tipi di post e caricare diversi script JS per ogni tipo di post, allora avrei semplicemente duplicato il codice sopra tre volte separate o non è un buon modo per farlo? Ad esempio ... sarebbe meglio chiamare: global $ pagenow, $ typenow; Nella parte superiore del mio file di funzioni o importa o complica le cose quando lo duplico più di una volta?

Su un problema diverso correlato allo stesso ... Ad esempio sto utilizzando il plug-in "moduli gravità" ma ho notato che i loro script vengono eseguiti su ogni pagina dell'amministratore che causa problemi con altri plug-in. Come potrei modificare il loro script per garantire che gli script vengano caricati solo quando ne ho bisogno.


AGGIORNAMENTO 2

Ho modificato il mio file Functions.php con il codice fornito da Mike (sotto), tuttavia sembra che il javascript applicabile sia ancora incluso quando crei un NUOVO Post o una Pagina. Ciò significa che quando si tenta di creare un NUOVO post o una pagina creando un nuovo post / pagina wordpress predefinito o quando si crea un nuovo post / pagina basati su uno dei tipi di post personalizzati. Il codice proposto da Mike IS funziona su tutte le altre pagine di amministrazione e funziona quando si "MODIFICA" un post / pagina esistente o un tipo di post personalizzato. Qualche modifica suggerita per rendere questo lavoro corretto?

Ecco il mio codice attuale:

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

2
@ NetConstuctor.com: non essere scioccato, molte persone che scrivono plugin hanno imparato a programmare in modo da poter scrivere il plugin e quindi avere pochissimo background di programmazione. Stanno grattando un prurito, non seguendo le migliori pratiche.
MikeSchinkel,

Risposte:


14

Innanzitutto, suppongo che tu stia utilizzando wp_enqueue_script()per caricare i tuoi script , giusto?

Detto questo, se capisco la tua domanda, allora ciò di cui hai bisogno è qualcosa di simile al seguente . Dovrai modificarlo per i tuoi dettagli, ovviamente, ma ti dà il quadro generale.

Stiamo collegando admin_initcon la funzione load_my_script()per testare il globale $pagenowper una corrispondenza con la pagina di amministrazione edit.phpe il globale $typenowper vedere se il tipo di post è quello che desideri.

Il resto sono solo dettagli che puoi leggere qui se hai bisogno di saperne di più:

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

AGGIORNARE

Sto rispondendo al tuo aggiornamento. Sfortunatamente ( per qualsiasi motivo ) $typenownon ha un valore durante, admin_initquindi dovrai ottenerlo post_typecaricando il post in base al parametro URL 'post'come vedi nell'esempio seguente (ho copiato la riga sopra e la riga sotto dal tuo esempio così puoi vedere dove posizionarlo):

<?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 Per quanto riguarda le altre tue domande, ti preghiamo di pubblicarle come nuove domande sul sito a cui io o altri possiamo rispondere. Dal momento che stiamo lavorando duramente per aiutarti, ti preghiamo di dare al tuo titolo il miglior titolo possibile e di scrivere le domande nel modo più chiaro e conciso possibile con una buona formattazione e un inglese corretto. Se lo farai, aiuterà con gli stessi problemi a riconoscere la tua domanda come simile a ciò di cui hanno bisogno e renderà più facile a noi che stiamo rispondendo alle tue domande.

Lo chiedo a voi ( e a tutti gli altri che pongono domande su WordPress Answers ) come un favore in cambio del tempo dedicato a rispondere alle vostre domande perché io e gli altri moderatori vogliamo fare di WordPress Answers una straordinaria risorsa per la comunità anziché ancora un altro forum sciatto che è difficile da leggere e difficile da trovare risposte come tanti altri siti sul web.

AGGIORNAMENTO # 2

Pensavo che avessi avuto problemi di precedenza di un operatore nella tua dichiarazione if, ma quando ho provato prima non ci sono riuscito. Se si sta comportando come dici tu, quasi sicuramente lo fai, provalo invece (scusami, non ho tempo di testarlo adesso per assicurarmi che funzioni):

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

ciao mike ... vedi il mio commento qui sotto ... scusa, ho pubblicato nella casella sbagliata
NetConstructor.com

@ NetConstuctor.com : non fornire chiarimenti alla domanda nel luogo progettato per le risposte . Ho spostato il contenuto che hai inserito in una risposta nella tua domanda e sto votando per chiudere quella risposta.
MikeSchinkel,

Ciao Mike ... il tuo codice funziona perfettamente tranne un problema ... Quando sei nella pagina di amministrazione in cui puoi aggiungere un nuovo post o una nuova pagina (sto parlando del post / pagina predefinito) il codice javascript che dovrebbe solo essere caricato per il tipo di post personalizzato viene caricato. Oltre a questo problema, sembra funzionare perfettamente e sta caricando il javascript solo sui tipi di post specificati. Hai qualche modifica che puoi suggerire?
NetConstructor.com il

Scusa Mike - La mia ipotesi iniziale non era corretta. Sembra che il codice che hai fornito includa il javascript anche su altri tipi di post che ho. Sono andato e ho incluso la sceneggiatura esattamente come hai suggerito. Potresti per favore rivederlo ancora una volta?
NetConstructor.com il

1
OK ... Quindi, dopo averlo esaminato ulteriormente, ho scoperto che il codice di Mike funziona davvero ovunque ovunque tranne quando si crea un post "NUOVO". Da quello che vedo qui il javascript viene erroneamente incluso quando crei una NUOVA PAGINA, NUOVO POST per le pagine / post wordpress predefiniti e qualsiasi tipo di post personalizzato che potresti avere. Il codice FUNZIONA (non viene incluso il javascript) quando si modifica un post o una pagina esistente che è un post o una pagina wordpress predefinita o un tipo di post personalizzato. Qualcuno può fornire una modifica suggerita per risolvere questo problema?
NetConstructor.com il

3

Ho pensato di aggiungere qui un codice che risolveva un mio problema correlato. Nel mio caso sto cercando di ottenere JavaScript e CSS per caricare solo su pagine e post e (modificare e creare) e nessun altro.

Avevo trovato una soluzione praticabile usando basename( $_SERVER[ 'SCRIPT_FILENAME' ] )per determinare dove ero nel backend. Ero preoccupato, poiché la disponibilità di $_SERVER[ 'SCRIPT_FILENAME' ]potrebbe variare da server a server (qualcuno sa quanto è probabile che $_SERVER[ 'SCRIPT_FILENAME' ]non sia disponibile su un server?)

Poi mi sono imbattuto in questa domanda e nella risposta MikeSchinkel. Con una piccola modifica l'ho fatto funzionare per me tranne una cosa. Sembra che per qualsiasi motivo quando un nuovo post viene creato tramite "Aggiungi nuovo" non funziona.

Con le seguenti modifiche l'ho fatto funzionare e lo condivido qui nella speranza di aiutare gli altri e di migliorarlo.

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

  }
 }
}

Quindi sto cercando di limitare alcuni script alla mia pagina delle opzioni del tema, che non può essere fatta sulla base di $ pagenow poiché l'URL che viene visualizzato è admin.php? Page = themeoptions e non voglio gli script su ogni admin .php page, solo su quella pagina specifica (la mia pagina delle opzioni del tema)

Qualcuno sa come potrebbe essere fatto meglio?

E per rispondere alla mia domanda:

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

 }


2

So che alla domanda è stata data una risposta. Penso che questa sia una soluzione più semplice.

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

Ho creato una versione che non utilizza la variabile $ 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;
}

I globi non cambieranno, quindi sono sicuri da usare. Inoltre ci sono hook specifici per quelle pagine, quindi non hai bisogno di quella funzione e di quello sforzo. Ultimo ma non meno importante: stai controllando le stringhe non rigorose e anche non in stile yoda, quindi potrebbero non riuscire. Anche fare affidamento $_GETsolo su potrebbe fallire. Comunque: benvenuto in WPSE.
Kaiser,

1

Che dire:

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


}

0

Questo

$ typenow non ha un valore durante admin_init

non è del tutto corretto. Nella maggior parte dei casi ha un valore impostato su admin_init schermate del tipo di post come Aggiungi nuovo, elenco tassonomia, modifica tassonomia ed elenco voci, ma non ne ha uno nella schermata "Modifica YourPostType".

Inoltre, come altri hanno sottolineato, l'hook corretto da utilizzare per aggiungere fogli di stile e script a WP Admin è admin_enqueue_scripts. Se usi questo hook non è necessario controllare is_admin()poiché è attivato solo in WP Admin e ottieni come parametro la schermata corrente. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.