web-dev-qa-db-ja.com

現在の投稿中にクラスを追加する。wp_list_categories

以下のコードは、現在アクティブな親カテゴリの子カテゴリのサブメニューを作成します。このコードでは、最上位の親カテゴリの子カテゴリも生成され、それらのカテゴリ内の子カテゴリと投稿が表示されます。 .current-cat CSSクラスはアクティブな子カテゴリに適用されます。

これは私がこの一般的な問題に対処するために見つけることができた最も軽快なコードです。

誰かがこのコードが解決しない1つの問題を解決する解決策 - 現在の子カテゴリwhenにカテゴリを追加することにクラスを追加することに興味があります。

<?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>';
?>

私が探しているものをさらに説明するには:

親カテゴリをBoats、子カテゴリをSkoonersとしましょう。私は "スクーナーを購入する方法"というタイトルの記事を書き、それをボート>スクーナーの下に提出しました。 Boatsカテゴリに移動すると、このコードをスクーターを子カテゴリとして表示し、CSSクラスを割り当てます。これにより、デザインを通じて、これが表示中のカテゴリであることを示すことができます。しかし、私が「Skoonerを購入する方法」の記事(Boats> Skoonersの下にある)に移動したとき、適切な子カテゴリはまだ表示されていますがCSSクラスの.current-catがありません。

これを実際に見るには、 http://themeforward.com/demo2/category/category/ にアクセスして、右側のサブメニューに移動します。 「リンク」カテゴリそれから、 "Link"記事をクリックすると、紫色のスタイルが.current-catで適用されなくなるのがわかります。

1
AndrettiMilas

@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;
}

私の記事の1つ から調整しました

2
Michael

ここではコードの集中度が低い答えを出す必要があると思いますので、この質問をしばらくオープンにしておくつもりですが、私は最初の質問で提供したコードを利用しながらfunctions.phpにこのコードを追加することが1つの解決策.

// 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

Wordpressのコーデックスから:

current_category(integer)カテゴリアーカイブページにないwp_list_categoriesの使用時に "current-cat"を表示させることができます。通常、current-catはカテゴリアーカイブページにのみ設定されます。別の用途がある場合、または別のカテゴリを強調表示するように強制したい場合は、これにより、関数が「現在の」カテゴリと見なしているものが上書きされます。このパラメーターはバージョン2.6で追加されました

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

  • Andrettiそれはあなたが関数がクラスを表示するように強制することができるように見えます。

更新:これを試してください。私は試してみました、それは私のために働いた。

コードを以下から変更してください。

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

に:

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

ここで試してみました:

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

これはテスト専用のWPページです。カテゴリは強調表示されませんが、ソースコードを見るとcurrent-catクラスが存在することがわかります。投稿ページに。私はコメントの後にページの一番下にカテゴリループを追加しました。

0
gdaniel