WP: テンプレートタグ get_posts で新着記事リスト等を表示
以前、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 全訳。でも、怪しい。。
説明
マルチループ(複数ループ)を作成するためのシンプルなタグ。
使い方
1
例
Generate list
ブログのフロントページに最新の記事 1件のみ表示するよう設定していて、その次から5件かつカテゴリID 1 の記事の、リンクと抜粋文を表示したいとき、コードは次のようになる:
- 上記クエリは、1件以上の記事があるカテゴリで使うべき。
Generate another list
ウェブページに 10件の記事をアルファベットの昇順で表示したい場合、投稿日・タイトル・抜粋文を出すには次のようにする:
<?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配列で呼ぶと解決できる。<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カテゴリ
- → 表示例1
(例2)例1 +先頭から2件オフセット
- → 表示例2
(例3)5件表示・WPカテゴリ・昇順
- → 表示例3
(例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]
関連ページ
- 「ページ」が非対象。
- → 表示例3
- → 表示例2



ともかめ :
July 6th, 2007 at 21:59
ぼのさん、初めまして、こんばんは。ともかめと申します。
自分が新たに WordPress を使い始めるとき、ぼのさんの記事を大変参考にさせていただきました(とくにプラグイン!)。遅ればせながら、ありがとうございます。これからも記事、楽しみにしています。
さて、突然ですが、わたしのサイトで WordPress ME2.2.1 × Customizable Post Listings を使っていまのところ正常に動作しているので、すでにご存知かもしれませんがご報告です。とはいえ、「c2c_get_recently_modified」しか使ってないので、検証としてははなはだ頼りないですが……もちろん、ME2.1 系でもちゃんと動作していました。サイト右下の「最近更新された記事」です。ご参考までに……
ぼの :
July 9th, 2007 at 23:58
ともかめさん、はじめまして。書き込みありがとうございます。
読みにくさ満点の記事にもかかわらず、うれしいお言葉をいただけて感激ですー。ありがとうございます。(*’-'*)
ともかめさんのサイトを拝見しました。Customizable Post Listings、動いていますねー。
プラグイン中で使われているテーブル関係の変数が 2.2 で削除されたので、動かないだろうと思ってたんです。ちょうど 2.2 対応+α版を作ろうとしていたところでした。
うれしいのですけれど不思議でもあるので、もう一度ソースなどを確認してみますね。
最新版で動かないよー、という話を聞かないので、日本語ユーザはあまりいないのかなあ。。と、さみしく思っていました。
貴重な情報をありがとうございました。
ともかめさんのサイトのデザインは見やすいですね。うらやましいです。。うちはごちゃごちゃしてるので、ともかめさんを見習って直していきたいなあと思いました。
これからもよろしくお願いいたします。(^-^
5×2.info» ブログアーカイブ » WordPressのget_postで変数を使う :
February 16th, 2008 at 21:08
[...] get_postの引数に変数を使う方法です。 こちらのページに書いてあるようにすれば可能なようです。 power source* » WP: テンプレートタグ get_posts で新着記事リスト等を表示 [...]
コンタ :
April 6th, 2008 at 15:35
古い記事へのコメント、失礼いたします。
PHPの勉強中です。
こちらに書かれている「新着記事リストをカテゴリー別に出す」ということをしたくて色々と調べています。
5件表示・WPカテゴリ・昇順
を試させていただき、思ったようなことが出来ました。
更に子カテゴリー内の記事も表示させたいと思うのですが、うまくいきません。
大変不躾なお願いですが、何かアドバイスいただけませんか。
よろしくお願いいたします。
ぼの :
April 8th, 2008 at 3:23
コンタさん、はじめまして、こんにちは。
「子カテゴリー内の記事」は、具体的にはどのように表示したいですか?
きっと、単純に子カテゴリのID を指定するのとは違うということですよね。。?
表示したい場所や表示例などを書いていただけると、何か分かるかもしれません。
あと、get_posts の解説の最新版がこちらにあるので、あわせてご覧になってみてください。
テンプレートタグ/get posts - ps*wiki
NFHニュースの時間です。 » 続・WordPress テーマ作り。 :
May 27th, 2008 at 15:05
[...] こちらのサイトを参考にしました。 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. [...]