web-dev-qa-db-fra.com

Problèmes avec title-tag et document_title_parts

Wordpress version 4.5.1

J'essaie de mettre à jour dynamiquement les titres de page sur un modèle particulier. Après beaucoup de recherches et d’apprentissage sur les modifications de wp_title(), j’essaie d’utiliser document_title_parts. Cependant, je ne parviens pas à faire fonctionner le filtre.

Je suis dans un thème enfant, 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 );

J'ai essayé les deux variantes d'ajout de prise en charge de thème, comme indiqué ci-dessus, mais en regardant mon journal, rien ne s'affiche lors du rechargement de la page. Ce error_log fonctionnait avec d'autres fonctions (telles que wp_title), de sorte que la journalisation des erreurs fonctionne.

J'ai aussi essayé pre_get_document_title, qui se déclenche au chargement de la page, bien que je ne sois pas capable de le faire changer le titre.

Alors! J'utilise mal le filtre, mon thème n'est pas correctement configuré ou autre chose que je ne connais pas. Toute aide serait grandement appréciée!

éditer pour ajouter plus de détails

Essayer une fonction init, mais cela ne marche pas non plus: https://Gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

En outre, bien que j'ai supprimé toute référence à <title> de header.php, le titre du site actuel est toujours affiché dans le code source.

11
hookedonwinter

J'ai couru votre filtre dans ma zone de développement. Ça n'a pas marché. Ensuite, j'ai désactivé le plug-in Yoast SEO, qui, je le savais, était aussi en train de jouer avec le titre de la page. Ensuite cela a fonctionné. Donc, ma suggestion serait qu'un autre plugin s'en mêle.

Dans le cas de Yoast, il s'agissait d'un appel de filtre à pre_get_document_title renvoyant non vide. Dans ce cas, wp_get_document_title est court-circuité et le reste de la fonction, y compris le filtre documents_title_parts, n'est pas évalué, comme le montrent les premières lignes de code:

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

Alors, j'ai pris votre filtre et changé le hook en pre_get_document_title. Ça n'a pas marché. Ensuite, j'ai changé la priorité à un niveau supérieur au même filtre dans Yoast. Ensuite cela a fonctionné. Donc, je ne sais pas à propos de votre configuration, mais je vous suggère de l'essayer:

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

Après quelques expériences, je suis arrivé à la suggestion suivante: se pourrait-il que la balise <title> soit "codée en dur" dans le header.php de votre thème parent? Si tel est le cas, vous pouvez essayer de supprimer la balise <title> du header.php de votre thème enfant (copiez le header.php de votre parent dans votre dossier de thème enfant), puis ajoutez le support de thème à travers le functions.php:

add_theme_support( 'title-tag' );

Je vais essayer d’expliquer ce qui m’a amené à cette suggestion: j’ai essayé comme vous et d’autres l’avez suggéré - mais il s’est avéré que j’ai trouvé deux balises <title>dans le code source. Le premier avait le titre standard, le second le titre modifié. Mais (bien sûr) dans la barre de titre du navigateur, je ne pouvais voir que le titre par défaut.

J'ai ensuite vérifié le header.php du thème parent que j'ai utilisé (vingt-quatorze) et la balise <title> était en effet codée de manière dure dans ce modèle, comme ceci:

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

Après l'avoir supprimé, j'ai ajouté le code suivant au functions.php du thème enfant et cela a fonctionné:

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

Donc, fondamentalement, cela fonctionnait également avant de supprimer la balise <title> du modèle - seulement qu'il y avait alors deux <title> dont la dernière était ignorée. Serait-ce le même problème avec votre thème?

Depuis wp 4.4.0, cependant, la balise <title> est créée dynamiquement par la fonction _wp_render_title_tag() qui appelle une autre fonction wp_get_document_title() et qui entoure les balises HTML autour du résultat. Longue histoire: si la balise header.php manque dans le <title> de votre thème, il est probable que vous puissiez remplacer le titre directement par pre_get_document_title ou document_title_parts comme décrit ici :

1) changer le titre directement:

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

2) filtrer les parties du titre:

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

Après avoir lu votre message de haut en bas et de bas en haut, vous avez probablement un filtre qui passe un titre à travers le filtre pre_get_document_title. L'indice ici la déclaration suivante:

J'ai aussi essayé pre_get_document_title, qui se déclenche au chargement de la page,

En regardant le code soure pour wp_get_document_title() , nous voyons le code suivant:

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

Cela signifie que, chaque fois qu'une valeur non vide passe par le filtre pre_get_document_title, la fonction wp_get_document_title() renvoie la valeur transmise via le filtre pre_get_document_title. Dans ce cas, le filtre document_title_separator et le filtre document_title_parts ne seront jamais exécutés car ils ne sont exécutés qu’après le filtre pre_get_document_title.

En regardant ce que vous avez dit un peu plus loin:

... Bien que je ne puisse pas le faire changer le titre.

vous avez certainement un filtre pre_get_document_title avec autorité qui redéfinit votre instance du même filtre et, à cause de ce filtre, la fonction renvoie tout ce qui lui est transmis, ce qui empêche votre filtre document_title_parts de ne pas être exécuté.

Ce que vous devrez faire est d’utiliser soit grep, soit un bon éditeur, et de rechercher dans tout votre dossier wp-content ce filtre pre_get_document_title. Une fois que vous avez localisé ce filtre, vous pouvez le prendre à partir de là pour le supprimer et le remplacer par le vôtre.

3
Pieter Goosen

Si le thème parent ne déclare pas la prise en charge de title-tag, vous pouvez le faire comme ceci dans le thème enfant.

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

Filtre document_title_parts tableau de type de retour attendu, comme celui-ci, veillez à modifier la condition if selon vos exigences ou supprimez-la complètement pour modifier le titre sur tout le site, uniquement pour tester si cela fonctionne.

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

Pouvez-vous essayer ces deux fonctions?

2
Nikhil Chavan