Wordpress version 4.5.1
Próbuję dynamicznie aktualizować tytuły stron w określonym szablonie. Po wielu kopaniach i poznaniu wp_title()
zmian próbuję użyć document_title_parts
. Jednak nie mogę w ogóle uruchomić filtra.
Jestem w temacie podrzędnym functions.php
:
add_theme_support( 'title-tag' );
//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });
add_filter( 'document_title_parts', function( $title )
{
error_log('here');
return $title;
}, 10, 1 );
Próbowałem obu wariantów dodawania obsługi motywów, jak pokazano powyżej, ale obserwując mój dziennik, nic nie pojawia się na stronie ponownie. Działało error_log
to z innymi funkcjami (takimi jak wp_title
), więc rejestrowanie błędów działa.
Próbowałem również pre_get_document_title
, który uruchamia się przy ładowaniu strony, chociaż nie jestem w stanie zmusić go do zmiany tytułu.
Więc! Albo źle używam filtra, nie skonfigurowałem poprawnie motywu, albo czegoś innego, o czym nie wiem. Każda pomoc byłaby bardzo mile widziana!
edytuj, aby dodać więcej szczegółów
Próba funkcji init, ale to również nie działa: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
Ponadto, podczas gdy ja usunięte wszelkie odniesienia do <title>
z header.php
, rzeczywisty tytuł strona jest nadal pojawiać się w źródle.
//add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });
? Poprawne użycie dodawania obsługi motywów.add_theme_support()
funkcję w haku inicjującym . Inną sprawą jest upewnienie się, że nadpisujeszheader.php
plik, aby nie mieć<title>
tagu HTML .<title>
tagówheader.php
? Może spróbuj wymienić10
zPHP_MAX_INT
. Ponadto przekazany parametr jest tablicą zamiast wartości ciągu.Odpowiedzi:
Uruchomiłem twój filtr w moim obszarze rozwoju. Nie działało. Następnie wyłączyłem wtyczkę Yoast SEO, o której wiedziałem, że bałaganił także tytuł strony. Potem zadziałało. Tak więc moją sugestią byłoby, aby inna wtyczka zadzierała z tym.
W przypadku Yoast było to wywołanie filtru
pre_get_document_title
zwracające niepuste. W takim przypadkuwp_get_document_title
następuje zwarcie, a reszta funkcji, w tymdocuments_title_parts
filtr, nie jest analizowana, jak widać z pierwszych wierszy kodu:Więc wziąłem twój filtr i zmieniłem zaczep na
pre_get_document_title
. Nie działało. Następnie zmieniłem priorytet na wyższy poziom niż ten sam filtr w Yoast. Potem zadziałało. Więc nie wiem o twojej konfiguracji, ale sugeruję, abyś spróbował:źródło
pre_get_document_title
priorytet .Po kilku eksperymentach wpadłem na następującą sugestię: czy to możliwe, że
<title>
znacznik jest „zakodowany na stałe” w motywie twojego rodzicaheader.php
? W takim przypadku możesz spróbować usunąć<title>
znacznik z motywu podrzędnegoheader.php
(skopiuj rodzicheader.php
do folderu motywu podrzędnego), a następnie dodaj obsługę motywu z powrotem poprzezfunctions.php
:Spróbuję wyjaśnić, co doprowadziło mnie do tej sugestii: próbowałem tak, jak sugerowaliście ty i inni - ale okazało się, że znalazłem dwa
<title>
tagi w kodzie źródłowym. Pierwszy miał tytuł standardowy , drugi tytuł zmodyfikowany . Ale (oczywiście) na pasku tytułu przeglądarki widziałem tylko domyślny tytuł.Następnie sprawdziłem
header.php
motyw nadrzędny, którego użyłem (dwadzieścia cztery) i<title>
znacznik był rzeczywiście zakodowany na stałe w tym szablonie w następujący sposób:Po jego usunięciu dodałem następujący kod do motywu podrzędnego
functions.php
i zadziałało:Zasadniczo działało to także przed usunięciem
<title>
znacznika z szablonu - tyle, że były wtedy dwa<title>
znaczniki, z których później zignorowano. Czy to może być ten sam problem z Twoim motywem?Jednak od wp 4.4.0
<title>
znacznik jest tworzony dynamicznie przez funkcję,_wp_render_title_tag()
która w zasadzie wywołuje inną funkcjęwp_get_document_title()
i otacza znaczniki html wokół wyniku. Krótko mówiąc: jeśli w twoim motywieheader.php
brakuje<title>
tagu, istnieje szansa, że możesz zastąpić tytuł bezpośrednio przezpre_get_document_title
lub wdocument_title_parts
sposób opisany tutaj :1) zmień tytuł bezpośrednio:
2) filtrowanie części tytułowych:
źródło
Po przeczytaniu posta od góry do dołu i od dołu do góry, najprawdopodobniej masz filtr, który przepuszcza tytuł przez
pre_get_document_title
filtr. Wskazówka tutaj następujące oświadczenie:Patrząc na kod soure
wp_get_document_title()
, widzimy następujący kod:Oznacza to, że za każdym razem, gdy nieprzezroczysta wartość przechodzi przez
pre_get_document_title
filtr,wp_get_document_title()
funkcja zwróci dowolną wartość, która została przekazana przezpre_get_document_title
filtr. W takim przypadkudocument_title_separator
filtr idocument_title_parts
filtr nigdy nie zostaną wykonane, ponieważ działają one tylko popre_get_document_title
filtrze.Patrząc na to, co powiedziałeś nieco dalej:
na pewno masz
pre_get_document_title
filtr z uprawnieniami, który przesłania twoje wystąpienie tego samego filtra, a dzięki temu filtrowi funkcja zwraca cokolwiek, co jest do niego przekazywane, co powoduje, żedocument_title_parts
filtr nie jest wykonywany.Musisz tylko użyć albo
grep
dobrego edytora i przeszukać caływp-content
folder w poszukiwaniu tegopre_get_document_title
filtra. Po zlokalizowaniu tego filtra możesz go zabrać, aby go usunąć i zastąpić własnymźródło
document_title_parts
lubpre_get_document_title
zwraca 0 wyników. Używam SublimeText 2 do przeszukiwania całej zawartości wp ...pre_get_document_title
, co całkowicie tłumaczyłoby, dlaczego drugi filtr nie zadziałał. To powoduje, żepre_get_document_title
filtr jest pusty, co oznacza, że pozostałe dwa filtry w funkcji muszą odpalić, ale nie. Pozostawia mi to do zawarcia skorumpowanego rdzenia Wordpress.Jeśli motyw nadrzędny nie deklaruje wsparcia
title-tag
, możesz to zrobić w ten sposób w motywie potomnymFiltruj
document_title_parts
tablicę typów oczekiwanych zwrotów, w ten sposób, pamiętaj, aby zmienić warunek if zgodnie ze swoimi wymaganiami lub całkowicie go usunąć, aby zmienić tytuł w całej witrynie tylko w celu przetestowania, czy działa.Czy możesz wypróbować te dwie funkcje?
źródło
add_theme_support_child
jest zalogowany.