Problèmes avec title-tag et document_title_parts

12

Wordpress version 4.5.1

J'essaie de mettre à jour dynamiquement les titres de page sur un modèle particulier. Après avoir beaucoup creusé et appris les wp_title()changements, j'essaie d'utiliser document_title_parts. Cependant, je n'arrive pas du tout à 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 du support de thème comme indiqué ci-dessus, mais en regardant mon journal, rien n'apparaît lors du rechargement de la page. Cela error_logfonctionnait avec d'autres fonctions (telles que wp_title), donc la journalisation des erreurs fonctionne.

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

Donc! J'utilise le filtre de manière incorrecte, je n'ai pas correctement configuré mon thème ou autre chose que je ne connais pas Toute aide serait grandement appréciée!

modifier pour ajouter plus de détails

Tentative d'une fonction init, mais cela ne fonctionne pas non plus: https://gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4

De plus, alors que j'ai supprimé toute référence à <title>partir header.php, le titre du site actuel montre encore dans la source.

accroché
la source
Pourquoi avez-vous commenté cette ligne //add_filter("after_setup_theme", function(){ add_theme_support("title-tag"); });? C'est une utilisation correcte de l'ajout d'un support de thème.
Sumit
@Sumit J'ai essayé à la fois la version commentée et la version active.
hookedonwinter
Essayez peut-être d'ajouter une add_theme_support()fonction dans un hook init . Une autre chose est de vous assurer que vous écrasez votre header.phpfichier pour ne pas avoir de <title>balise html .
Howdy_McGee
@Howdy_McGee Je viens d'essayer ça, toujours rien. gist.github.com/anonymous/6db5af892a4cf4fb029655167d7002a4
hookedonwinter
@hookedonwinter Et vous êtes sûr qu'il n'y a pas de <title>balises dans votre header.php? Essayez peut-être de remplacer 10par PHP_MAX_INT. En outre, le paramètre transmis est un tableau au lieu d'une valeur de chaîne.
Howdy_McGee

Réponses:

13

J'ai exécuté votre filtre dans ma zone de développement. Ça n'a pas marché. Ensuite, j'ai désactivé le plugin Yoast SEO, que je savais également jouer avec le titre de la page. Ensuite, cela a fonctionné. Donc, ma suggestion serait qu'un autre plugin joue avec.

Dans le cas de Yoast, c'était un appel de filtre pour pre_get_document_titleretourner non vide. Dans ce cas, il wp_get_document_titleest court-circuité et le reste de la fonction, y compris le documents_title_partsfiltre, n'est pas évalué, comme vous pouvez le voir dans les premières lignes de code:

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

J'ai donc pris votre filtre et changé le crochet en pre_get_document_title. Ça n'a pas marché. Ensuite, j'ai changé la priorité à un niveau plus élevé que le même filtre dans Yoast. Ensuite, cela a fonctionné. Donc, je ne connais pas 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 );
cjbj
la source
1
Tu l'as eu! J'ai trouvé la même chose et désactivé Yoast. Je viens de réactiver et utilisé votre priorité et cela a fonctionné. MERCI!
hookedonwinter
Un peu plus sur les crochets ici: wordpress.stackexchange.com/questions/109869/…
cjbj
Depuis mon site, la pre_get_document_titlepriorité 15 suffit.
vee
7

Après quelques essais, je suis arrivé à la suggestion suivante: se pourrait-il que la <title>balise soit "codée en dur" dans le thème de votre parent header.php? Si tel est le cas, vous pouvez essayer de supprimer la <title>balise de votre thème enfant header.php(copiez vos parents header.phpdans votre dossier de thème enfant), puis rajoutez la prise en charge du thème via 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'ont suggéré - mais il s'est avéré que j'ai trouvé deux <title>balises 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.phpthème parent que j'ai utilisé (vingt-quatorze) et la <title>balise était en effet codée en dur à l'intérieur de ce modèle comme ceci:

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

Après l'avoir supprimé, j'ai ajouté le code suivant au thème enfant functions.phpet 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, cela a également fonctionné avant de supprimer la <title>balise du modèle - seulement qu'il y avait alors deux <title> balises dont la dernière a été ignorée. Serait-ce le même problème avec votre thème?

Depuis wp 4.4.0, cependant, la <title>balise est créée dynamiquement par la fonction _wp_render_title_tag()qui appelle essentiellement une autre fonction wp_get_document_title()et enveloppe les balises html autour du résultat. Pour faire court: si votre thème ne header.phpcontient pas de <title>balise, il est probable que vous pouvez remplacer le titre directement via pre_get_document_titleou document_title_partscomme décrit ici :

1) changez directement le titre:

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');
}
tillinberlin
la source
3

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 pre_get_document_titlefiltre. L'indice ici la déclaration suivante:

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

En regardant le code soure pourwp_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 à travers le pre_get_document_titlefiltre, la wp_get_document_title()fonction renvoie la valeur qui a été transmise via le pre_get_document_titlefiltre. Dans ce cas, le document_title_separatorfiltre et le document_title_partsfiltre ne seront jamais exécutés car ils ne s'exécutent qu'après le pre_get_document_titlefiltre.

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

... même si je ne parviens pas à faire changer le titre.

vous avez certainement un pre_get_document_titlefiltre avec autorité qui remplace votre instance du même filtre, et à cause de ce filtre, la fonction retourne tout ce qui lui est transmis, ce qui entraîne que votre document_title_partsfiltre n'est pas exécuté.

Ce que vous devrez faire est d'utiliser soit grepun bon éditeur soit de rechercher wp-contentce pre_get_document_titlefiltre dans votre dossier entier . Une fois que vous avez localisé ce filtre, vous pouvez le retirer de là pour le retirer et le remplacer par le vôtre

Pieter Goosen
la source
Merci d'avoir répondu! Malheureusement, la recherche de tout le contenu wp document_title_partsou pre_get_document_titlerenvoie 0 résultats. J'utilise SublimeText 2 pour rechercher tout le contenu wp ...
hookedonwinter
Cela me bat vraiment. Il est vraiment étrange qu'un filtre dans une fonction se déclenche correctement et le filtre après cela ne le fait pas. Essayez d'effacer tous les caches et de rétablir WordPress si vous êtes sûr qu'il ne s'agit pas d'un plugin ou de votre thème. Que se passe-t-il sur une installation vanilla avec un thème groupé, que se passe-t-il si vous modifiez directement le thème parent. C'est malheureusement autant que je peux aider avec les informations données. Si vous avez des informations supplémentaires, déposez une modification afin que nous puissions vous aider à résoudre ce problème
Pieter Goosen
@PieterGoosen Lorsque le premier filtre revient non vide, la fonction est court-circuitée et le deuxième filtre n'est pas évalué.
cjbj
@cjbj oui, correct, c'est ce que j'ai dit dans ma réponse, le problème est quoi. Comme l'OP l'a dit, il ne trouve pas de filtre pre_get_document_title, ce qui aurait totalement expliqué pourquoi le deuxième filtre ne se déclencherait pas. Cela laisse le pre_get_document_titlefiltre vide, ce qui signifie que les deux autres filtres de la fonction doivent se déclencher, mais ils ne le font pas. Cela me laisse pour conclure un noyau Wordpress corrompu.
Pieter Goosen
Sauf que j'ai réussi à faire fonctionner ce filtre facilement.
cjbj
2

Si le thème parent ne déclare pas de prise en charge, title-tagvous 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 );

Filtrez le document_title_partstableau de type de retour attendu, comme ceci, assurez-vous de changer la condition if selon vos besoins, ou supprimez-le complètement pour changer le titre sur tout le site juste 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?

Nikhil Chavan
la source
Merci d'avoir répondu. Je l'ai essayé, supprimant l'instruction if pour la rendre plus large, et j'ai ajouté une journalisation des erreurs pour voir ce qui se passe. Voici le code. . Seul add_theme_support_childest enregistré.
hookedonwinter