WPのアーカイブで特定のカテゴリーを表示する
アーカイブで特定のカテゴリーを表示する方法
ワードプレスではウィジェットで標準装備されているアーカイブですが、
これを使うと全ての投稿記事が月別表示されてしまいます。
過去記事なので、 通常のサイトではデフォルトで問題はないのですが、 ウィルカートを装備していたり、 企業の特定の記事だけのアーカイブを表示したい、 という場合はデフォルトでは使えません。
プラグインを使わず、 query_posts()を使えば簡単に処理できると考えていましたが、 アーカイブに限っては、 どうやら通常通りquery_posts()を使っても、 出力の無限ループ誤作動が発生してしまい、 使えませんでした。
ここは最終兵器プラグインを…と誘惑が…。
この手のプラグインで有名なのが、 「Archives for a category」
http://kwebble.com/projects/wp-plugin-afac
ですが、 更新されておらず誤作動が多いとのこと。
試しに使ってみましたが、 誤作動はおきませんでした。
それにしても 「Archives for a category」プラグインの中身を見ても それほど複雑なプログラムではないので、 更新も必要ないのだろうと思いましたが、 なぜ誤作動が起きるのかと試行錯誤していると、 大体のことがわかりました。
ワードプレスのテンプレートには index.phpやsingle.phpなどがありますが、 アーカイブのテンプレートは最初にdate.phpを読み込みます。
このdate.phpが、 どうやら他のテンプレートとは、 違う処理をするようなのです。
archive.phpではquery_posts()が普通に使えるのに date.phpだけが誤作動を起こすのです。
たぶんこのワードプレスの仕様が プラグインを誤作動へ導いているのだろうと思いました。
function.phpにプログラムを追記して、
<?php wp_get_cat_archives(); ?>
で簡単に出力させること出来るようなのですが、 プラグインと同じ位プログラムを追記をしなくてはなりませんでした。
そもそもウィジェットのアーカイブに、 カテゴリの選択設定がないのが悪い! と、思いながら、あれこれ考えていると!
「THM」様
http://hassii.com/memo/2019
より
<?php query_posts($query_string . '&cat=-x'); ?>
というメインループ内での記述方法を発見!
これに 「MacBook Air とWordPressでこうなった」様 に記載されている
query_posts( ‘cat=-112&posts_per_page=10&paged=’.$paged );
を融合すると、 なんとdata.phpでもquery_posts()が正常に作動しました。
表示したいカテゴリはcat=(カテゴリID) 表示したくないカテゴリcat=-(カテゴリID) 同じく誤作動していたページングも正常になりました。
結論
配布されているワードプレスのテンプレートは、 archive.phpをメインで使っている場合が多いです。
もしarchive.phpを使っていない場合は通常の query_posts()が使えますが、 archive.phpを使っていない場合はdate.phpを使います。
date.phpの作り方は、 ファイル名をdate.phpにするだけです。
例えば ウィジェットのアーカイブで商品のカテゴリーを表示させたくない場合。 商品はカテゴリーIDが15だとします。
date.phpのループ開始の直下に query_posts($query_string . ‘&cat=-15’.$paged ) を入れてループを閉じるだけです。
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();//ループ開始 ?>
<?php query_posts($query_string . '&cat=-15'.$paged ); ?>
<?php endif; ?>
記事の表示数をワードプレスの設定依存から離す場合は、 例えば記事数を5だと
<?php query_posts($query_string . '&cat=-15&posts_per_page=5paged='.$paged ); ?>
になります。
カテゴリーが多くなった場合は、 カンマで区切ります。 例えばカタゴリIDが3と15と20を表示したくない場合は、
<?php query_posts($query_string . '&cat=-3,-15,-20'.$paged ); ?>
となります。
もしウィジットの表示方法を変えたい場合は、 function.phpに以下を追記して変更することが可能です。
// ウィジェットのアーカイブの値
add_filter( 'widget_tag_cloud_args', 'my_widget_tag_cloud_args');
function my_widget_tag_cloud_args( $args) {
$args = array(
'smallest' => 10, // 最小のフォントサイズ:8[デ]
'largest' => 10, // 最大のフォントサイズ:22[デ]
'unit' => '', // フォントサイズ単位:'pt'[デ] CSSで使用できる単位pt, px, em, %
'number' => 20, // 表示タグ数の上限:45[デ]
'format' => 'list', // 表示フォーマット:'flat'(横並び)[デ]、'list'(縦並び <li></li>)、'array'(表示されない。他のPHPコード用に使用する場合)
'separator' =>"\n", // 表示タグ毎の区切り '\n'[デ] (スペース)
'orderby' =>'name', // 並び替項目 'name'[デ](タグ名)、'count'(投稿数)
'order' => 'ASC', // 並び順 'ASC'(昇順)[デ]、'DESC'(降順)、'RAND'(ランダム)
'exclude' => null, // 除外するタグ 除外するタグのIDをカンマ区切りで列挙
'include' => null, // 表示するタグ 表示するタグのIDをカンマ区切りで列挙
'topic_count_text_callback' => 'default_topic_count_text', //タグリンクにtitle属性を付与する関数 'default_topic_count_text'[デ](標準で"~件のトピック"と付けられます。)
'link' => 'view', // リンク先 'view'[デ](タグアーカイブページ)、'edit'(編集ページ)
'taxonomy' => 'post_tag', // クラウドに表示する項目 'post_tag'[デ](タグ)、'category'(カテゴリー)、'link_category'(リンクカテゴリー)、'any other registered taxonomy'(全て)もしくは配列で複数指定する。
'echo' => true, // 表示有無 true(表示)[デ]、false(非表示:変数として使用する場合)
);
return $args;
}
コメントアウトに説明が書いてあります。
これでプラグインを使わず ワードプレスのウィジェット使い月間アーカイブを、 カスタマイズできるはずです。
以上、「WPのアーカイブで特定のカテゴリーの表示する」でした。