Încărcarea scripturilor externe în Admin doar pentru un anumit tip de postare

31 aug. 2010, 10:31:20
Vizualizări: 18.1K
Voturi: 16

Continu să întâmpin această problemă și caut cea mai bună și simplă soluție pentru a o rezolva.

Folosesc tipuri de postări personalizate în multe proiecte și le-am extins cu metabox-uri custom, la care am adăugat scripturi precum selectoare de calendar jQuery... Totul funcționează perfect, cu excepția unei probleme cheie... Nu vreau ca aceste scripturi jQuery să se încarce pe fiecare pagină din Admin.

În esență, caut o metodă prin care aceste câmpuri jQuery custom să se încarce doar când sunt pe pagina de "editare postări" pentru un ANUMIT tip de postare.

Care este cea mai bună soluție aici?


ACTUALIZARE 1

În primul rând, vă mulțumesc foarte mult.

Sunt surprins că dezvoltatorii de plugin-uri nu folosesc astfel de mecanisme, deoarece, după cum am aflat, acesta este unul dintre motivele principale pentru care apar conflicte între plugin-uri.

Totuși, mai am câteva probleme. De exemplu...

Am modificat scriptul pentru a include condiția astfel:

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

După cum vedeți, încerc să configurez lucrurile astfel încât scripturile mele să se încarce DOAR când adaug sau editez o postare de tipul "events".

Nu vreau ca scriptul să se încarce pe alte pagini și nici pe lista de postări din cadrul tipului "events", așa că cred că condiția este corectă.

Problema este că scriptul se încarcă doar când creez o nouă postare de acest tip, dar nu funcționează când editez o postare existentă.

Ați putea testa acest lucru și să-mi spuneți ce aș putea greși?

Iată codul exact pe care îl folosesc... poate există o metodă mai bună sau mai simplă?

<?php
// INCLUDEM SCRIPTUL 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");
  }
}

De asemenea... dacă aș vrea să adaug trei tipuri de postări și să încarc scripturi JS diferite pentru fiecare, aș duplica codul de mai sus de trei ori sau nu este o metodă bună? De exemplu... ar fi mai bine să declar: global $pagenow, $typenow; În partea de sus a fișierului functions.php sau nu contează dacă îl repet de mai multe ori?

Pe o problemă similară... folosesc plugin-ul "gravity forms", dar am observat că scripturile sale se încarcă pe fiecare pagină din Admin, ceea ce cauzează conflicte cu alte plugin-uri. Cum aș putea modifica scriptul lor pentru a se încărca doar când este necesar?


ACTUALIZARE 2

Am modificat fișierul functions.php cu codul propus de Mike (mai jos), dar se pare că scripturile se încarcă în continuare când creezi o NOUĂ Postare sau Pagină. Asta înseamnă că atunci când încerci să creezi o Postare/Pagină nouă, fie standard WordPress, fie dintr-un tip custom, scripturile se încarcă. Codul lui Mike FUNCȚIONEAZĂ pe celelalte pagini din Admin și când EDITEZI o postare/pagină existentă. Aveți sugestii pentru a rezolva acest lucru?

Iată codul actual:

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

@NetConstuctor.com: Nu fi şocat, mulţi oameni care scriu plugin-uri au învăţat să programeze tocmai pentru a putea scrie acel plugin şi, astfel, au foarte puţină experienţă în programare. Ei rezolvă o problemă personală, nu urmează cele mai bune practici.

MikeSchinkel MikeSchinkel
4 sept. 2010 03:45:18
Toate răspunsurile la întrebare 7
13
14

În primul rând, presupun că folosești wp_enqueue_script() pentru a încărca scripturile tale, corect?

Având în vedere acest lucru, dacă am înțeles corent întrebarea ta, atunci ai nevoie de ceva similar cu următoarele. Desigur, va trebui să-l adaptezi pentru detaliile tale, dar îți oferă structura generală.

Folosim hook-ul admin_init cu funcția load_my_script() pentru a testa variabila globală $pagenow pentru a verifica dacă se potrivește cu pagina de administrare edit.php, și variabila globală $typenow pentru a vedea dacă tipul de postare este cel dorit.

Restul sunt doar detalii pe care le poți citi aici dacă ai nevoie să înveți mai multe:

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

ACTUALIZARE

Răspund la actualizarea ta. Din păcate (din orice motiv), $typenow nu are o valoare în timpul admin_init, așa că va trebui să obții post_type prin încărcarea postării bazată pe parametrul URL 'post', așa cum vezi în următorul exemplu (am copiat linia de mai sus și linia de mai jos din exemplul tău pentru a vedea unde să o plasezi):

<?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. În ceea ce privește celelalte întrebări, te rog să le postezi ca întrebări noi pe site pentru mine sau alții să le răspundem. Deoarece ne străduim să te ajutăm, te rog să ai grijă să dai titlului cel mai bun titlu posibil și, de asemenea, să scrii întrebările cât mai clar și mai concis posibil, cu un format corespunzător și engleză corectă. Dacă vei face acest lucru, va ajuta la recunoașterea întrebării tale ca fiind similară cu ce au nevoie alții și va fi mai ușor pentru noi care răspundem la întrebări.

Îți cer acest lucru (și tuturor celorlalți care pun întrebări pe WordPress Answers) ca un favor în schimbul timpului și efortului depus pentru a răspunde la întrebările tale, deoarece eu și ceilalți moderatori dorim să facem din WordPress Answers o resursă extraordinară pentru comunitate, în loc de încă un forum neglijent care este greu de citit și greu de găsit răspunsuri, precum multe alte site-uri de pe web.

ACTUALIZARE #2

Am crezut că ai putea avea o problemă de precedență a operatorilor în instrucțiunea ta if, dar când am testat înainte nu am întâlnit-o. Dacă se comportă așa cum spui, atunci aproape sigur ai, așa că încearcă în schimb următoarele (îmi pare rău, nu am timp acum să testez pentru a mă asigura că funcționează cu siguranță):

<?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'));
    }
  }
}
31 aug. 2010 13:07:15
Comentarii

salut mike... vezi comentariul meu mai jos... scuze, am postat în caseta greșită

NetConstructor.com NetConstructor.com
4 sept. 2010 01:15:23

@NetConstuctor.com: Te rog să nu oferi clarificări la întrebarea ta în spațiul destinat răspunsurilor. Am mutat conținutul pe care l-ai pus într-un răspuns în întrebarea ta și votez pentru închiderea acelui răspuns.

MikeSchinkel MikeSchinkel
4 sept. 2010 03:43:05

Salut Mike... codul tău funcționează perfect, cu excepția unei probleme... Când ești pe pagina de administrare unde poți adăuga o postare nouă sau o pagină nouă (vorbesc despre postarea/pagina implicită), codul JavaScript care ar trebui încărcat doar pentru tipul de postare personalizat SE încarcă. În afară de această problemă, totul pare să funcționeze perfect și codul JavaScript se încarcă doar pe tipurile de postări specificate. Ai vreo modificare pe care o poți sugera?

NetConstructor.com NetConstructor.com
6 sept. 2010 03:17:33

Scuze Mike - Presupunerea mea inițială a fost de fapt incorectă. Se pare că codul pe care l-ai furnizat include și JavaScript pe alte tipuri de postări pe care le am. Am inclus scriptul exact așa cum ai sugerat. Poți, te rog, să revizuiesti asta încă o dată?

NetConstructor.com NetConstructor.com
6 sept. 2010 03:22:13

OK... Deci după ce am analizat și mai atent, am descoperit că codul lui Mike funcționează corect peste tot, cu excepția cazului în creezi o postare "NOUĂ". Din ceea ce văd aici, JavaScript este inclus incorect atunci când creezi o PAGINĂ NOUĂ, POSTARE NOUĂ pentru paginile/postările implicite din WordPress, precum și pentru orice tip de postare personalizată pe care ai putea avea. Codul FUNCȚIONEAZĂ (adică JavaScript nu este inclus) atunci când EDITEZI o postare sau pagină existentă, fie că este o postare sau pagină implicită din WordPress, fie un tip de postare personalizată. Poate cineva să ofere o modificare sugerată pentru a rezolva această problemă?

NetConstructor.com NetConstructor.com
6 sept. 2010 03:38:25

@NetConstuctor.com: Vezi UPDATE #2.

MikeSchinkel MikeSchinkel
6 sept. 2010 08:43:22

Prietenul meu... se pare că asta a rezolvat complet problema!!! Notă A++

NetConstructor.com NetConstructor.com
6 sept. 2010 11:19:30

@NetConstuctor.com: Cu plăcere și mulțumesc pentru votul pozitiv și pentru că ai selectat răspunsul meu ca soluție la întrebarea ta.

MikeSchinkel MikeSchinkel
6 sept. 2010 13:18:42

Super lucru! Am stat 2 zile încercând să găsesc propria soluție, doar pentru a descoperi aici această variantă mult mai bună!

Lemon Bacon Lemon Bacon
22 sept. 2010 09:51:42

De fapt - actualizare: am modificat codul astfel:

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

pentru a include scripturile mele doar când sunt pe pagina sau postare. Funcționează bine, CU EXCEPȚIA ecranului de Postare Nouă unde nu se încarcă din nu știu ce motiv. La Editare Postări sau Pagini și creare pagini noi, funcționează bine, la creare postări noi, Nu.

Lemon Bacon Lemon Bacon
22 sept. 2010 10:06:40

actualizare: vezi răspunsul meu pentru o soluție funcțională (nu știu dacă e cea mai bună soluție, dar funcționează)

Lemon Bacon Lemon Bacon
22 sept. 2010 10:32:37

Deși această întrebare are deja răspuns, doar vreau să adaug o mică îmbunătățire: putem folosi funcția get_current_screen() pentru a obține toate informațiile despre ecranul curent. Folosirea acelor variabile globale nu este recomandată.

Anh Tran Anh Tran
5 sept. 2012 20:06:58

@Rilwis Pentru a fi clar, în momentul scrierii codului de mai sus, ecranul curent nu avea tot ceea ce era necesar în mod fiabil.

MikeSchinkel MikeSchinkel
6 sept. 2012 00:23:04
Arată celelalte 8 comentarii
0

Am crezut că voi adăuga aici niște cod care a rezolvat o problemă similară a mea. În cazul meu, încerc să încarc JavaScript și CSS doar pe Pagini și Articole (la editare și creare) și nicăieri altundeva.

Am găsit o soluție funcțională folosind basename( $_SERVER[ 'SCRIPT_FILENAME' ] ) pentru a determina unde mă aflu în backend. Totuși, eram îngrijorat deoarece disponibilitatea lui $_SERVER[ 'SCRIPT_FILENAME' ] poate varia de la server la server (știe cineva cât de probabil este ca $_SERVER[ 'SCRIPT_FILENAME' ] să nu fie disponibil pe un server?).

Apoi am dat peste această întrebare și răspunsul lui MikeSchinkel. Cu o mică modificare, am reușit să o fac să funcționeze pentru mine, cu excepția unui lucru. Se pare că, din anumite motive, când un articol nou este creat prin "Adaugă nou", nu funcționează.

Cu următoarele ajustări am reușit să o fac să funcționeze și o împărtășesc aici în speranța de a ajuta alții și de a o îmbunătăți.

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;

 // Înregistrăm scripturile noastre
 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' );

  }
 }
}

În continuare, încerc să limitez unele scripturi doar la pagina de opțiuni a temei mele, ceea ce nu poate fi făcut pe baza lui $pagenow deoarece URL-ul care apare este admin.php?page=themeoptions și nu vreau să încarc scripturile pe fiecare pagină admin.php, ci doar pe acea pagină specifică (pagina mea de opțiuni a temei).

Știe cineva cum s-ar putea face acest lucru în cel mai bun mod?

Și pentru a răspunde la propria mea întrebare:

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

 }
22 sept. 2010 10:31:57
0

Potrivit lui Justin Tadlock, ar trebui să folosiți admin_enqueue_scripts în loc de wp_enqueue_scripts pentru scripturile specifice plugin-urilor sau administrației:

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

add_action('admin_enqueue_scripts','load_admin_datapicker_script');
5 sept. 2012 19:36:36
0

Știu că întrebarea a primit deja un răspuns. Cred că aceasta este o soluție mai simplă.

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

}
?> 
24 iul. 2013 21:40:44
1

Am creat o versiune care nu utilizează variabila $typenow:

function isPostEditPage($strCheckType="")
{
    //Această funcție va verifica un tip de postare și va returna true dacă este pagina de editare pentru acest tip
    //o valoare goală înseamnă verificarea pentru tipul de postare nativ (original, nu personalizat)
    $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;
}
17 feb. 2012 02:30:23
Comentarii

Variabilele globale nu se vor schimba, deci sunt sigure de utilizat. În plus, există hook-uri specifice acelor pagini, așa că nu ai nevoie de acea funcție și de acel efort. Nu în ultimul rând: verifici șiruri de caractere într-un mod nestrict și fără stil yoda, prin urmare ele ar putea eșua. De asemenea, bazându-te doar pe $_GET ar putea eșua. Oricum: Bine ai venit pe WPSE.

kaiser kaiser
20 feb. 2012 17:29:20
0

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


}
14 iul. 2012 02:03:56
0

Acest

$typenow nu are nicio valoare în timpul admin_init

nu este în întregime corect. Variabila are o valoare setată pe admin_init în majoritatea ecranelor de tip post, cum ar fi Adăugare Nouă, lista de taxonomii, editarea taxonomiei și lista de intrări, dar nu are o valoare în ecranul "Editare TipPostare".

De asemenea, după cum au menționat și alții, hook-ul corect pentru a adăuga fișiere de stiluri și scripturi în WP Admin este admin_enqueue_scripts. Dacă folosești acest hook, nu este nevoie să verifici is_admin() deoarece este declanșat doar în WP Admin și primești ca parametru ecranul curent. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

28 ian. 2015 18:33:36