Wczytujesz zewnętrzne skrypty do administratora, ale TYLKO dla określonego typu posta?

16

Nadal napotykam ten problem i szukam najlepszego i najprostszego rozwiązania tego problemu.

Przyszedłem wykorzystać niestandardowe typy postów w wielu różnych projektach i rozszerzyłem je o niestandardowe metaboksy, które następnie rozszerzyłem, dodając niestandardowe skrypty, takie jak selektory kalendarzy zdarzeń jQuery ... Wszystko to działa świetnie, z wyjątkiem jednego kluczowego problemu ... Nie chcę, aby te niestandardowe skrypty jQuery ładowały się na każdej stronie administratora.

Zasadniczo szukam sposobu na załadowanie tych niestandardowych pól jquery, gdy jestem na stronie „edytuj post” dla określonego typu postu.

Jakie jest tutaj najlepsze rozwiązanie?


AKTUALIZACJA 1

Przede wszystkim bardzo dziękuję.

Jestem naprawdę zszokowany, że twórcy wtyczek nie dbają o takie rzeczy, ponieważ jak się dowiaduję, jest to jeden z głównych powodów problemów z różnymi wtyczkami.

Mam jednak z tym kilka problemów. Na przykład...

Zmodyfikowałem skrypt, aby wywoływał instrukcję if w następujący sposób:

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

Jak widać, staram się tak skonfigurować, aby moje skrypty były wywoływane TYLKO podczas dodawania lub edytowania postu w ramach typu „zdarzeń”.

Nie chcę, aby skrypt ładował się na żadnej innej stronie, a także nie chcę, aby działał na liście stron w ramach typu „zdarzeń” typu post, więc uważam, że instrukcja if jest poprawna.

Problemem jest jednak to, że skrypt ładuje się tylko wtedy, gdy tworzę nowy post w ramach tego typu postów, ale wydaje się, że nie działa, gdy edytuję istniejący post.

Czy mógłbyś to przetestować i może dać mi znać, co robię źle?

Oto dokładny kod, którego używam ... może istnieje lepszy lub prosty sposób na zrobienie tego?

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

Także ... jeśli chciałbym dodać trzy typy postów i załadować różne skrypty JS dla każdego typu postów, to czy po prostu powielę kod powyżej trzy razy osobno, czy to nie jest dobry sposób na zrobienie tego? Na przykład ... czy lepiej byłoby po prostu wywołać: global $ pagenow, $ typenow; Na górze pliku funkcji czy to ma znaczenie, czy komplikuje rzeczy, gdy duplikuję go więcej niż raz?

Jeśli chodzi o inny problem związany z tym samym ... Używam na przykład wtyczki „gravity form”, ale zauważyłem, że ich skrypty działają na każdej stronie administratora, co powoduje problemy z innymi wtyczkami. Jak mogę zmodyfikować ich skrypt, aby skrypty ładowały się tylko wtedy, gdy ich potrzebuję.


AKTUALIZACJA 2

Zmodyfikowałem mój plik functions.php kodem dostarczonym przez Mike'a (poniżej), jednak wydaje się, że odpowiedni javascript jest nadal dołączany podczas tworzenia NOWEGO posta lub strony. Oznacza to, że gdy próbujesz utworzyć NOWY post lub stronę, tworząc nowy domyślny post / stronę Wordpress lub gdy tworzysz NOWY post / stronę na podstawie jednego z niestandardowych typów postów. Kod zaproponowany przez Mike'a IS działa na wszystkich innych stronach administracyjnych i działa, gdy „EDYTUJ” istniejący post / stronę lub niestandardowy typ posta. Jakieś sugerowane modyfikacje, aby to działało poprawnie?

Oto mój obecny kod:

<?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
źródło
2
@ NetConstuctor.com: Nie zdziw się, wiele osób piszących wtyczki nauczyło się programować, aby mogły pisać wtyczki, a tym samym mają bardzo małe doświadczenie programistyczne. Drapią świąd, nie przestrzegając najlepszych praktyk.
MikeSchinkel,

Odpowiedzi:

14

Po pierwsze, zakładam, że używasz wp_enqueue_script()do ładowania swoich skryptów , prawda?

To powiedziawszy, jeśli rozumiem twoje pytanie , potrzebujesz czegoś takiego . Oczywiście będziesz musiał go edytować, aby uzyskać szczegółowe informacje, ale daje to ogólne ramy.

Podchodzimy admin_initdo funkcji load_my_script()testowania globalnej pod $pagenowkątem dopasowania do strony administratora edit.php, a globalnej, $typenowaby sprawdzić, czy typ postu jest taki, jaki chcesz.

Reszta to tylko szczegóły, o których możesz przeczytać tutaj, jeśli chcesz dowiedzieć się więcej:

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

AKTUALIZACJA

Odpowiadam na twoją aktualizację. Niestety ( z jakiegokolwiek powodu ) $typenownie ma wartości podczas, admin_initwięc musisz uzyskać post_type, ładując post na podstawie parametru URL, 'post'jak widać w poniższym przykładzie (skopiowałem wiersz powyżej i wiersz poniżej z Twojego przykładu więc możesz zobaczyć, gdzie go umieścić):

<?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 Jeśli chodzi o pozostałe pytania, proszę zamieścić je jako nowe pytanie w witrynie, na które ja lub inne osoby udzielę odpowiedzi. Ponieważ tak ciężko pracujemy, aby Ci pomóc, zadbaj o to, aby tytuł był najlepszy, jaki możesz, a także napisz swoje pytania tak jasno i zwięźle, jak to możliwe, z dobrym formatowaniem i odpowiednim angielskim. Jeśli to zrobisz, pomoże to z tymi samymi problemami rozpoznać twoje pytanie jako podobne do tego, czego potrzebują i ułatwi nam, odpowiadając na twoje pytania.

Proszę o to od ciebie ( i wszystkich innych, którzy zadają pytania na temat odpowiedzi na WordPress ) jako przysługę w zamian za poświęcenie czasu na odpowiedź na twoje pytania, ponieważ ja i inni moderatorzy chcemy, aby WordPress Answers był ogromnym zasobem dla społeczności zamiast jeszcze jedno niechlujne forum, które jest trudne do odczytania i trudne do znalezienia odpowiedzi, tak jak wiele innych witryn w Internecie.

AKTUALIZACJA # 2

Myślałem, że mogłeś mieć problemy z pierwszeństwem operatora w instrukcji if, ale kiedy testowałem, zanim się na nią nie natknąłem. Jeśli zachowuje się tak, jak mówisz, prawie na pewno to zrobisz, zamiast tego spróbuj (przepraszam, nie mam teraz czasu na przetestowanie tego, aby upewnić się, że działa):

<?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
źródło
cześć mike ... zobacz mój komentarz poniżej ... przepraszam,
napisałem
@ NetConstuctor.com : Nie podawaj wyjaśnień do pytania w miejscu przeznaczonym na odpowiedzi . Przeniosłem treść, na którą udzieliłeś odpowiedzi, na twoje pytanie i głosuję za jej zamknięciem.
MikeSchinkel,
Cześć Mike ... Twój kod działa idealnie, z wyjątkiem jednego problemu ... Gdy jesteś na stronie administratora, gdzie możesz dodać nowy post lub nową stronę (mówię o domyślnym postu / stronie) kod javascript, który powinien tylko być załadowane dla niestandardowego typu postu CZY ładuje się. Poza tym problemem wydaje się działać idealnie i ładuje javascript tylko dla określonych typów postów. Czy masz jakieś modyfikacje, które możesz zasugerować?
NetConstructor.com
Przepraszam Mike - Moje początkowe założenie było w rzeczywistości nieprawidłowe. Wygląda na to, że kod, który podałeś, zawiera javascript na innych typach postów, które mam. Poszedłem i załączyłem skrypt dokładnie tak, jak sugerowałeś. Czy mógłbyś przejrzeć to jeszcze raz?
NetConstructor.com
1
OK ... Po przejrzeniu tego jeszcze bardziej dowiedziałem się, że kod Mike'a rzeczywiście działa poprawnie wszędzie, z wyjątkiem tworzenia „NOWEGO” posta. Z tego, co widzę tutaj, javascript jest niepoprawnie dołączany podczas tworzenia NOWEJ STRONY, NOWEGO POCZTU dla domyślnych stron / postów wordpress, a także dowolnego niestandardowego typu posta, jaki możesz mieć. Kod działa (oznacza to, że javascript nie jest dołączany), gdy edytujesz istniejący post lub stronę, która jest albo domyślnym postem lub stroną Wordpress, albo niestandardowym typem posta. Czy ktoś może podać sugerowaną modyfikację w celu rozwiązania tego problemu?
NetConstructor.com
3

Pomyślałem, że dodam tutaj kod, który rozwiązał mój podobny problem. W moim przypadku próbuję załadować JavaScript i css, aby ładowały się tylko na stronach i postach oraz (edytowały i tworzyły) i nie gdzie indziej.

Znalazłem praktyczne rozwiązanie, basename( $_SERVER[ 'SCRIPT_FILENAME' ] )aby określić, gdzie jestem na backendie. Martwiłem się jednak, ponieważ dostępność $_SERVER[ 'SCRIPT_FILENAME' ]może się różnić w zależności od serwera (ktoś wie, jak prawdopodobne jest, $_SERVER[ 'SCRIPT_FILENAME' ]że nie będzie dostępny na serwerze?)

Potem natknąłem się na to pytanie i odpowiedź MikeSchinkel. Z małą modyfikacją sprawiłem, że działa dla mnie, z wyjątkiem jednej rzeczy. Wygląda na to, że z jakiegokolwiek powodu, gdy nowy post jest tworzony przez „Dodaj nowy”, nie działa.

Dzięki następującym poprawkom sprawiłem, że zadziałało i dzielę się nim tutaj, mając nadzieję na pomoc innym i poprawę.

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

  }
 }
}

Następnie próbuję ograniczyć niektóre skrypty do mojej strony opcji motywu, czego nie można zrobić na podstawie $ pagenow, ponieważ pojawiający się adres URL to admin.php? Page = themeoptions i nie chcę skryptów dla każdego administratora strona .php, tylko na tej konkretnej stronie (moja strona opcji motywu)

Czy ktoś wie, jak najlepiej to zrobić?

I aby odpowiedzieć na moje pytanie:

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

 }
Ashley G.
źródło
2

Wiem, że pytanie zostało udzielone. Myślę, że jest to prostsze rozwiązanie.

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

}
?> 
chwytak
źródło
1

Stworzyłem wersję, która nie używa zmiennej $ 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;
}
znak
źródło
Globale się nie zmienią, więc można z nich bezpiecznie korzystać. Ponadto istnieją haki specyficzne dla tych stron, więc nie potrzebujesz tej funkcji i tego wysiłku. Last but not least: Sprawdzasz ciągi, które nie są surowe, a także w stylu innym niż yoda, dlatego mogą się nie powieść. Również poleganie $_GETtylko na tym może się nie powieść. W każdym razie: Witamy w WPSE.
kaiser
1

Co powiesz na:

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
źródło
0

To

$ typenow nie ma wartości podczas admin_init

nie jest całkowicie poprawne. Ma wartość ustawioną na admin_init na większości ekranów typu post, takich jak Dodaj nową, listę taksonomii, edycję taksonomii i listę wpisów, ale nie ma jej na ekranie „Edytuj swój typ postu”.

Ponadto, jak zauważyli inni, właściwym hakiem do dodawania arkuszy stylów i skryptów do Administratora WP jest admin_enqueue_scripts. Jeśli użyjesz tego haka, nie musisz sprawdzać, is_admin()ponieważ jest on uruchamiany tylko w WP Admin i otrzymujesz jako parametr bieżący ekran. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

Elliot
źródło