Wydałem wtyczkę, która tworzy krótki kod i wymaga pliku JavaScript i pliku CSS do załadowania na dowolnej stronie zawierającej ten kod. Mógłbym po prostu załadować skrypt / styl na wszystkie strony, ale to nie jest najlepsza praktyka. Chcę tylko ładować pliki na stronach wywołujących shortcode. Znalazłem dwie metody na zrobienie tego, ale obie mają problemy.
Metoda 1 ustawia flagę na true w funkcji obsługi krótkiego kodu, a następnie sprawdza tę wartość w wp_footer
wywołaniu zwrotnym. Jeśli to prawda, używa wp_print_scripts()
do załadowania JavaScript. Problem polega na tym, że działa tylko dla JavaScript, a nie CSS, ponieważ CSS powinien być zadeklarowany w środku <head>
, co można zrobić tylko podczas wczesnego haka, takiego jak init
lub wp_head
.
Metoda 2 uruchamia się wcześnie i „zagląda do przodu”, aby sprawdzić, czy w bieżącej zawartości strony występuje krótki kod. Podoba mi się ta metoda znacznie lepiej niż pierwsza, ale problem z nią nie wykrywa, czy szablon wywołuje do_shortcode()
.
Więc skłaniam się ku użyciu drugiej metody, a następnie próbuję wykryć, czy szablon jest przypisany, a jeśli tak, przeanalizuj go pod kątem krótkiego kodu. Jednak zanim to zrobiłem, chciałem sprawdzić, czy ktoś wie o lepszej metodzie.
Aktualizacja: Zintegrowałem rozwiązanie z moją wtyczką. Jeśli ktoś jest ciekawy, czy jest on rozwinięty w środowisku na żywo, możesz go pobrać lub przejrzeć .
Aktualizacja 2: Od wersji WordPress 3.3 można teraz wywoływać wp_enqueue_script()
bezpośrednio w wywołaniu zwrotnym shortcode , a plik JavaScript będzie wywoływany w stopce dokumentu. Jest to technicznie możliwe również w przypadku plików CSS, ale należy to uznać za złą praktykę, ponieważ wysyłanie CSS poza <head>
znacznik narusza specyfikacje W3C, może powodować FOUC i może zmusić przeglądarkę do ponownego renderowania strony.
Odpowiedzi:
Bazując na własnym doświadczeniu, zastosowałem kombinację metody 1 i 2 - architektury i skryptów stopki 1 oraz techniki „przewidywania” 2.
Jednak dla przewidywania używam wyrażenia regularnego zamiast
stripos
; osobiste preferencje, szybciej i mogą sprawdzić „źle zniekształcony” krótki kod;Jeśli obawiasz się, że autorzy używają
do_shortcode
ręcznie, zdecyduję się poinstruować ich, abyużywali wezwania do działania,aby ręcznie wykasować twój wstępnie zarejestrowany styl.AKTUALIZACJA : Dla leniwego autora, który nigdy nie RTFM, wyślij komunikat, aby podkreślić błąd swoich sposobów;)
źródło
do_shortcode()
, czy nie jest rozsądne zakładać, że są oni biegli w przestrzeganiu instrukcji kolejkowania stylu krótkiego kodu?init
, tylko gdziekolwiek wcześniejwp_head
. Dla leniwego programisty sprawdźwp_style_is( 'my_style_handle', 'done' )
kod wewnętrzny. Jeśli jest to fałsz, wydrukuj widoczny błąd, który instruuje ich, co robić.do_shortcode()
do szablonu już „robi [coś] dodatkowego” - a użytkownicy, którzy zrobiliby to coś więcej, albo już wiedzieliby o potrzebie kolejkowania stylu, albo byliby bardziej chętni / prawdopodobnie postępować zgodnie ze specjalnymi instrukcjami.Spóźniam się z odpowiedzią na to pytanie, ale odkąd Ian rozpoczął ten wątek na liście wp-hackerów, pomyślałem, że warto odpowiedzieć, szczególnie biorąc pod uwagę, że planuję dodać taką funkcję do niektórych wtyczek, nad którymi pracuję.
Podejście, które należy rozważyć, to sprawdzenie przy ładowaniu pierwszej strony, aby sprawdzić, czy shortcode jest rzeczywiście używany, a następnie zapisanie stanu użycia shortcode w meta-kluczu post. Oto jak:
Poradnik krok po kroku
$shortcode_used
flagę na'no'
.$shortcode_used
flagę na'yes'
.'the_content'
priorytet przechwytywania,12
który jest po przetworzeniu przez WordPress skrótów i sprawdź post meta pod kątem''
używania klucza"_has_{$shortcode_name}_shortcode"
. (Zwracana jest wartość,''
gdy meta-klucz posta nie istnieje dla identyfikatora postu).'save_post'
haka, aby usunąć meta postu, usuwając trwałą flagę dla tego postu na wypadek, gdyby użytkownik zmienił użycie krótkiego kodu.'save_post'
haku użyj,wp_remote_request()
aby wysłać nieblokujący HTTP GET do bezpośredniego linku do posta, aby uruchomić ładowanie pierwszej strony i ustawienie trwałej flagi.'wp_print_styles'
i sprawdzić postu meta na wartości'yes'
,'no'
lub''
za pomocą klawisza"_has_{$shortcode_name}_shortcode"
. Jeśli wartość'no'
nie jest podana na zewnątrz. Jeśli wartość wynosi'yes'
lub''
śmiało i podaj zewnętrzny.I to powinno wystarczyć. Napisałem i przetestowałem przykładową wtyczkę, aby pokazać, jak to wszystko działa.
Przykładowy kod wtyczki
Wtyczka budzi się na
[trigger-css]
krótkim kodzie, który ustawia<h2>
elementy na stronie na biało-czerwone, abyś mógł łatwo zobaczyć, jak działa. Zakładacss
podkatalog zawierającystyle.css
plik z tym CSS:Poniżej znajduje się kod działającej wtyczki:
Przykładowe zrzuty ekranu
Oto seria zrzutów ekranu
Podstawowy edytor postów, bez zawartości
Wyświetlanie postów, brak treści
Podstawowy edytor
[trigger-css]
postów z krótkim kodemWyświetlanie
[trigger-css]
postów za pomocą krótkiego koduNie jestem pewien, czy to w 100%
Uważam, że powyższe powinno działać prawie we wszystkich przypadkach, ale ponieważ właśnie napisałem ten kod, nie mogę być w 100% pewien. Jeśli możesz znaleźć sytuacje, w których to nie działa, naprawdę chciałbym wiedzieć, żebym mógł naprawić kod w niektórych wtyczkach, do których właśnie to dodałem. Z góry dziękuję.
źródło
post_content
. A co ze skrótami w widżetach?'pre_http_request'
hak i wyłączyć wiele połączeń z tym samym adresem URL, gdy'save_post'
hak jest aktywny, ale chciałbym poczekać, aż naprawdę zobaczymy taką potrzebę, nie? Jeśli chodzi o widżety, można go poprawić, ale nie jest to przypadek użycia, na który jeszcze patrzyłem.<style>
).Googling znalazł dla mnie potencjalną odpowiedź . Mówię „potencjał”, ponieważ wygląda dobrze, powinien działać, ale nie jestem w 100% przekonany, że to najlepszy sposób:
Powinno to być w stanie sprawdzić, czy bieżący post używa krótkiego kodu i odpowiednio dodać arkusz stylów do
<head>
elementu. Ale nie sądzę, że to zadziała dla strony indeksu (tj. Wielu postów w pętli) ... To także z 2-letniego posta na blogu, więc nie jestem nawet pewien, czy to zadziała z WP 3.1.X .źródło
get_shortcode_regex()
do wyszukiwania.do_shortcode()
ręcznie w szablonie, to już wiesz, że uruchomiszZa pomocą kombinacji odpowiedzi TheDeadMedic i na get_shortcode_regex () dokumentacji (która faktycznie nie znaleźć moje shortcodes), stworzyłem prostą funkcję używany do enqueue skryptów dla wielu skróconych. Ponieważ wp_enqueue_script () w skrótach dodaje tylko do stopki, może to być pomocne, ponieważ obsługuje zarówno skrypty nagłówka, jak i stopki.
źródło
W końcu znalazłem również rozwiązanie warunkowego ładowania css, które działa dla mojej wtyczki www.mapsmarker.com i chciałbym się z tobą podzielić. Sprawdza, czy mój krótki kod jest używany w bieżącym pliku szablonu i nagłówku / stopce.php, a jeśli tak, kolejkuje potrzebny arkusz stylów w nagłówku:
źródło
W przypadku mojej wtyczki stwierdziłem, że czasami użytkownicy mają narzędzie do tworzenia motywów, w którym krótki kod jest przechowywany w metadanych post . Oto, czego używam do wykrycia, czy mój krótki kod wtyczki jest obecny w bieżących postach lub metadanych :
źródło
W przypadku plików CSS możesz je załadować w ramach wyjścia shortcode:
Ustaw stałą lub coś po tym, na przykład
MY_CSS_LOADED
(dołącz CSS tylko wtedy, gdy stała nie jest ustawiona).Obie metody są wolniejsze niż w tym kierunku.
W przypadku plików JS możesz zrobić to samo, jeśli ładowany skrypt jest unikalny i nie ma żadnych zewnętrznych zależności. Jeśli tak nie jest, załaduj go do stopki, ale użyj stałej, aby ustalić, czy należy załadować, czy nie ...
źródło
<head>
element nie jest poprawnym znacznikiem. To prawda, że sprawdzanie poprawności jest tylko wytyczną, ale jeśli staramy się trzymać się tej wytycznej, ładowanie arkusza stylów na wyjściu krótkiego kodu jest złym pomysłem.<style type="text/css"> The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head"
. Tak więc style wbudowane (<element style="..."></element>
) są poprawne, ale<style>
elementy wbudowane nie.Script Logic to wtyczka WordPress, która daje pełną kontrolę nad wszystkimi plikami JavaScript i CSS. Za pomocą tej wtyczki możesz warunkowo ładować plik CSS i JS tylko na stronach, w razie potrzeby.
http://wordpress.org/plugins/script-logic/
źródło