web-dev-qa-db-fra.com

Comment ajouter une publication à une liste des classes figurant dans l'attribut class of the balise body?

Bonne journée,

Peut-être que vous êtes prêt à aider un débutant en php.

J'essaie d'ajouter une balise de publication ou de page à la liste des classes figurant dans l'attribut de classe de la balise body. Ces classes sont imprimées sur HTML par header.php:

<body <?php body_class(''); ?>>

Dans le passé, j'ai utilisé avec succès le code suivant pour imprimer mon tag de page dans un méta-élément:

<meta name="print-post-tag" content="<?php
$posttags = get_the_tags();
if ($posttags) {
    foreach($posttags as $tag) {
        echo $tag->name;
    }
}
?>
" >

Note: Les publications ont des tags par défaut, mais j'utilise le plugin "Tag Pages" pour ajouter des tags aux pages.

Alors maintenant, j'essaie de faire quelque chose de similaire dans l'espace de classe d'attributs body très utilisé.

Après avoir lu le codex sur http://codex.wordpress.org/Function_Reference/body_class et http://codex.wordpress.org/Function_Reference/ the_tags , j'ai découvert que la meilleure façon de le faire serait d'ajouter un filtre au functions.php de mon thème.

Ma première tentative n'a généré que des erreurs: (plusieurs erreurs de code ici)

function the_tags( $classes ) {
global $tag;
foreach ( get_the_tags( $tag->name ) as $category ) {
    $classes[] = $category->category_nicename;
}
return $classes;
}
add_filter( 'body_class', 'the_tags' );

Remarque: il me manque une compréhension structurelle de la structure du modèle WordPress et de ses nombreuses variables et fonctions.

2ème tentative: j'ai essayé d'exécuter Ryan ( https://stackoverflow.com/questions/11232676/trying-to-add-the-slug-to-my-body-class-with-no-success -in-wordpress-can-any ) a suggéré la solution, mais mon code HTML n'affiche pas le tag de page. Voici la tentative que j'ai laissée au bas du fichier functions.php de mon thème:

function a_beautiful_new_body_class() {  // adding a class to <body> tag
global $wp_query;
$tag = '';
if (is_front_page() ) {
    $tag = 'home'; // 'home' as class for the home page
} elseif (is_page()) {
    $tag = $wp_query->query_vars["tag"]; // placing the tag
}
if ($tag)
    echo 'class= "'. $tag. '"';
}

Comment aborderiez-vous ce problème?

Gentiment,

1
hamburger

Tu es proche. Votre première tentative utilise get_the_tags de manière incorrecte. La fonction accepte l'ID de publication à partir duquel vous souhaitez obtenir les tags. Dans votre exemple, il n'y a pas de $tag global, donc $tag->name tente d'extraire une propriété d'un non-objet.

Lors de votre deuxième tentative, un seul message ne comportera pas de vars de requête liés aux balises, qui ne seraient définis que sur une page d'archivage de balises (la taxonomie de balise est en réalité nommée post_tag dans les coulisses).

Donc, voici une version de travail qui résout les problèmes avec vos exemples. Notez que nous utilisons get_queried_object_id() pour transmettre le post/ID de page actuel à get_the_tags(). Vous pouvez voir d'autres exemples qui utilisent global $post, puis $post->ID pour transmettre l'ID à des fonctions, cela fonctionnerait également.

function add_tags_to_body_class( $classes ) {

    // if this is a page or a single post
    // and this page or post has tags
    if( ( is_page() || is_single() )
        && $tags = get_the_tags( get_queried_object_id() ) ){

        // loop over the tags and put each in the $classes array
        // note that you may want to prefix them with tag- or something
        // to prevent collision with other class names
        foreach( $tags as $tag ) {
            $classes[] = $tag->name;
            // or alternately, with prefix
            // $classes[] = 'tag-' . $tag->name;
        }
    }

    // return the $classes array
    return $classes;

}
add_filter( 'body_class', 'add_tags_to_body_class' );
1
Milo