WordPressテーマSANGOの質問

「最近の投稿」を特定のカテゴリーのみ表示したい

アバター
オスギ

お世話になります。最高のテーマをいつもありがとうございます。
ここで質問していいのか悩みましたが、サイドバーに設置した「最近の投稿」や「人気の記事」「アーカイブ」などのウィジェットについてお伺いします。
上記ウィジェットの表示を特定のカテゴリーのみ表示(または特定のカテゴリーを除外)することはできますでしょうか。
もし大がかりなカスタマイズとなるなら諦めます。
お手数ですが、ご教授ください。

ウィジェットの設定をする
ウィジェットの設定をしよう:広告の貼り方も解説
コメントへの回答
サルワカくん
サルワカくん
2019/06/07

以下のようにカスタマイズするのが良いと思います。

1. 特定のカテゴリー用のウィジェットを新規追加

以下のコードを子テーマのfunctions.phpに追加すれば、もう1つサイドバーウィジェットが追加されます。そのサイドバーを特定のカテゴリーのときにのみ表示するようにしていきます。

// カテゴリー○○のサイドバー
register_sidebar(array(
  'id' => 'sidebar2',
  'name' => 'カテゴリー○○のサイドバー',
  'description' => 'メインのサイドバーです。スマホで見たときにはページ下に配置されます。',
  'before_widget' => '<div id="%1$s" class="widget %2$s">',
  'after_widget' => '</div>',
  'before_title' => '<h4 class="widgettitle dfont has-fa-before">',
  'after_title' => '</h4>',
));

2. 子テーマにsidebar.phpを複製

親テーマのsidebar.phpを子テーマのフォルダに複製します。

3. 子テーマのsidebar.phpを編集(条件分岐を加える)

子テーマのsidebar.phpを編集し、カテゴリー別に条件分岐するようにします。
具体的には、以下の部分を…

<?php dynamic_sidebar( 'sidebar1' ); ?>

以下に置き換えます。

<?php 
  if( is_category( array('カテゴリー1のID', 'カテゴリー2のID') ) ) {
    // カテゴリー1と2のときはsidebar2を表示
    dynamic_sidebar( 'sidebar2' ); 
  } else {
    dynamic_sidebar( 'sidebar1' ); 
  }
?>

is_category()の条件分岐については、WordPressの条件分岐の解説記事をご覧ください。
よろしくお願いします。

アバター
オスギ
2019/06/07

先ほどのメールの件は解決しましたので無視してください。
sidebar.phpを編集してIDの部分を下記のようにしました。
if( is_category( array(‘3′,’2′,’1’) ) ) {
こうするとこでサイドバー2に入れた「最新の投稿」などのウィジェットにはカテゴリーID3・2・1の投稿が表示されるはずだと思いますが、無反応です。
しかもサイドバー1にはカテゴリーID3・2・1の投稿が表示されたままです。
カスタマイズの方法に問題・間違いなどありますでしょうか?

アバター
オスギ
2019/06/07

さっそく返信ありがとうございます。
ご指示どおりカスタマイズしましたらサイドバー表示の部分でサイトの読込が止まってしまうようです。
また、このカスタマイズと「特定のカテゴリーを含んだ場合はスライダー2を表示する」といったイメージかなと思いますが、そうではなく「スライダー1から特定のカテゴリーを排除する」ようなカスタマイズは可能でしょうか。

サルワカくん
サルワカくん
2019/06/07

あ、IDの部分は置き換える前提で書きました。

私は「上記ウィジェットの表示を特定のカテゴリーのみ表示」というのは「特定のカテゴリーの記事では、最近の投稿ウィジェットを表示したくない」という意味だと理解していましたが、違っていましたか?
特定のカテゴリーでのみ別のサイドバー(サイドバー2)を表示するようにして、そのサイドバーには最新の投稿を含めないようにすれば良いと思ったのですが。
([ウィジェット]にサイドバー2が表示されているはずです。サイドバー2に特定のカテゴリーの記事で表示したいサイドバーを設定するイメージです。サイドバー2にはアーカイブや人気記事を含めないようにすればOKです)

それとも「最近の投稿」ウィジェットはカテゴリーに関わらず表示するけど、特定のカテゴリーの記事を含めないようにする」という意味でしょうか。
その場合、いろいろと複雑なので、こちらで説明するのは困難です。「最新の投稿」や「アーカイブ」は全テーマ共通のウィジェットなので、たとえば以下のような記事で解説されています。
https://blow-in.net/blog/entry-709.html

よろしくお願いします。

アバター
オスギ
2019/06/10

丁寧、迅速な回答ありがとうございます。
もう少し勉強していろいろ試してみます。
ありがとうございました。

アバター
オスギ
2019/06/11

「最近の投稿」から特定カテゴリーの記事を除外する方法ですが、以下のコードを子テーマの functions.php ファイルに追記したら実現できました。
お騒がせいたしました。

function my_widget_posts_args( $args ) {
$cat = get_category_by_slug( ‘除外カテゴリーのスラッグ’ );
if ( $cat ) {
$args[‘category__not_in’] = array( $cat->term_id );
}
return $args;
}
add_filter( ‘widget_posts_args’, ‘my_widget_posts_args’ );

サルワカくん
サルワカくん
2019/06/11

イメージ通りにできたようで良かったです!!
貴重な知見の共有、ありがとうございました。

アバター
2020/08/18

最近の投稿から特定カテゴリー(複数)を非表示にしたいです。

Q&Aの回答を参考にして試してみましたが、1つのカテゴリしか非表示にならずでして…

もしお分かりになりましたら、複数のカテゴリを非表示にする方法をご教示頂けませんでしょうか。

何卒よろしくお願い致します。

サルワカくん
サルワカくん
2020/08/18

複数のカテゴリーを除外したい場合、以下のようなコードを子テーマのfunctions.phpに貼り付ければ良いかと思います.


add_filter('widget_posts_args', 'modify_widget_args');
function modify_widget_args() {
  $r = array( 
    'category__not_in' => array(31, 28), // ★カンマ区切りでカテゴリーIDを指定
    'post_status' => 'publish',
    'posts_per_page' => 8, // ☆表示する記事数
  );
  return $r;
}

↑ ★の行でarray(カテゴリーID1, カテゴリーID2, カテゴリーID3)のような形で「最近の投稿」から除外したいカテゴリーIDを指定します。このカスタマイズを行う場合、表示記事数は☆の行で指定することになります。

よろしくお願いします。

アバター
2020/08/18

ご回答頂いた通りやってみたら変更できました。
早々にご対応頂きありがとうございました。