WordPress : Attribut personnalisé pour la balise de titre avec wp_title()

Publié par Jean-Michel le

Puis-je ajouter le itempropà l’ titleélément et toujours utiliser wp_head()et add_theme_support( "title-tag" )?

Je souhaite créer un thème et le faire approuver sur wordpres.org qui utilise des microdonnées.

Le précédent signifie que je veux que le code HTML se présente comme suit :

<html itemscope itemtype="http://schema.org/WebPage" lang="en-US">
....
        <title itemprop="name">WordPress Weblog Theme – Just another WordPress site</title>
....

Maintenant, je n’utilise pas add_theme_support( "title-tag" )et n’utilise pas le code suivant dans header.php ?

<title itemprop="name"><?php echo wp_get_document_title(); ?></title>
<?php wp_head(); ?>

Maintenant, le plugin de vérification de thème dit :

OBLIGATOIRE : Le thème doit avoir un appel à wp_title(), idéalement dans le fichier header.php. OBLIGATOIRE : Le thème doit avoir des balises, idéalement dans le fichier header.php. RECOMMANDÉ : Aucune référence à add_theme_support( « title-tag » ) n’a été trouvée dans le thème. Il est recommandé que le thème implémente cette fonctionnalité pour WordPress 4.1 et supérieur.

Solution n°1 trouvée

Malheureusement, l’écho de la <title>balise est actuellement câblé general-template.php(ligne 1062). C’est dans une fonction privée, ce qui signifie que vous ne pouvez pas la modifier ou l’annuler. Donc, pour le moment, vous ne pouvez pas modifier la balise. Vous voudrez peut-être émettre un trac pour leur demander de prendre en charge cela à l’avenir.

Solution n°2 trouvée

Étant donné que tout _wp_render_title_tagce qui se passe est de vérifier la prise en title-tagcharge du thème et d’envelopper les <title>balises, il n’y a vraiment aucune raison pour que votre implémentation existante « ne passe pas », puisque l’implémentation appropriée est déjà identique via :

<title itemprop="name"><?php echo wp_get_document_title(); ?></title>

quand _wp_render_title_tagest-ce que :

echo '<title>' . wp_get_document_title() . '</title>' . "n";

(Puisque Theme Check est une vérification de lignes directrices, alors que se passe-t-il s’il ne peut pas dire qu’une norme a réellement été suivie, cela ne devrait en théorie pas l’empêcher de passer?)

Mais dans tous les cas, vous pouvez contourner ce problème et améliorer l’implémentation existante en même temps en ajoutant un filtre de remplacement de personnalisation … en décrochant l’action existante (comme suggéré par @birgire) et (mon ajout) en accrochant une fonction d’emballage qui appelle _wp_render_title_taget lui applique le filtre :

if (has_action('wp_head','_wp_render_title_tag') == 1) {
    remove_action('wp_head','_wp_render_title_tag',1);
    add_action('wp_head','custom_wp_render_title_tag_filtered',1);
}

function custom_wp_render_title_tag_filtered() {
    if (function_exists('_wp_render_title_tag')) {
        ob_start();
        _wp_render_title_tag();
        $titletag = ob_get_contents();
        ob_end_clean();
    } else {$titletag = '';}
    return apply_filters('wp_render_title_tag_filter',$titletag);
}

Puisqu’il est préférable d’avoir un filtre disponible de toute façon…… Ensuite, vous pouvez facilement ajouter vos propres personnalisations de cas d’utilisation en utilisant le nouveau filtre :

add_filter('wp_render_title_tag_filter','custom_wp_render_title_tag');

function custom_wp_render_title_tag($titletag) {
    $titletag = str_replace('<title>','<title itemprop="name">',$titletag);
    return $titletag;
}

Bien sûr, ce serait beaucoup plus propre si la fonction principale était simplement mise à jour pour :

function _wp_render_title_tag() {
    if ( ! current_theme_supports( 'title-tag' ) ) {
        return;
    }
    echo apply_filters( 'wp_render_title_tag' , '<title>' . wp_get_document_title() . '</title>' . "n" );
}

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *