サポート » 使い方全般 » 投稿記事の判別について教えてください

  • 解決済 rpl0kinawa

    (@rpl0kinawa)


    初めての投稿なので記載方法などミスがあったら申し訳ございません。

    ◆質問
    ページ内に表示される記事の「最後から数えて〇番目から最後まで」という判定をループ内でしたいのですが、WEBで以下まで見つける事が出来ました。
    下をfunctions.phpに記載してif(isLast())で分岐させています。

    function isLast() {
    global $wp_query;
        return ($wp_query->current_post+1 === $wp_query->post_count);}

    ただ、これだと最後という判定しかできません。
    「最後から数えて〇番目から最後まで」
    ※例を挙げると1.2…..10.11.12.最後とある場合10~最後
    上のような判定をさせる記載方法はありますでしょうか?
    PHPがほとんど分からないので簡単な質問なのかもしれませんが、よろしくお願いします。

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

    (@hideokamoto)

    WP_Queryの「offset」パラメータを使用することで「先頭から○番目までを飛ばす」という処理が可能になります。

    $wp_query = new WP_Query( 'offset=3' ) );

    であれば4番目以降の投稿が表示されます。

    関数リファレンス/WP Query

    大変失礼しました、
    投稿先間違えました

    トピック投稿者 rpl0kinawa

    (@rpl0kinawa)

    ありがとうございます、教えていただいた

    $wp_query = new WP_Query( ‘offset=3’ ) );

    をfunctions.phpに

    function isLast() {
    global $wp_query;
        return ($wp_query->current_post+1 === $wp_query->post_count);}

    上のように記載して投稿のループ内で呼び出して分岐させることは可能でしょうか?もし可能であれば方法を教えてください。

    ※TOPページの最新の記事から3つとTOPページの記事の最後から3つという条件を作りたいと思っています。

    $n = 3;
    return ($wp_query->current_post + 1 > $wp_query->post_count - $n);

    で、n 番目以降は true が返るのではないでしょうか。なお、global な $wp_query にむやみなオブジェクトを代入するのはやめた方がいいです。

    トピック投稿者 rpl0kinawa

    (@rpl0kinawa)

    ありがとうございます、教えていただいた

    $n = 3;
    return ($wp_query->current_post + 1 > $wp_query->post_count - $n);

    はどこに記載すればよろしいのでしょうか?
    PHPがほとんどわかりませんので、申し訳ございません。

    おっと、そうでしたね。お示しの関数を利用して書き換えるようにしましょうか。ちょっと効率悪いかもしれませんが、試してみてください。久しぶりに PHP を触ったので、ミスがあるかも。

    テンプレートの function.php。

    /**
     * 最後から N 番目の投稿ならば true を返す。第2引数に false を渡すと、
     * 最初から N 番目の投稿が true になる。
     *
     * 引数は N を整数で指定する。指定がない場合は何もしないが、判定は実行される。
     * 文字列引数を渡した場合は、強制的に符号なし整数に変換する。
     * ループの中で使われていない場合は、false を返して抜ける。
     *
     * @parameter unsigned integer: if string given, force it to uint
     * @access global
     * @return value boolean
     */
    function is_last_nth($nth = 0, $from_the_last = true) {
        global $wp_query;
        $last_nth = sprintf("%u", $nth);
        if ($wp_query->in_the_loop) {
            if ($from_the_last) {
                return ($wp_query->current_post + 1 > $wp_query->post_count - $last_nth);
            } else {
                return ($wp_query->current_post < $last_nth);
            }
        }
        return false;
    }

    テンプレート。

    if ( have_posts() ) :
        while ( have_posts() ) : the_post();
            if ( is_last_nth(3, false) ) :
                ここで最初から3つの投稿を処理する
            elseif ( is_last_nth(3) ) :
                ここで最後から3つの投稿を処理する
            else;
                ここでその他の投稿を処理する
            endif;
        endwhile;
    endif;

    トピック投稿者 rpl0kinawa

    (@rpl0kinawa)

    返信遅れてすいません。
    教えていただいた通りにやってみましたが、function.phpへの記載は問題なかったのですが、テンプレートのほうに記載すると真っ白になってしまいます。どこか私の記載ミスはありますでしょうか?

    <div id="topnews">
      <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <?php if(is_last_nth(3,false)) { ?>
    ここで最初から3つの投稿を処理する
    <?php elseif(is_last_nth(3)) { ?>
    ここで最後から3つの投稿を処理する
    <?php } else { ?>
     ここでその他の投稿を処理する
    <?php endif; ?>
      <?php endwhile; else: ?>
      <p>記事がありません</p>
      <?php endif; ?>
    </div>
    <div id="topnews">
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
        <?php if(is_last_nth(3,false)) : ?>
        ここで最初から3つの投稿を処理する
        <?php elseif(is_last_nth(3)) : ?>
        ここで最後から3つの投稿を処理する
        <?php else : ?>
        ここでその他の投稿を処理する
        <?php endif; ?>
        <?php endwhile; ?>
    <?php else: ?>
    <p>記事がありません</p>
    <?php endif; ?>
    </div>

    ではないかな? 制御構造で、コロンとブレースは混在しないように。

    トピック投稿者 rpl0kinawa

    (@rpl0kinawa)

    ありがとうございます!出来ました!
    これで後は自分で出来るかと思ったんですが、これに更にモバイルの分岐をいれようとおもっているのですが、下のようにすればいくかなと思ったんですが上手くいきませんでした。おそらくご指摘いただいた通り制御構造を理解できていないからだと思うんですが、ご教授願えますでしょうか。

    <div id="topnews">
    <?php if(is_mobile()) { ?>
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
        <?php if(is_last_nth(3,false)) : ?>
        ここで最初から3つの投稿を処理する
        <?php elseif(is_last_nth(3)) : ?>
        ここで最後から3つの投稿を処理する
        <?php else : ?>
        ここでその他の投稿を処理する
    <?php } else { ?>
      PCでの表示
    <?php } ?>
        <?php endif; ?>
        <?php endwhile; ?>
    <?php else: ?>
    <p>記事がありません</p>
    <?php endif; ?>
    </div>
    トピック投稿者 rpl0kinawa

    (@rpl0kinawa)

    やりたいことは、モバイルの場合だけに最初と最後の3つの投稿の処理をいれて、PCの場合はそのまま投稿を表示させるというものです。

    トピック投稿者 rpl0kinawa

    (@rpl0kinawa)

    <?php if(is_mobile()) { ?>の位置を下のように修正しましたがこれでもダメでした・・・

    <div id="topnews">
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <?php if(is_mobile()) { ?>
        <?php if(is_last_nth(3,false)) : ?>
        ここで最初から3つの投稿を処理する
        <?php elseif(is_last_nth(3)) : ?>
        ここで最後から3つの投稿を処理する
        <?php else : ?>
        ここでその他の投稿を処理する
    <?php } else { ?>
      PCでの表示
    <?php } ?>
        <?php endif; ?>
        <?php endwhile; ?>
    <?php else: ?>
    <p>記事がありません</p>
    <?php endif; ?>
    </div>
    トピック投稿者 rpl0kinawa

    (@rpl0kinawa)

    ご指摘いただいた「コロンとブレースは混在しないように」を調べて以下のように修正したらうまくいきました。コロンの方が見やすいみたいなのでなんとかコロンに変更できるように頑張ってみます!kjmtsh様、ご丁寧にありがとうございました!

    <div id="topnews">
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <?php if(is_mobile()) { ?>
        <?php if(is_last_nth(3,false)) { ?>
        ここで最初から3つの投稿を処理する
        <? } php elseif(is_last_nth(3)) { ?>
        ここで最後から3つの投稿を処理する
        <?php } else { ?>
        ここでその他の投稿を処理する
    <?php } ?>
    <?php } else { ?>
      PCでの表示
    <?php } ?>
      <?php endwhile; else: ?>
      <p>記事がありません</p>
      <?php endif; ?>
    </div>

    トピック投稿者 rpl0kinawa

    (@rpl0kinawa)

    ^^

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • トピック「投稿記事の判別について教えてください」には新たに返信することはできません。