Problemy z tagiem tytułu i dokumentem_tekstu


12

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_logto 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.


Dlaczego skomentowałeś ten wiersz //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? Poprawne użycie dodawania obsługi motywów.
Sumit

@Sumit Próbowałem zarówno wersji skomentowanej, jak i wersji aktywnej.
hookedonwinter

Może spróbuj dodać add_theme_support()funkcję w haku inicjującym . Inną sprawą jest upewnienie się, że nadpisujesz header.phpplik, aby nie mieć <title>tagu HTML .
Howdy_McGee

@Howdy_McGee Właśnie tego spróbowałem, wciąż nic. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter

@hookedonwinter I jesteś pewien, że nie masz żadnych <title>tagów header.php? Może spróbuj wymienić 10z PHP_MAX_INT. Ponadto przekazany parametr jest tablicą zamiast wartości ciągu.
Howdy_McGee

Odpowiedzi:


13

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_titlezwracające niepuste. W takim przypadku wp_get_document_titlenastępuje zwarcie, a reszta funkcji, w tym documents_title_partsfiltr, nie jest analizowana, jak widać z pierwszych wierszy kodu:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
    }

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ł:

add_filter( 'pre_get_document_title', function( $title )
  {
    error_log('here');
    return $title;
  }, 999, 1 );

1
Masz to! Znalazłem to samo i dezaktywowałem Yoast. Właśnie reaktywowałem i wykorzystałem twój priorytet i zadziałało. DZIĘKUJĘ CI!
hookedonwinter

Trochę więcej na temat haków tutaj: wordpress.stackexchange.com/questions/109869/…
cjbj

Z mojej strony wystarczy 15pre_get_document_title priorytet .
vee

7

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 rodzica header.php? W takim przypadku możesz spróbować usunąć <title>znacznik z motywu podrzędnego header.php(skopiuj rodzic header.phpdo folderu motywu podrzędnego), a następnie dodaj obsługę motywu z powrotem poprzez functions.php:

add_theme_support( 'title-tag' );

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.phpmotyw 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:

<title><?php wp_title( '|', true, 'right' ); ?></title>

Po jego usunięciu dodałem następujący kod do motywu podrzędnego functions.phpi zadziałało:

/**
 * Theme support added
 */

function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );


/**
 * Change the title of a page
 * 
 */

function change_title_for_a_template( $title ) {

// Check if current page template is 'template-homepage.php'
// if ( is_page_template( 'template-homepage.php' ) ) {

    // change title parts here
    $title['title'] = 'My Title'; 
    $title['tagline'] = 'My fancy tagline'; // optional
    $title['site'] = 'example.org'; //optional

// }

return $title; 

}

add_filter( 'document_title_parts', 'change_title_for_a_template', 10, 1 );

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 motywie header.phpbrakuje <title>tagu, istnieje szansa, że ​​możesz zastąpić tytuł bezpośrednio przez pre_get_document_titlelub w document_title_partssposób opisany tutaj :

1) zmień tytuł bezpośrednio:

add_filter('pre_get_document_title', 'change_the_title');
function change_the_title() {
    return 'The expected title';
}

2) filtrowanie części tytułowych:

add_filter('document_title_parts', 'filter_title_part');
function filter_title_part($title) {
    return array('a', 'b', 'c');
}

3

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_titlefiltr. Wskazówka tutaj następujące oświadczenie:

Próbowałem również pre_get_document_title, który uruchamia się przy ładowaniu strony,

Patrząc na kod sourewp_get_document_title() , widzimy następujący kod:

$title = apply_filters( 'pre_get_document_title', '' );
if ( ! empty( $title ) ) {
    return $title;
}

Oznacza to, że za każdym razem, gdy nieprzezroczysta wartość przechodzi przez pre_get_document_titlefiltr, wp_get_document_title()funkcja zwróci dowolną wartość, która została przekazana przez pre_get_document_titlefiltr. W takim przypadku document_title_separatorfiltr i document_title_partsfiltr nigdy nie zostaną wykonane, ponieważ działają one tylko po pre_get_document_titlefiltrze.

Patrząc na to, co powiedziałeś nieco dalej:

... chociaż nie jestem w stanie zmusić go do zmiany tytułu.

na pewno masz pre_get_document_titlefiltr 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, że document_title_partsfiltr nie jest wykonywany.

Musisz tylko użyć albo grepdobrego edytora i przeszukać cały wp-contentfolder w poszukiwaniu tego pre_get_document_titlefiltra. Po zlokalizowaniu tego filtra możesz go zabrać, aby go usunąć i zastąpić własnym


Dziękuję za odpowiedź! Niestety, przeszukiwanie całej zawartości wp document_title_partslub pre_get_document_titlezwraca 0 wyników. Używam SublimeText 2 do przeszukiwania całej zawartości wp ...
hookedonwinter 30.06.16

To mnie naprawdę bije. To naprawdę dziwne, że jeden filtr w funkcji odpala poprawnie, a potem filtr nie działa. Spróbuj wyczyścić wszystkie pamięci podręczne i ponownie zainstaluj WordPress, jeśli masz pewność, że nie jest to wtyczka ani motyw. Co dzieje się w instalacji waniliowej z dołączonym motywem, co się stanie, jeśli bezpośrednio zmienisz motyw nadrzędny. Jest to niestety, o ile mogę pomóc z podanymi informacjami. Jeśli masz dodatkowe informacje, prześlij edycję , abyśmy mogli pomóc Ci w rozwiązaniu tego problemu
Pieter Goosen

@PieterGoosen Gdy pierwszy filtr powróci jako pusty, funkcja jest zwarta i drugi filtr nie jest analizowany.
cjbj

@cjbj tak, poprawne, tak powiedziałem w mojej odpowiedzi, chodzi o to, co. Jak powiedział PO, nie może znaleźć włączonego filtra pre_get_document_title, co całkowicie tłumaczyłoby, dlaczego drugi filtr nie zadziałał. To powoduje, że pre_get_document_titlefiltr jest pusty, co oznacza, że ​​pozostałe dwa filtry w funkcji muszą odpalić, ale nie. Pozostawia mi to do zawarcia skorumpowanego rdzenia Wordpress.
Pieter Goosen

Tyle że mam ten filtr, który łatwo działa.
cjbj

2

Jeśli motyw nadrzędny nie deklaruje wsparcia title-tag, możesz to zrobić w ten sposób w motywie potomnym

/**
 * Theme support should be added on `after_setup_theme`
 */
function add_theme_support_child() {

    add_theme_support( 'title-tag' );

}

add_action( 'after_setup_theme', 'add_theme_support_child', 11 );

Filtruj document_title_partstablicę 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.

/**
 * Change title of a page conditionally
 * 
 * @return $title - type array
 * $title['title'] - Page Title
 * $title['tagline'] - Site Tagline
 */
function change_title_for_a_template( $title ) {

    // Check if current page template is 'template-homepage.php'
    if ( is_page_template( 'template-homepage.php' ) ) {
        $title['title'] = 'Changed title for a template';
    }

    return $title;

}

add_filter( 'document_title_parts', 'change_title_for_a_template' );

Czy możesz wypróbować te dwie funkcje?


Dziękuję za odpowiedź. Wypróbowałem to, usuwając instrukcję if, aby była szersza, i dodałem trochę rejestrowania błędów, aby zobaczyć, co jest grane. Oto kod. . Tylko add_theme_support_childjest zalogowany.
hookedonwinter
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.