Probleme mit title-tag und document_title_parts


12

Wordpress version 4.5.1

Ich versuche, Seitentitel für eine bestimmte Vorlage dynamisch zu aktualisieren. Nachdem wp_title()ich viel gegraben und etwas über die Änderungen gelernt habe, versuche ich sie zu verwenden document_title_parts. Ich kann den Filter jedoch überhaupt nicht zum Laufen bringen.

Ich bin in einem Kinderthema , 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 );

Ich habe beide Varianten des Hinzufügens von Themenunterstützung wie oben gezeigt ausprobiert, aber beim Betrachten meines Protokolls wird beim erneuten Laden der Seite nichts angezeigt. Das error_logfunktionierte mit anderen Funktionen (z. B. wp_title), sodass die Fehlerprotokollierung funktioniert.

Ich habe auch versucht pre_get_document_title, was beim Laden der Seite ausgelöst wird, obwohl ich nicht in der Lage bin, den Titel tatsächlich zu ändern.

So! Ich verwende entweder den Filter falsch, habe mein Thema nicht richtig eingerichtet oder etwas anderes, das mir nicht bekannt ist. Jede Hilfe wäre sehr dankbar!

Bearbeiten, um weitere Details hinzuzufügen

Der Versuch einer Init-Funktion funktioniert aber auch nicht: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

Auch wenn ich einen Verweis auf <title>von entfernt habe header.php, wird der tatsächliche Site-Titel immer noch in der Quelle angezeigt.


Warum haben Sie diese Zeile //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });auskommentiert? Es ist richtig, Themenunterstützung hinzuzufügen.
Summe

@ Sumit Ich habe sowohl die auskommentierte als auch die aktive Version ausprobiert.
Hookedonwinter

Versuchen Sie vielleicht, eine add_theme_support()Funktion in einem Init-Hook hinzuzufügen . Eine andere Sache ist, sicherzustellen, dass Sie Ihre header.phpDatei überschreiben , um kein HTML- <title>Tag zu haben.
Howdy_McGee

@Howdy_McGee Hab das gerade versucht, immer noch nichts. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
Hookedonwinter

@hookedonwinter Und du bist sicher, dass es keine <title>Tags in deinem gibt header.php? Vielleicht versuchen Sie es 10durch PHP_MAX_INT. Außerdem ist der übergebene Parameter ein Array anstelle eines Zeichenfolgenwerts.
Howdy_McGee

Antworten:


13

Ich habe Ihren Filter in meinem Entwicklungsbereich ausgeführt. Es hat nicht funktioniert. Dann habe ich das Yoast SEO-Plugin ausgeschaltet, von dem ich wusste, dass es auch mit dem Seitentitel zu tun hat. Dann hat es funktioniert. Mein Vorschlag wäre also, dass ein anderes Plugin damit herumspielt.

Im Fall von Yoast war es ein Filteraufruf zur pre_get_document_titleRückgabe nicht leer. In diesem Fall wp_get_document_titleist der Kurzschluss kurz und der Rest der Funktion, einschließlich des documents_title_partsFilters, wird nicht ausgewertet, wie Sie aus den ersten Codezeilen ersehen können:

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

Also nahm ich Ihren Filter und wechselte den Haken zu pre_get_document_title. Es hat nicht funktioniert. Dann habe ich die Priorität auf eine höhere Stufe als der gleiche Filter in Yoast geändert. Dann hat es funktioniert. Ich weiß also nichts über Ihr Setup, aber ich schlage vor, Sie probieren es aus:

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

1
Du hast es! Ich fand das Gleiche und deaktivierte Yoast. Ich habe gerade Ihre Priorität reaktiviert und verwendet und es hat funktioniert. DANKE!
Hookedonwinter

Ein bisschen mehr über Hooks hier: wordpress.stackexchange.com/questions/109869/…
cjbj

Von meiner Seite reicht die pre_get_document_titlePriorität 15 aus.
Vee

6

Nach einigen Experimenten kam ich zu folgendem Vorschlag: Könnte es sein, dass das <title>Tag in Ihrem übergeordneten Thema "fest codiert" ist header.php? Wenn dies der Fall ist, können Sie versuchen, das <title>Tag aus dem untergeordneten Thema zu entfernen header.php(kopieren Sie das Ihrer Eltern header.phpin Ihren untergeordneten Themenordner) und dann die Themenunterstützung wieder über Folgendes hinzufügen functions.php:

add_theme_support( 'title-tag' );

Ich werde versuchen zu erklären, was mich zu diesem Vorschlag geführt hat: Ich habe es versucht, wie Sie und andere vorgeschlagen haben - aber es stellte sich heraus, dass ich zwei <title>Tags im Quellcode gefunden habe. Der erste hatte den Standardtitel , der zweite den modifizierten Titel . Aber (natürlich) in der Titelleiste des Browsers konnte ich nur den Standardtitel sehen.

Ich habe dann header.phpdas übergeordnete Thema überprüft, das ich verwendet habe (vierundzwanzig), und das <title>Tag war in der Tat in dieser Vorlage wie folgt fest codiert:

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

Nachdem ich es entfernt hatte, fügte ich dem untergeordneten Thema den folgenden Code hinzu functions.phpund es funktionierte:

/**
 * 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 );

Es funktionierte also im Grunde auch vor dem Entfernen des <title>Tags aus der Vorlage - nur dass es damals zwei <title> Tags gab, von denen das spätere ignoriert wurde. Könnte dies das gleiche Problem mit Ihrem Thema sein?

Seit wp 4.4.0 wird das <title>Tag jedoch dynamisch von der Funktion erstellt, _wp_render_title_tag()die grundsätzlich eine andere Funktion aufruft wp_get_document_title()und die HTML-Tags um das Ergebnis wickelt. Lange Rede, kurzer Sinn: Wenn Ihrem Thema header.phpdas <title>Tag fehlt , können Sie den Titel wahrscheinlich direkt durch pre_get_document_titleoder document_title_partswie hier beschrieben überschreiben :

1) Ändern Sie den Titel direkt:

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

2) Filtern der Titelteile:

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

3

Nachdem Sie Ihren Beitrag von oben nach unten und von unten nach oben gelesen haben, haben Sie höchstwahrscheinlich einen Filter, der einen Titel durch den pre_get_document_titleFilter leitet . Der Hinweis hier die folgende Aussage:

Ich habe auch versucht pre_get_document_title, was beim Laden der Seite ausgelöst wird,

Wenn wir uns den Soure-Code für ansehenwp_get_document_title() , sehen wir den folgenden Code:

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

Dies bedeutet pre_get_document_title, dass die wp_get_document_title()Funktion immer dann, wenn ein nicht leerer Wert durch den Filter geleitet wird, den Wert zurückgibt, der über den pre_get_document_titleFilter übergeben wurde. In diesem Fall werden der document_title_separatorFilter und der document_title_partsFilter niemals ausgeführt, da diese nur nach dem pre_get_document_titleFilter ausgeführt werden.

Schauen Sie sich an, was Sie etwas weiter gesagt haben:

... obwohl ich es nicht schaffen kann, den Titel tatsächlich zu ändern.

Sie haben definitiv einen pre_get_document_titleFilter mit Berechtigung, der Ihre Instanz desselben Filters überschreibt, und aufgrund dieses Filters gibt die Funktion alles zurück, was an ihn übergeben wird, was dazu führt, dass Ihr document_title_partsFilter nicht ausgeführt wird.

Sie müssen entweder einen grepoder einen guten Editor verwenden und Ihren gesamten wp-contentOrdner nach diesem pre_get_document_titleFilter durchsuchen . Sobald Sie diesen Filter gefunden haben, können Sie ihn von dort entfernen und durch Ihren eigenen ersetzen


Danke für die Antwort! Leider werden beim Durchsuchen des gesamten wp-Inhalts 0 Ergebnisse zurückgegeben document_title_partsoder pre_get_document_titlezurückgegeben. Ich benutze SublimeText 2, um den gesamten wp-Inhalt zu durchsuchen ...
hookedonwinter

Das schlägt mich wirklich. Es ist wirklich seltsam, dass ein Filter in einer Funktion korrekt ausgelöst wird und der Filter danach nicht. Löschen Sie alle Caches und installieren Sie WordPress neu, wenn Sie sicher sind, dass es sich nicht um ein Plugin oder Ihr Thema handelt. Was passiert bei einer Vanille-Installation mit einem gebündelten Thema? Was passiert, wenn Sie das übergeordnete Thema direkt ändern? Dies ist leider soweit ich mit den angegebenen Informationen helfen kann. Wenn Sie zusätzliche Informationen haben, reichen Sie eine Bearbeitung ein , damit wir Sie bei der Lösung dieses
Problems

@PieterGoosen Wenn der erste Filter nicht leer ist, wird die Funktion kurzgeschlossen und der zweite Filter wird nicht ausgewertet.
cjbj

@cjbj ja, richtig, das habe ich in meiner Antwort gesagt, das Problem ist was. Wie der OP sagte, kann er keinen Filter finden pre_get_document_title, was völlig erklärt hätte, warum der zweite Filter nicht ausgelöst würde. Dadurch bleibt der pre_get_document_titleFilter leer, was bedeutet, dass die beiden anderen Filter in der Funktion ausgelöst werden müssen, dies jedoch nicht. Es lässt mich einen korrupten Wordpress-Kern schließen.
Pieter Goosen

Nur dass ich diesen Filter einfach zum Laufen gebracht habe.
cjbj

2

Wenn das übergeordnete Thema keine Unterstützung für deklariert title-tag, können Sie dies im untergeordneten Thema wie folgt tun

/**
 * 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 );

Filtern Sie das document_title_partsArray des erwarteten Rückgabetyps wie folgt. Stellen Sie sicher, dass Sie die if-Bedingung gemäß Ihren Anforderungen ändern, oder entfernen Sie sie vollständig, um den Titel auf der gesamten Site zu ändern, nur um zu testen, ob sie funktioniert.

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

Können Sie diese beiden Funktionen ausprobieren?


Danke für die Antwort. Ich habe es versucht, indem ich die if-Anweisung entfernt habe, um sie breiter zu gestalten, und ich habe eine Fehlerprotokollierung hinzugefügt, um zu sehen, was los ist. Hier ist der Code. . Nur add_theme_support_childwird protokolliert.
Hookedonwinter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.