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
aus header.php
, wird der eigentliche Site-Titel immer noch in der Quelle header.php
.
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.
Im Fall von Yoast war es ein Filteraufruf zu pre_get_document_title
, der nicht leer ist. In diesem Fall ist wp_get_document_title
kurzgeschlossen und der Rest der function, einschließlich des Filters documents_title_parts
, wird nicht ausgewertet, wie Sie in den ersten Codezeilen sehen können:
$title = apply_filters( 'pre_get_document_title', '' ); if ( ! empty( $title ) ) { return $title; }
Also, ich nahm Ihren Filter und änderte den Haken zu pre_get_document_title
. 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:
add_filter( 'pre_get_document_title', function( $title ) { error_log('here'); return $title; }, 999, 1 );
Nach einigen Experimenten kam ich zu folgendem Vorschlag: header.php
es sein, dass das
-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 Seitepre_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?