web-dev-qa-db-fra.com

Ajouter une classe pendant le post en cours; wp_list_categories

Le code ci-dessous génère un sous-menu de catégories enfants de la catégorie parent actuellement active. Ce code génère également les catégories enfants de la catégorie parent supérieure tout en affichant les catégories enfants et les publications dans ces catégories. La classe CSS .current-cat est appliquée aux catégories enfants actives.

C'est le code le plus agile que j'ai pu trouver pour résoudre ce problème général.

Je suis curieux de savoir si quelqu'un a une solution pour résoudre le problème que ce code ne résout pas - l'ajout de la classe à la catégorie enfant actuelle lors de l'affichage d'un article de cette catégorie.

<?php
$categories = get_the_category();
    echo '<ul>';
foreach($categories as $category){
    $parent = $category->parent;
    if($category->parent == 0){
    }
    else{
        wp_list_categories("child_of=$parent&title_li");
    }
}
    echo '</ul>';
?>

Pour décrire plus en détail ce que je recherche:

Disons que la catégorie des parents est Boats et la catégorie des enfants est Skooners. J'ai écrit un article intitulé "Comment acheter un skooner" et l'ai classé sous Bateaux> Skooners. Lorsque je navigue dans la catégorie Boats, ce code affiche les skooners en tant que catégorie enfant et attribue une classe CSS qui nous permet d'indiquer via le design qu'il s'agit de la catégorie que nous consultons. Cependant, lorsque je navigue dans l'article "Comment acheter un skooner" (classé dans Bateaux> Skooners), les catégories enfants appropriées sont toujours affichées mais la classe CSS de .current-cat est manquante.

Pour voir cela en action, visitez http://themeforward.com/demo2/category/category/ et naviguez avec le sous-menu situé à droite de la Catégorie "Lien". Cliquez ensuite sur l'article "Lien" et vous remarquerez qu'il perd son style violet appliqué via .current-cat.

1
AndrettiMilas

approche très similaire à la réponse de @AndrettiMilas:

add_filter('wp_list_categories','style_current_cat_single_post');
// filter to add the .current-cat class to categories list in single post
function style_current_cat_single_post($output) {
    if( is_single() ) :
        global $post;
        foreach ( get_the_category($post->ID) as $cat ) {
            $cats[] = $cat->term_id;
        }
        foreach($cats as $value) {
            if(preg_match('#item-' . $value . '">#', $output)) {
            $output = str_replace('item-' . $value . '">', 'item-' . $value . ' current-cat">', $output);
            }
        }
    endif;
return $output;
}

adapté de l'un de mes articles .

2
Michael

Je pense qu'il doit y avoir une réponse moins intensive en code ici, donc je vais laisser cette question ouverte un peu plus longtemps, cependant, j'ai constaté que l'ajout de ce code à functions.php tout en utilisant le code que j'ai fourni dans ma question initiale est une solution possible.

// Generate the current-cat class when viewing single posts 
class singlePostCurrentCat { 
  function wp_list_categories ($text) { 
    global $post; 
      if (is_singular()) { 
        $categories = wp_get_post_categories($post->ID); 
        foreach ($categories as $category_id) { 
          $category = get_category($category_id); 
          $text = preg_replace( 
            "/class=\"(.*)\"><a ([^<>]*)>$category->name<\/a>/", 
            ' class="$1 current-cat"><a $2>' . $category->name . '</a>', 
          $text); 
        } 
      } 
    return $text; 
  } 
} 
add_filter('wp_list_categories', array('singlePostCurrentCat','wp_list_categories'));
1
AndrettiMilas

De wordpress Codex:

current_category (integer) Vous permet de forcer l'apparition de "current-cat" sur les utilisations de wp_list_categories qui ne figurent pas sur les pages d'archives de catégories. Normalement, la cat courante n'est définie que sur les pages d'archives de catégories. Si vous en avez un autre usage, ou si vous voulez le forcer à mettre en surbrillance une catégorie différente, cela remplace ce que la fonction pense de la catégorie "actuelle". Ce paramètre ajouté à la version 2.6

http://codex.wordpress.org/Template_Tags/wp_list_categories

  • Andretti, il semble que vous puissiez forcer la fonction à montrer la classe.

Mise à jour: essayez ceci. J'ai essayé et cela a fonctionné pour moi.

Changer votre code de:

wp_list_categories("child_of=$parent&title_li");

à:

wp_list_categories("child_of=$parent&title_li&current_category=1");

Je l'ai essayé ici:

http://wptest.defaria.me/uncategorized/hello-world/

Gardez bien avec moi qu'il s'agit d'une page WP à tester uniquement .. afin que vous ne voyiez pas la catégorie en surbrillance, mais si vous regardez le code source, vous verrez que la classe cat courante est présente. dans une page de post. J'ai ajouté la boucle de catégorie au bas de la page après les commentaires.

0
gdaniel