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");
}
}
?>
źródło
Odpowiedzi:
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_init
do funkcjiload_my_script()
testowania globalnej pod$pagenow
kątem dopasowania do strony administratoraedit.php
, a globalnej,$typenow
aby 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:
AKTUALIZACJA
Odpowiadam na twoją aktualizację. Niestety ( z jakiegokolwiek powodu )
$typenow
nie ma wartości podczas,admin_init
wię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ć):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):
źródło
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ę.
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:
źródło
W przypadku Justina Tadlocka należy podłączyć się do skryptów admin_enqueue_scripts w przeciwieństwie do wp_enqueue_scripts dla wtyczek lub skryptów tylko dla administratora:
http://justintadlock.com/archives/2011/07/12/how-to-load-javascript-in-the-wordpress-admin
źródło
Wiem, że pytanie zostało udzielone. Myślę, że jest to prostsze rozwiązanie.
źródło
Stworzyłem wersję, która nie używa zmiennej $ typenow:
źródło
$_GET
tylko na tym może się nie powieść. W każdym razie: Witamy w WPSE.Co powiesz na:
źródło
To
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źródło