サポート » 使い方全般 » カテゴリーページで本年度のみの投稿を表示したい。

  • 解決済 no23h

    (@no23h)


    質問です。

    category.phpに本年度の投稿のみに限定して生成することは可能でしょうか。

    理想はサイドバーの項目を以下のように、
    各カテゴリーページには本年度の投稿のみ、昨年移行の記事は年別でまとめて生成し、
    これが一年ごとに切り替わるようにしたいです。(カテゴリーが2018年になり、アーカイブに2017の項目が増える)

    サイドバー ————-
    [カテゴリー]
    ・全ての投稿
    ・ーカテゴリA (2017年)
    ・ーカテゴリB (2017年)
    ・ーカテゴリC (2017年)
    [アーカイブ]
    ・2016 (2016年のA,B,C)
    ———————

    現状、category.phpのループは以下になります。
    <?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
    コンテンツ
    <?php endwhile; ?>
    <?php endif; ?></div>

    これですと年代関係なく全ての投稿が表示されてしまいます。

    category.phpを本格的に編集するのは初めてで、
    色々と調べましたがうまくいきません。
    どなたかお力添えをいただけないでしょうか。
    よろしくお願いします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • 関数リファレンス/WP Query

    WordPress の表示ロジックを理解する – Reloaded –

    たぶんデフォルトのパーマリンクなら(テーマにもよるけど)
    site_url/?cat=aのcat_id(整数)&year=2017
    であればcategoery.phpが呼ばれて、
    wordpressにあらかじめ用意されているパラメータyearを受け取って希望どおりになるのでは。
    上記リンクがあらかじめ用意されているクエリ文字列のパラメータ。

    サイドバーのurlをどうするかなの話かもしれませんね。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    oisitさんの紹介してくださっている
    WP_Queryのパラメータの中に、日付パラメータというのがあります。

    year に今の年を渡せばいいので、PHPのdate関数(WordPressのthe date関数ではなく)で date(‘Y’)を取得して、その値が渡されるようにすればできると思います。

    できればcategory.phpは今のままでよくて、functions.phpでpre_get_postsフックを使ってあげたほうがよいですのが、いきなりその話をすると難しいと思うので、ひとまず

    ・今の年をPHP関数で取得
    ・WP_Queryを操作して、指定した年の投稿を出す

    このヒントで考えてみましょう。

    oisit様
    ご返信ありがとうございます。
    リンクはこういう仕組みになっていたのですね。
    大変勉強になりましたが、最初に知っておかなければいけない内容ですね…
    詳しいリンク先まで添付いただきまして、非常に参考になります。

    mypacecreator様
    ご返信ありがとうございます。
    oisit様が教えてくださった内容も含め、wp_queryでcategory.phpのループ処理を以下のように書き直しました。
    yearに2017を格納しています。
    <?php
    $year = date(‘Y’);
    $args = array(‘year’ => $year, ‘posts_per_page’ => -1 );
    $query = new WP_Query( $args );
    if ( $query->have_posts() ) :
    while ( $query -> have_posts() ) : $query -> the_post();?>

    〜コンテンツ〜

    <?php
    endwhile;
    endif;
    ?>

    上記コードで2017の記事にフィルタリングはできたのですが、
    今度はカテゴリ分けが機能しなくなったのか、どのカテゴリページへ飛んでも2017年度の全記事が表示されるように
    なってしまいました。
    調べましたが解決策が出ず..コードが間違っているのでしょうか。

    コードは間違ってないと思う。が条件分岐が必要かもね。

    テンプレート階層

    試しに、素のcategory.php用意して(functions.phpに追加したコード消さないとだめかな)ブラウザで自分のURL/?cat=aのcat_id(整数)&year=2017と自分のURL/?cat=aのcat_id(整数)を入力してみましょう。多分yearのない方は全年度表示されるはず。

    先に上げたwp_queryのコーデックのダラダラと長いパラメータ群はたぶん、WP_query($args)の$argsのなかにデフォルト値であるので(year=>”てかんじじゃないでしょうか)、そこへ値を入れてくれる場合に当たるときはクエリ文字列で値を渡すだけなんだと理解してる。だからこそsite_url/?year=2017でarchive.phpが呼ばれて、2017年の記事の一覧が表示される。

    なんちゃって理解しかしてないので難しいことはわからないけど。あと文章が下手ですいません。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    no23hさん、すみません。私のアドバイスがだめでした。
    category.phpに直接WP_queryを書くと「カテゴリーアーカイブを表示させる」という元々持ってた処理が無効化されて、追記した「今年の記事だけ全部出す」だけが有効化されてしまいます。

    なので、category.phpの記述はもとに戻していただき、やっぱりfunctions.phpでpre_get_postsフックを使う方法でやってください。

    【wordpress】pre_get_postsを使ってみませんか? – Qiita
    http://qiita.com/_ruka_/items/e14280d34eddf49efad1

    pre_get_postsでメインクエリを制御する | Tips Note by TAM

    pre_get_postsでメインクエリを制御する

    こっちの方法だと、「カテゴリーアーカイブを表示させる」の処理は無効化せずに「今年の記事だけ全部出す」の処理を追加できるはずです。

    oisitさんもフォローありがとうございます。

    oisit様
    mypacecreator様

    ご返信ありがとうございます。
    最終的に以下のpre_get_postsフックで希望通りのかたちになりました。

    function change_posts_per_page($query) {
    if ( is_admin() || ! $query->is_main_query() ){
    return;
    }
    if ( $query->is_category() ) {
    $query->set( 'year' , '2017' );
    return;
    }
    }
    add_action( 'pre_get_posts', 'change_posts_per_page' );

    category.phpでWP_queryが使えないとはさすがに気づきませんでした。
    あまり強引なことはできないようになっているのですね。

    お二人の詳細な解説のおかげでWORDPRESSの世界ががぐっと広がりました。
    本当に感謝申し上げます。ありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「カテゴリーページで本年度のみの投稿を表示したい。」には新たに返信することはできません。