Probleme mit title-tag und document_title_parts

WordPress version 4.5.1

Ich versuche, Seitentitel für eine bestimmte Vorlage dynamisch zu aktualisieren. Nachdem ich viel über die Änderungen von wp_title() gegraben und gelernt habe, versuche ich document_title_parts zu verwenden. Allerdings kann ich den Filter überhaupt nicht ausführen.

Ich bin in einem Kind Thema, 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 Theme-Unterstützung ausprobiert, wie oben gezeigt, aber wenn ich mein Logbuch anschaue, erscheint nichts beim Neuladen der Seite. Das error_log arbeitete mit anderen functionen (wie wp_title ), so dass die Fehlerprotokollierung funktioniert.

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

Damit! Ich verwende entweder den Filter falsch, habe mein Thema nicht richtig eingerichtet oder etwas anderes, das mir nicht bekannt ist. Jede Hilfe würde sehr geschätzt werden!

Bearbeiten, um weitere Details hinzuzufügen

Eine init-function versuchen, aber das funktioniert auch nicht: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

Auch wenn ich einen Verweis auf </code> aus <code>header.php</code> , wird der eigentliche Site-Titel immer noch in der Quelle <code>header.php</code> . </p> <h4>Solutions Collecting From Web of "Probleme mit title-tag und document_title_parts"</h4> <div class="list-group list-group-flush"> <ul> <li><a href="http://de.wordpressask.com/wordpress-i18n-freundlich-preg_replace-beitrag-titel.html" rel="bookmark" title="WordPress i18n-freundlich preg_replace Beitrag Titel">WordPress i18n-freundlich preg_replace Beitrag Titel</a></li> <li><a href="http://de.wordpressask.com/titelseite-zeigt-andere-als-alle-anderen-seiten-an.html" rel="bookmark" title="Titelseite zeigt andere als alle anderen Seiten an?">Titelseite zeigt andere als alle anderen Seiten an?</a></li> <li><a href="http://de.wordpressask.com/uberprufen-sie-ob-das-tag-fur-posts-verwendet-wird.html" rel="bookmark" title="Überprüfen Sie, ob das Tag für Posts verwendet wird">Überprüfen Sie, ob das Tag für Posts verwendet wird</a></li> <li><a href="http://de.wordpressask.com/add_theme_support-title-tag-im-konflikt-mit-der-benutzerdefinierten-titelfunktion.html" rel="bookmark" title="add_theme_support ('title-tag') im Konflikt mit der benutzerdefinierten Titelfunktion">add_theme_support ('title-tag') im Konflikt mit der benutzerdefinierten Titelfunktion</a></li> <li><a href="http://de.wordpressask.com/fill-post-titel-aus-post-inhalt.html" rel="bookmark" title="Fill post Titel aus Post-Inhalt?">Fill post Titel aus Post-Inhalt?</a></li> <li><a href="http://de.wordpressask.com/wie-kann-ich-5-letzten-beitrag-titel-mit-entsprechenden-link.html" rel="bookmark" title="Wie kann ich 5 letzten Beitrag Titel mit entsprechenden Link?">Wie kann ich 5 letzten Beitrag Titel mit entsprechenden Link?</a></li> <li><a href="http://de.wordpressask.com/andern-der-farbe-des-posttitels.html" rel="bookmark" title="Ändern der Farbe des Posttitels">Ändern der Farbe des Posttitels</a></li> <li><a href="http://de.wordpressask.com/erhalten-sie-alle-kindertitel-einer-seite-als-link-zu-ihnen.html" rel="bookmark" title="Erhalten Sie alle Kindertitel einer Seite als Link zu ihnen">Erhalten Sie alle Kindertitel einer Seite als Link zu ihnen</a></li> </ul> <!-- You can start editing here. --> <div class="list-group-item list-group-item-action flex-column align-items-start"> <p> Ich habe deinen Filter in meinem Entwicklungsbereich ausgeführt. Es hat nicht funktioniert. Dann habe ich das SEO-Plugin von Yoast abgeschaltet, von dem ich wusste, dass es auch mit dem Seitentitel zu tun hat. Dann hat es geklappt. Also mein Vorschlag wäre ein anderes Plugin, das damit rumhängt. </p> <p> Im Fall von Yoast war es ein Filteraufruf zu <code>pre_get_document_title</code> , der nicht leer ist. In diesem Fall ist <code>wp_get_document_title</code> kurzgeschlossen und der Rest der function, einschließlich des Filters <code>documents_title_parts</code> , wird nicht ausgewertet, wie Sie in den ersten Codezeilen sehen können: </p> <pre> <code>$title = apply_filters( 'pre_get_document_title', '' ); if ( ! empty( $title ) ) { return $title; }</code> </pre> <p> Also, ich nahm Ihren Filter und änderte den Haken zu <code>pre_get_document_title</code> . Es hat nicht funktioniert. Dann habe ich die Priorität auf eine höhere Ebene als der gleiche Filter in Yoast geändert. Dann hat es geklappt. Also, ich weiß nicht, wie es aufgebaut ist, aber ich schlage vor, dass Sie es versuchen: </p> <pre> <code>add_filter( 'pre_get_document_title', function( $title ) { error_log('here'); return $title; }, 999, 1 );</code> </pre> </div> </li><!-- #comment-## --> <div class="list-group-item list-group-item-action flex-column align-items-start"> <p> Nach einigen Experimenten kam ich zu folgendem Vorschlag: <code>header.php</code> es sein, dass das <code><title> -Tag in der header.php des übergeordneten Themas fest header.php ? Wenn dies der Fall ist, könnten Sie versuchen, das -Tag aus der header.php Ihres header.php Themas zu header.php (kopieren Sie die header.php Ihres header.php in Ihren header.php Theme-Ordner) und fügen Sie dann die Theme-Unterstützung durch die functions.php :

 add_theme_support( 'title-tag' ); 

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

Ich überprüfte dann die header.php des übergeordneten Themas, das ich verwendet habe (twentyfourteen) und das -Tag war in der Tat fest in dieser Vorlage codiert:

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

Nachdem ich es entfernt habe, fügte ich dem functions.php des untergeordneten Themas den folgenden Code hinzu und 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 auch, bevor das -Tag aus der Vorlage entfernt wurde – nur dass es dann zwei -Tags gab, von denen das spätere ignoriert wurde. Könnte das das gleiche Problem mit deinem Thema sein?

Seit wp 4.4.0 wird das -Tag jedoch dynamisch von der function _wp_render_title_tag() die im Grunde eine andere function wp_get_document_title() und die html-Tags um das Ergebnis herum wp_get_document_title() . Lange header.php kurzer header.php : Wenn in der header.php Ihres Themes das -Tag fehlt, besteht die Möglichkeit, dass Sie den Titel direkt über pre_get_document_title oder document_title_parts überschreiben können, wie hier beschrieben:

1) ändere den Titel direkt:

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

2) Filtern der Titel Teile:

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

Nachdem Sie Ihren Beitrag von oben nach unten und von unten nach oben gelesen haben, haben Sie in aller Wahrscheinlichkeit einen Filter, der einen Titel durch den pre_get_document_title Filter pre_get_document_title . Der Hinweis hier die folgende Aussage:

Ich habe auch pre_get_document_title versucht, das beim Laden der Seite pre_get_document_title wird,

Wenn wir uns den Quellcode für wp_get_document_title() , sehen wir folgenden Code:

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

Dies bedeutet, dass, wenn ein nicht leerer Wert den Filter wp_get_document_title() pre_get_document_title , die function wp_get_document_title() Wert pre_get_document_title , der über den Filter pre_get_document_title . In diesem Fall werden der document_title_separator Filter und der document_title_parts Filter niemals ausgeführt, da diese nur nach dem pre_get_document_title Filter ausgeführt werden.

Schauen Sie, was Sie ein bisschen weiter gesagt haben:

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

Sie haben definitiv einen pre_get_document_title Filter mit Berechtigung, der Ihre Instanz des gleichen Filters überschreibt, und aufgrund dieses Filters gibt die function zurück, was an sie übergeben wird, was dazu führt, dass Ihr document_title_parts Filter nicht ausgeführt wird.

Was Sie tun müssen, ist entweder grep oder ein guter Editor und durchsuchen Sie Ihren gesamten wp-content Ordner für diesen pre_get_document_title Filter. Sobald Sie diesen Filter gefunden haben, können Sie ihn von dort entfernen, um diesen Filter zu entfernen und ihn durch Ihren eigenen zu ersetzen

Wenn das übergeordnete Thema keine Unterstützung für title-tag angibt, können Sie dies im untergeordneten Thema 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 document_title_parts erwartete Rückgabetyp-Array. Achten Sie darauf, die if-Bedingung gemäß Ihren Anforderungen zu ändern, oder entfernen Sie sie vollständig, um den Titel auf der gesamten Site zu ändern, nur um zu testen, ob er 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 functionen ausprobieren?