投稿IDの情報をもとにNEWアイコンを表示
-
投稿IDの情報をもとにNEWアイコンを表示させようと思っているのですが、いろいろ試してみましたがうまくいきません。
日時情報をもとに表示させてしまうと、未来日時の投稿などもあるので、それに対してNewがついてしまうので、投稿IDをもとにつけたいと思っています。
投稿IDは最新の記事のほうが数字が大きくなっていっているようなので、
最近投稿された3件のみNewをつけるとすると、
比べる側の記事ID > 現在の最新の記事ID-3
ならば、newアイコンをつける
というような形をとればいいと思うのですが、
やり方がわかりません。どうすればいいかぜひ教えてください。
-
う~ん、未来日時の投稿にNewをつけたくないと言うのは分かりますが、未来日時の投稿にも投稿IDはあって、当然新しい順に投稿IDは大きくなっているので・・・だめっすよね(汗)
で、日時情報を元にNewをつける方向で考えて、「未来投稿の日時情報>現在の日付>Newをつけたい記事の日時情報」と現在の日付を基準にすればよいと思いますが、どうでしょう?
私のサイトの投稿の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 かどうかで判断できるのではないでしょうか。
未来の投稿は表示させるように設定
どうやって設定しているかを書いていただくと、よりステキです。
予約投稿の表示を query_posts() でゴニョゴニョしているとして:
投稿 ID の大きい順にいくつ、なら<?php query_posts( '現在の設定&orderby=ID&order=DESC'); $i = 0; while( have_posts() ) { the_post(); if( 2 > $i++ ) { // new を付ける } (省略) } wp_reset_query(); ?>
な感じでいかがでしょうか。
アドバイスありがとうございます。試してみましたが、意図したものとはちょっと違う動きでした。
未来投稿はプラグインの「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 を表示、の処理をここに書く }
※記事の 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 を参照してください。
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 ) となります。なるほど! 理解できました。ありがとうございます。
これだと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(未検証)。
みなさんのおかげで希望通りの表示ができるようになりました。
ありがとうございます。以下のようなコードで実現しました。
<?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(); ?>
- トピック「投稿IDの情報をもとにNEWアイコンを表示」には新たに返信することはできません。