it-swarm.com.de

Probleme mit title-tag und document_title_parts

Wordpress version 4.5.1

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

Ich bin in einem untergeordneten 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 Themenunterstützung ausprobiert, wie oben gezeigt, aber in meinem Protokoll wird beim Neuladen der Seite nichts angezeigt. Dieser error_log hat mit anderen Funktionen (z. B. wp_title) zusammengearbeitet, sodass die Fehlerprotokollierung funktioniert.

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

So! Entweder verwende ich 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

Versuch einer Init-Funktion, aber das funktioniert auch nicht: https://Gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

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

11
hookedonwinter

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

Im Fall von Yoast war es ein Filteraufruf an pre_get_document_title, der nicht leer zurückgab. In diesem Fall wird wp_get_document_title kurzgeschlossen und der Rest der Funktion, einschließlich des Filters documents_title_parts, wird nicht ausgewertet, wie Sie anhand der ersten Codezeilen sehen können:

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

Also habe ich Ihren Filter genommen und den Haken in pre_get_document_title geändert. Es hat nicht funktioniert. Dann habe ich die Priorität in Yoast auf eine höhere Stufe als den gleichen Filter geändert. Dann hat es geklappt. Also, ich weiß nichts über dein Setup, aber ich schlage vor, du probierst es mal aus:

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

Nach einigem Experimentieren kam ich zu dem folgenden Vorschlag: Könnte es sein, dass das <title>-Tag im header.php Ihres Eltern-Themas "fest codiert" ist? Wenn dies der Fall ist, können Sie versuchen, den <title>-Tag aus dem header.php Ihres untergeordneten Themas zu entfernen (kopieren Sie den header.php Ihres übergeordneten Themas in Ihren untergeordneten Themenordner) und fügen Sie die Themenunterstützung über den functions.php wieder hinzu:

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 modifizierter Titel. Aber (natürlich) in der Browser-Titelleiste konnte ich nur den Standardtitel sehen.

Ich habe dann den header.php des von mir verwendeten übergeordneten Themas (vierundzwanzig) überprüft 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 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 hat also grundsätzlich auch vor dem Entfernen des <title> -Tags aus der Vorlage funktioniert - nur dass es dann 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 Tag <title> jedoch dynamisch erstellt durch die Funktion _wp_render_title_tag(), die im Grunde eine andere Funktion wp_get_document_title() aufruft und die HTML-Tags um das Ergebnis herum schreibt. Um es kurz zu machen: Wenn der header.php Ihres Themas den <title> Tag nicht enthält, besteht die Möglichkeit, dass Sie den Titel direkt durch pre_get_document_title oder document_title_parts überschreiben können, wie beschrieben hier :

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

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

Nachdem Sie Ihren Beitrag von oben nach unten und von unten nach oben gelesen haben, haben Sie wahrscheinlich einen Filter, der einen Titel durch den pre_get_document_title-Filter leitet. Der Anhaltspunkt hierfür ist die folgende Aussage:

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

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

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

Dies bedeutet, dass die Funktion wp_get_document_title() immer dann, wenn ein nicht leerer Wert den Filter pre_get_document_title passiert, den Wert zurückgibt, der über den Filter pre_get_document_title übergeben wurde. In diesem Fall werden der document_title_separator-Filter und der document_title_parts-Filter niemals ausgeführt, da diese erst nach dem pre_get_document_title-Filter ausgeführt werden.

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

... obwohl ich nicht in der Lage bin, den Titel zu ändern.

sie haben definitiv einen pre_get_document_title-Filter mit Berechtigung, der Ihre Instanz desselben Filters überschreibt. Aufgrund dieses Filters gibt die Funktion alles zurück, was an ihn übergeben wird, was dazu führt, dass Ihr document_title_parts-Filter nicht ausgeführt wird.

Sie müssen dazu entweder grep oder einen guten Editor verwenden und Ihren gesamten wp-content-Ordner nach diesem pre_get_document_title-Filter durchsuchen. Sobald Sie diesen Filter gefunden haben, können Sie ihn von dort entnehmen, um ihn zu entfernen und durch Ihren eigenen Filter zu ersetzen

3
Pieter Goosen

Wenn das übergeordnete Design keine Unterstützung für title-tag deklariert, können Sie dies auch im untergeordneten Design 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 Array mit dem erwarteten Rückgabetyp document_title_parts, und achten Sie darauf, die if-Bedingung gemäß Ihren Anforderungen zu ändern, oder entfernen Sie es 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 Funktionen ausprobieren?

2
Nikhil Chavan