WP: テンプレートタグ get_posts で新着記事リスト等を表示
update 4.8: コード・問題点を追記。
以前、WPJフォーラムに Nao さんが書いていらっしゃった get_posts() を用いた記事一覧表示。
どのような表示バリエーションができるかを、実際に試していってみる。
サイドバーやあちこちで使いまくっているプラグイン Customizable Post Listings が、WP2.1 以降に対応されるか分からないので、このタグで簡単に出来るといいなあ。私としては、パラメータに変数を渡せるかがポイント。
この記事は書き途中です。試したコードを追記していきます。
目次:
参考資料
- WordPress Japan フォーラム » カテゴリーごとに最新記事タイトルを表示 の Nao さんの投稿
- WordPress Codex » Template Tags/get posts
- Wptags.com » get_posts
- ループとは?
- WordPress Codex » The Loop [en]
- WPJ Codex » ループ [ja]
get_posts の説明
Codex 全訳。でも、怪しい。。
説明
マルチループ(複数ループ)を作成するためのシンプルなタグ。
使い方
<?php get_posts('arguments'); ?>1
例
Generate list
ブログのフロントページに最新の記事 1件のみ表示するよう設定していて、その次から5件かつカテゴリID 1 の記事の、リンクと抜粋文を表示したいとき、コードは次のようになる:
<ul>
<?php
$myposts = get_posts('numberposts=5&offset=1&category=1');
foreach($myposts as $post) :
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> --- <?php the_excerpt(); ?></li>
<?php endforeach; ?>
</ul>
上記クエリは、1件以上の記事があるカテゴリで使うべき。
Generate another list
ウェブページに 10件の記事をアルファベットの昇順で表示したい場合、投稿日・タイトル・抜粋文を出すには次のようにする:
<?php
$postslist = get_posts('numberposts=10&order=ASC&orderby=post_title');
foreach ($postslist as $post) : start_wp(); ?>
<?php the_date(); echo "<br />"; ?>
<?php the_title(); ?>
<?php the_excerpt(); ?>
<?php endforeach; ?>
? start_wp() は何をするものだろう?
Access all post data
様々な理由で、デフォルトでは、記事 ID や the_content() 経由での記事本文のようないくつかのデータが get_posts で取得できない。これは、内部関数 setup_postdata() を $post 配列で呼ぶと解決できる。
<?php
$lastposts = get_posts('numberposts=3');
foreach($lastposts as $post) :
setup_postdata($post);
?>
<a href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>"><?php the_title(); ?></a>
<?php the_content(); ?>
<?php endforeach; ?>
setup_postdata を呼ばずに ID 等を取得する別の方法としては、"$post->ID" や "$post->post_data"(記事本文) がある。これで内部関数を呼ぶことを避けられる。2
? ↑その方がいいという意味?
パラメータ
numberposts- (整数) 返す記事の数。デフォルトは 5。
offset- (整数) 先頭から何件の記事を除外するか。デフォルトは 0。
category- (整数) 指定するカテゴリID の記事のみ表示。デフォルトなし。
orderby-
(文字列) どの項目で記事をソートするか。次の値など:
'post_title'– ページ・記事タイトル3 のアルファベット順にソート(デフォルト)'post_date'– 投稿日時順にソート'post_modified'– 更新日時順にソート'ID'– 記事ID でソート'post_author'– 著者の ID 番号でソート'post_name'– 投稿スラッグのアルファベット順にソート- この値は wp_post table のどのフィールド名でも可能。
order-
(文字列) ソート順。値は次のどちらか:
'ASC'– 昇順(値 小→大)にソート。4'DESC'– 降順(値 大→小)にソート(デフォルト)。
実践
動作確認: WordPress ME 2.0.4
コードは、上手く表示できたら書いていく。
コード・表示見本の組で書きたかったが、記事内でコードを動かすと syntax error になるので、表示見本は欄外に載せる。
(例1)5件表示・WPカテゴリ
<ul>
<?php
$myposts = get_posts('numberposts=5&category=2');
foreach($myposts as $post) : ?>
<li><?php the_time('Y.n.j'); ?> <a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>
(例2)例1 +先頭から2件オフセット
<ul>
<?php
$myposts = get_posts('numberposts=5&category=2&offset=2');
foreach($myposts as $post) : ?>
<li><?php the_time('Y.n.j'); ?> <a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>
(例3)5件表示・WPカテゴリ・昇順
<ul>
<?php
$myposts = get_posts('numberposts=5&category=2&order=ASC');
foreach($myposts as $post) : ?>
<li><?php the_time('Y.n.j'); ?> <a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>
(例4)更新日降順に5件表示
「更新日: リンク付きタイトル (投稿日)」を表示するリスト。
更新日時の表示コードは、うちで現在使っているもの(自己流)。WP 2.1 系ならテンプレートタグが使える。
<ul>
<?php
$myposts = get_posts('numberposts=5&orderby=post_modified');
foreach($myposts as $post) : ?>
<li><?php echo date("Y.n.j", strtotime($post->post_modified)); ?>: <a href="<?php the_permalink() ?>"><?php the_title(); ?></a> (<?php the_time('Y.n.j'); ?>)</li>
<?php endforeach; ?>
</ul>
(例5)例1 で、表示件数・カテゴリID を変数で渡すテスト
うちのサイドバーの新着記事・更新記事・新着コメントのリストは、カテゴリID を変数で渡して、コンテンツ部のカテゴリとマッチするものを表示させている(例)。
同様に、get_posts にも変数でカテゴリID を渡せるといいな、というテスト。
例えば、
$mycat = 2;
$myposts = get_posts('numberposts=5&category=$mycat');
上のように、arguments の中に直接変数を書くのはダメだった。wp_post2cat.category_id = $mycat でデータを抽出しにいってしまう。
arguments を文字列として事前に作っておくと、動作した。
テストなので変なコードだけど、こんなの(↓)は OK。
<?php
$mynumpost = 5;
$mycat = 2;
$getstr = "numberposts=".$mynumpost."&category=".$mycat;
?>
<ul>
<?php
$myposts = get_posts($getstr);
foreach($myposts as $post) : ?>
<li><?php the_time('Y.n.j'); ?> <a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>
(例6)修正概要を表示するテスト
これから。
問題点
今のうちのサイトでの Customizable Post Listings の使い方と比較した場合。
- 「ページ」が非対象。
代案:- 自分用にカスタマイズした関数を作る。
- Customizable Post Listings を自分で WP2.1 用に作り直す。既に誰かが作っててもよさそうなので、並行して探しているが、まだ見つかっていない。
- 「ページ」→「記事」に切り替え。。orz
使える場所の制限
- 本文内で使うと syntax error エラー。
- ループ内で使うと、本文以降の表示が、記事リストの最後の記事のものに差し替わってしまう。
例えば、この記事のコメント欄に、記事リストの最後の記事のコメントが表示されたり。
コードの書き方の問題なのかなあ。
代案: 現在本文内で CPL を使っているのは「ページ」なので、本文から出してページテンプレに書くとか?
- arguments = 引数[back]
- Another way to access the ID, without having to call setup_postdata, is to just do “$post->ID”, or “$post->post_data” for the content. This lets you avoid calling internal functions.[back]
- 原文に「by Page/post title」とあるが、ページは対象外のような。。一応、後でソースをチェック。[back]
- Codex には
'ASC'がデフォルトとあるが、実際には'DESC'がデフォルトみたい。[back]
[...] コンタ says: 2008.4.6 at 15:35 [...]
[...] [...] 詳しい説明はこちらにありますが、補足として、categoryパラメータを-表示にすることで特定のカテゴリを非表示にできます。 [...] 返事を書く [...]
[...] Another way to access the ID, without having to call setup_postdata, is to just do “$post->ID”, or “$post->post_data” for the content. This lets you avoid calling internal functions.[back] [...]
[...] 問題点 [...]
[...] (例2)例1 +先頭から2件オフセット [...]
[...] Generate another list [...]
[...] 参考資料 [...]
[...] 引用元: power source* » WP: テンプレートタグ get_posts で新着記事リスト等を表示. [...]
[...] 詳しい説明はこちらにありますが、補足として、categoryパラメータを-表示にすることで特定のカテゴリを非表示にできます。 [...]
[...] http://bono.s206.xrea.com/2007/04/394-wp_get_posts/ [...]
[...] こちらのサイトを参考にしました。 By Pizza_N in 未分類 You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site. [...]
コンタさん、はじめまして、こんにちは。
「子カテゴリー内の記事」は、具体的にはどのように表示したいですか?
きっと、単純に子カテゴリのID を指定するのとは違うということですよね。。?
表示したい場所や表示例などを書いていただけると、何か分かるかもしれません。
あと、get_posts の解説の最新版がこちらにあるので、あわせてご覧になってみてください。
テンプレートタグ/get posts – ps*wiki
古い記事へのコメント、失礼いたします。
PHPの勉強中です。
こちらに書かれている「新着記事リストをカテゴリー別に出す」ということをしたくて色々と調べています。
5件表示・WPカテゴリ・昇順
を試させていただき、思ったようなことが出来ました。
更に子カテゴリー内の記事も表示させたいと思うのですが、うまくいきません。
大変不躾なお願いですが、何かアドバイスいただけませんか。
よろしくお願いいたします。
[...] get_postの引数に変数を使う方法です。 こちらのページに書いてあるようにすれば可能なようです。 power source* » WP: テンプレートタグ get_posts で新着記事リスト等を表示 [...]
ともかめさん、はじめまして。書き込みありがとうございます。
読みにくさ満点の記事にもかかわらず、うれしいお言葉をいただけて感激ですー。ありがとうございます。(*’-'*)
ともかめさんのサイトを拝見しました。Customizable Post Listings、動いていますねー。
プラグイン中で使われているテーブル関係の変数が 2.2 で削除されたので、動かないだろうと思ってたんです。ちょうど 2.2 対応+α版を作ろうとしていたところでした。
うれしいのですけれど不思議でもあるので、もう一度ソースなどを確認してみますね。
最新版で動かないよー、という話を聞かないので、日本語ユーザはあまりいないのかなあ。。と、さみしく思っていました。
貴重な情報をありがとうございました。
ともかめさんのサイトのデザインは見やすいですね。うらやましいです。。うちはごちゃごちゃしてるので、ともかめさんを見習って直していきたいなあと思いました。
これからもよろしくお願いいたします。(^-^
ぼのさん、初めまして、こんばんは。ともかめと申します。
自分が新たに WordPress を使い始めるとき、ぼのさんの記事を大変参考にさせていただきました(とくにプラグイン!)。遅ればせながら、ありがとうございます。これからも記事、楽しみにしています。
さて、突然ですが、わたしのサイトで WordPress ME2.2.1 × Customizable Post Listings を使っていまのところ正常に動作しているので、すでにご存知かもしれませんがご報告です。とはいえ、「c2c_get_recently_modified」しか使ってないので、検証としてははなはだ頼りないですが……もちろん、ME2.1 系でもちゃんと動作していました。サイト右下の「最近更新された記事」です。ご参考までに……