サポート » 使い方全般 » 複数あるカテゴリー最新記事一覧の中で最も最新の記事に「New!」を表示さ

  • 解決済 mitsu5656

    (@mitsu5656)


    いつも大変お世話になっております。
    初めて投稿させて頂きます。

    トップページに5つのカテゴリーの各最新記事一覧を設けました。
    カテゴリーはそれぞれカスタム投稿タイプで作成しました。
    その5つのカテゴリーの中でも最も最新の記事のアイキャッチ画像の前面にCSSで作成した「NEW!」を表示させたいです。

    <top.php>

    <!-- 各カテゴリーの新着記事一覧 -->
                      <?php
         global $post;
         $my_posts= get_posts(array(
         'post_type' => array('shampoo','rinse','cut','perm','bleach'),
         'numberposts' => 5
         ));
         foreach($my_posts as $post):setup_postdata($post);
    ?>
                        <div class="top-category">
                            <div class="figure">
                               <?php get_template_part( 'new' ); ?>
                                <a>"><?php the_post_thumbnail( 'full', array( 'class' => 'img-rounded img-responsive' ) ); ?></a>
                            </div>
                                <a>"><p><?php the_title();?></p></a>
                            <?php get_template_part( 'latest' ); ?>
                        </div>
                        <?php endforeach; ?>
                        <!-- END 各カテゴリーの新着記事一覧 -->

    top.phpでは、前述の通り、各カテゴリーの最新記事一覧が表示されます。
    12行目<?php get_template_part( ‘new’ ); ?>で、「NEW!」の条件分岐用にnew.phpを作成して配置。

    <new.php>

    <?php if(isFirst()): ?>
    <div class="new col-md-6"><p>New!</p></div>
    <?php else: ?>
    非表示
    <?php endif; ?>

    最新記事と認識させる為にfunctions.phpに以下を記述。

    <functions.php>

    function isFirst(){
        global $wp_query;
        return ($wp_query->current_post === 0);
    }

    他のサイト様の記事を参考に記述してみましたが、new.phpの条件分岐がうまくいきません。
    現状、最新の記事も他の4つの記事同様、カテゴリーが非表示と認識されてしまいます。

    WordPressのバージョン:4.3.1
    テーマ:自作
    サーバー環境:現状ローカル

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター jim912

    (@jim912)

    isFirst 関数の中で参照されている変数 $wp_query は、通常のWordPressループ( while ( have_posts() ) というやつ )で参照されるものなので、get_posts と foreach でのループでは機能しません。

    対応策としては、3点考えられます。

    • get_posts と foreach を query_posts と while でのループに置き換えます。この場合、isFirst関数はそのままで大丈夫です。修正は最小限で済みますが、query_posts は利用が推奨されていないことと、最後に wp_reset_query の記述を忘れないようにしてください。
    • foreach のループでループの最初かどうかの変数を用いて、top.php 内での条件分岐とし、最初であると判断された場合に、get_template_part( ‘new’ ) が実行されるようにします。この場合、new.php での条件分岐および、isFirst 関数は不要です。
    • get_posts と foreach を $my_posts = new WP_Query の形で、WP_Query での取得と、while でのループに置き換えます。この場合、isFirst 関数内の $wp_query を $my_posts に修正する必要があります。また、isFirst で参照される変数が変わるため、他の箇所で、isFirst を使用している場合、そちらに影響がでてしまうので注意が必要です。

    ※ 質問時に設定されたカテゴリーが適切ではありませんでしたので、こちらで修正しておきました。次回質問される場合に注意してください。
    ※ コードを提示いただく場合は、code ボタンでコードの部分を括って頂くと見やすくなります。私の方で修正していますが、a タグの中身が消えてしまっていますので注意してください。

    スレッド開始 mitsu5656

    (@mitsu5656)

    jim912様

    早々のご回答を有難うございます。
    また、当フォーラムでのルールのご指摘も有難うございます。
    以後、気をつけます。

    お陰様で原因は理解しました。
    対応策として、2番目の手法を取りたいと思い試みたのですが上手くいきませんでした。
    根本的に、PHP/WP経験半年ほどの私の知識不足によるものです。

    2番目の手法について再度お聞きしたいです。

    <new.php>
    div 要素だけにしました。

    <functions.php>
    isFirst 関数は削除しました。

    <top.php>
    top.php 内で条件分岐させる為に、
    <?php get_template_part( 'new' ); ?>
    部分に実行の記述を書いたのですが、上手くいきませんでした。
    と言いますより、書けませんでした。厚かましいのですが、実行の記述をお教え頂けますでしょうか?

    宜しくお願い致します。

    モデレーター jim912

    (@jim912)

    大分端折っていますが、

    $first = true; // 初期化、最初は真とするため true を代入
    foreach($my_posts as $post):setup_postdata($post);
    <?php if ( $first ) { get_template_part( 'new' ); } // $first での条件分岐
    ?>
    <?php $first = false; endforeach; // 1回目が終わったら、false を代入し、2回目以降は newにならないように
    ?>

    スレッド開始 mitsu5656

    (@mitsu5656)

    jim912様

    無事にうまくいきました!
    お忙しい中、本当に有難うございました。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「複数あるカテゴリー最新記事一覧の中で最も最新の記事に「New!」を表示さ」には新たに返信することはできません。