サポート » 使い方全般 » 投稿IDの情報をもとにNEWアイコンを表示

  • 解決済 Naoki-Jo

    (@naoki-jo)


    投稿IDの情報をもとにNEWアイコンを表示させようと思っているのですが、いろいろ試してみましたがうまくいきません。

    日時情報をもとに表示させてしまうと、未来日時の投稿などもあるので、それに対してNewがついてしまうので、投稿IDをもとにつけたいと思っています。

    投稿IDは最新の記事のほうが数字が大きくなっていっているようなので、

    最近投稿された3件のみNewをつけるとすると、

    比べる側の記事ID > 現在の最新の記事ID-3

    ならば、newアイコンをつける

    というような形をとればいいと思うのですが、
    やり方がわかりません。

    どうすればいいかぜひ教えてください。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • う~ん、未来日時の投稿にNewをつけたくないと言うのは分かりますが、未来日時の投稿にも投稿IDはあって、当然新しい順に投稿IDは大きくなっているので・・・だめっすよね(汗)

    で、日時情報を元にNewをつける方向で考えて、「未来投稿の日時情報>現在の日付>Newをつけたい記事の日時情報」と現在の日付を基準にすればよいと思いますが、どうでしょう?

    スレッド開始 Naoki-Jo

    (@naoki-jo)

    私のサイトの投稿のIDを見たところ、未来日時の投稿であっても、IDは投稿された順番が反映されているみたいなので、可能だとは思うのですが、どうでしょう。

    たとえば、次のような順番、A→Dという順番で記事を投稿すると、
    次のようなIDが付きます。

    記事、投稿日時設定、ID
    記事A 9月1日 1
    記事B 10月22日 2
    記事C 8月9日 3
    記事D 10月10日 4

    新しい記事2つにNEWをつけたいとすると、

    記事C 8月9日 3
    記事D 10月10日 4

    について欲しいということです。

    どうすればいいでしょうか。

    よろしくお願いします。

    未来の投稿は通常のループには入ってこないと思うのですが、もし事情があって混在しているのであれば、$post->post_statusが publish かどうかで判断できるのではないでしょうか。

    スレッド開始 Naoki-Jo

    (@naoki-jo)

    ありがとうございます。

    未来の投稿は表示させるように設定してあります。

    未来の投稿は表示させるように設定

    どうやって設定しているかを書いていただくと、よりステキです。

    予約投稿の表示を query_posts() でゴニョゴニョしているとして:
    投稿 ID の大きい順にいくつ、なら

    <?php
    query_posts( '現在の設定&orderby=ID&order=DESC');
    $i = 0;
    while( have_posts() ) {
      the_post();
      if( 2 > $i++ ) {
        // new を付ける
      }
     (省略)
    }
    wp_reset_query();
    ?>

    な感じでいかがでしょうか。

    スレッド開始 Naoki-Jo

    (@naoki-jo)

    アドバイスありがとうございます。試してみましたが、意図したものとはちょっと違う動きでした。

    未来投稿はプラグインの「No future post」を使っているので、全ての未来投稿が表示されるような状態です。

    具体的な表示したい状況としては、サイドバーに次のように、日付順、ID順のタイトルが別々に表示されていて、以下のような状況でNEWをつけたいのです。

    教えていただいたやり方でやってみたところ、どちらも上から2つにNEWがつくというような状況になってしまいました。

    こちらは、日付順に表示
    投稿日時 ID
    NEW 8月11日(水) 4
        8月13日(金) 2
        8月15日(日) 1
    NEW 8月18日(水) 6
    NEW 8月21日(土) 5
        8月22日(土) 3
    
    こちらはID順(新しい投稿ほど上)に表示
    投稿日時 ID
    NEW 8月18日(水) 6
    NEW  8月21日(土) 5
    NEW  8月11日(水) 4
         8月22日(土) 3
         8月13日(金) 2
         8月15日(日) 1

    まっとうなやり方かどうかわかりませんが・・・

    <?php query_posts( 'cat=3&posts_per_page=1&orderby=ID&order=DESC');?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <?php $kiji_id=the_ID(); ?>

    これで,カテゴリー3の一番新しい記事のIDを取得。

    <?php query_posts("orderby=date&posts_per_page=10&cat=3"); ?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    
    3件にNEWを表示させたい場合、
    ここで、$kiji_id-3 と現在表示されている記事のIDをそれぞれ比較して、
    比べる側のそれぞれの記事ID > $kiji_id-3 ならばNEWを表示
    
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?>
    <br></a>
    <?php endwhile; else: ?>
    <?php endif; ?>
    <?php wp_reset_query(); ?>

    のような感じにすればいいのかなと思っていますが、

    比べる側のそれぞれの記事ID > $kiji_id-3 ならばNEWを表示

    というところがどうすればいいのかわかりません。。

    何か他にいい方法もあるでしょうか。

    ご教授ください。よろしくお願いします。

    ※記事の ID は必ず1つずつ増えるものではないですー。
     例)リビジョン,画像,ページ,…でも同じ ID を使うため。

    …を承知の上で、

    ここで、$kiji_id-3 と現在表示されている記事のIDをそれぞれ比較して、
    比べる側のそれぞれの記事ID > $kiji_id-3 ならばNEWを表示

    というロジックで行くなら、そのままコードにすれば OK。

    if ( get_the_ID() > $kiji_id - 3 ) {
      // NEW を表示、の処理をここに書く
    }
    スレッド開始 Naoki-Jo

    (@naoki-jo)

    ※記事の ID は必ず1つずつ増えるものではないですー。

    そうなんですね。
    それでは、やっぱり「投稿IDの大きい順に3つ、NEWをつける」
    という方針が目的にはあっていそうです。

    教えていただいたコードの

    if( 2 > $i++ ) {
        // new を付ける
      }

    の部分でなぜ、記事のIDを取っているわけでもないのに
    大きい順にNEWがつくのかというロジックがわからなのですが、教えてください。

    query_posts( '現在の設定&orderby=ID&order=DESC');
    で「ID の降順」に記事を取ってくるようになってます。

    orderby = 記事の順序を決めるキー = ID
    order= = 記事の順序 = 降順(値の大きい方が先)= DESC

    詳しくは、我らが Codex:query_posts を参照してください。

    スレッド開始 Naoki-Jo

    (@naoki-jo)

    query_posts( '現在の設定&orderby=ID&order=DESC');
    で「ID の降順」に記事を取ってくるようになってます。

    それは理解できているのですが、

    if( 2 > $i++ )

    の2とか、$i++ とかは定数で、
    直接記事のIDとは関係ないのではないのかなと考えてしまうのです。

    $i=0なので

    if( 2 > 1 )

    となって、2が1より大きいならばNEWをつけるということで、
    記事のIDとはどう関係しているのかがわかりません。

    何度もすみませんが、よろしくお願いします。

    1. query_posts で記事の ID の大きい順に記事を集めてる。
    2. while( have_posts() ) : the_post();
     で集めた記事を 1 件ずつ処理している。
      1件ずつの順番は? 1.のとおり記事ID の大きい順。
    3.$i は変数で、何件目を処理してますよ、ていうカウンタ。
    4.ループで処理される $i と ID の関係は?(ID値は例:大きい値->小さい値の順)
    $i ID
    0 6
    1 5
    2 4
    3 3
    4 2
    5 1
    5.てことは $i が 2 より小さい場合 (2 > $i++) つまり
    $i ID
    0 6
    1 5
    にだけ NEW がつきます。

    ちなみに $i++ は $i の値を評価したあとに $i を +1 するので
    $i=0 のとき if( 2 > $i++ ) は if( 2 > 0 ) となります。

    スレッド開始 Naoki-Jo

    (@naoki-jo)

    なるほど! 理解できました。ありがとうございます。

    これだとIDの大小は関係なく、query_posts で取得した並び順が判定の基準になるということですね。

    それで、記事を日付順にならべても、ID順に並べても、結果としては上から2つの記事にNEWがつくということになっていたんですね。

    これですと、意図した表示

    こちらは、日付順に表示
    投稿日時 ID
    NEW 8月11日(水) 4
        8月13日(金) 2
        8月15日(日) 1
    NEW 8月18日(水) 6
    NEW 8月21日(土) 5
        8月22日(土) 3
    
    こちらはID順(新しい投稿ほど上)に表示
    投稿日時 ID
    NEW 8月18日(水) 6
    NEW  8月21日(土) 5
    NEW  8月11日(水) 4
         8月22日(土) 3
         8月13日(金) 2
         8月15日(日) 1

    はできないかと思います。

    何か記事のID情報を取得して、大きいほうから3つにNEWをつけるといったような方法はないものでしょうか。

    ちなみに、

    if ( get_the_ID() > $kiji_id - 3 ) {
      // NEW を表示、の処理をここに書く
    }

    の方針でやってみましたが、全ての記事にNEWがついて、さらになぜか、タイトルリストの一番最初にふたつ分の記事のIDが表示されて、記事のタイトルが並ぶというような状態になってしまいました。これです。

    <?php query_posts( 'cat=3&orderby=ID&order=DESC');?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <?php $kiji_id=the_ID(); ?>
     <?php endwhile; else: ?>
    <?php endif; ?>
    
    <?php
    query_posts( 'posts_per_page=10&cat=3&orderby=date&order=ASC');?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    
    <?php if ( get_the_ID() > $kiji_id - 3):?>
       <img src="イメージのURL" alt="New" />
      <?php endif; ?>
    
      <a href="<?php the_permalink(); ?>"><?php the_title(); ?><br></a>
      <?php endwhile; else: ?>
    記事はありません
    <?php endif; ?>
    <?php wp_reset_query(); ?>

    何かいい方法なないでしょうか。

    offsetを使って、上から4番目の投稿IDを取得して、ループの投稿IDと比較する、という方法でいけそうですけど。

    <?php
    //4番目の投稿IDを取得
    $myposts = get_posts('numberposts=1&orderby=ID&order=DESC&offset=3category=3');
    foreach($myposts as $post) { $kiji_id = $post->ID; }
    ?>
    
    <?php
    query_posts('posts_per_page=10&cat=3&orderby=date&order=ASC');
    if(have_posts()): while(have_posts()): the_post();
    
    //4番目の投稿IDより大きければ
    if(get_the_ID() > $kiji_id): ?>
    <img src="イメージのURL" alt="New" />
    <?php endif; ?>
    
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?><br /></a>
    <?php endwhile; else: ?>
    記事はありません
    <?php endif; wp_reset_query(); ?>

    もっとスマートな方法がありそうですね・・・。

    わ、Kzさんとかぶってしまいました。私のは無視して下さい…。

    全ての記事にNEWがついて

    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <?php $kiji_id=the_ID(); ?>
    <?php endwhile; else: ?>

    で一番最後(ID最小値)までループをまわしてるのと、

    一番最初にふたつ分の記事のIDが表示されて

    <?php $kiji_id=the_ID(); ?>

    the_ID()は値を「出力」するので、値を取得するなら get_the_ID() が正解、

    がこんがらがって結局 $kiji_id に最新(最大)の ID 値が入ってないためです。

    というわけで

    <?php query_posts( 'cat=3&orderby=ID&order=DESC');?>
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    <?php $kiji_id=the_ID(); ?>
    <?php endwhile; else: ?>
    <?php endif; ?>

    <?php
    query_posts( 'cat=3&orderby=ID&order=DESC&posts_per_page=1');
    if ( have_posts() ) {
      the_post();
      $kiji_id = get_the_ID();
    }
    wp_reset_query();
    ?>

    とすれば OK(未検証)。

    スレッド開始 Naoki-Jo

    (@naoki-jo)

    みなさんのおかげで希望通りの表示ができるようになりました。
    ありがとうございます。

    以下のようなコードで実現しました。

    <?php
    query_posts( 'cat=3&orderby=ID&order=DESC&posts_per_page=1');
    if ( have_posts() ) {
      the_post();
      $kiji_id = get_the_ID();
    }
    wp_reset_query();
    ?>
    
    <?php
    query_posts( 'posts_per_page=10&cat=3&orderby=ID&order=DESC');?>
    
    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    
    <?php if ( get_the_ID() > $kiji_id - 4):?>
    <img src="リンク画像" alt="New" />
      <?php endif; ?>
      <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
      <?php endwhile; else: ?>
    記事はありません
    <?php endif; ?>
    <?php wp_reset_query(); ?>
15件の返信を表示中 - 1 - 15件目 (全15件中)
  • トピック「投稿IDの情報をもとにNEWアイコンを表示」には新たに返信することはできません。