【至急・重要】ウィルスチェックのお願い


WP: テンプレートタグ get_posts で新着記事リスト等を表示

update 4.8: コード・問題点を追記。

以前、WPJフォーラムに Nao さんが書いていらっしゃった get_posts() を用いた記事一覧表示。
どのような表示バリエーションができるかを、実際に試していってみる。

サイドバーやあちこちで使いまくっているプラグイン Customizable Post Listings が、WP2.1 以降に対応されるか分からないので、このタグで簡単に出来るといいなあ。私としては、パラメータに変数を渡せるかがポイント。

この記事は書き途中です。試したコードを追記していきます。

参考資料

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>

→ 表示例1

(例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>

→ 表示例2

(例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>

→ 表示例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>

→ 表示例4

(例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>

→ 表示例5

(例6)修正概要を表示するテスト

これから。

問題点

今のうちのサイトでの Customizable Post Listings の使い方と比較した場合。

  • 「ページ」が非対象。 今さら気づいたー!Σ(゜д゜lll)
    代案:
    • 自分用にカスタマイズした関数を作る。
    • Customizable Post Listings を自分で WP2.1 用に作り直す。既に誰かが作っててもよさそうなので、並行して探しているが、まだ見つかっていない。
    • 「ページ」→「記事」に切り替え。。orz
  • 使える場所の制限

    • 本文内で使うと syntax error エラー。
    • ループ内で使うと、本文以降の表示が、記事リストの最後の記事のものに差し替わってしまう。
      例えば、この記事のコメント欄に、記事リストの最後の記事のコメントが表示されたり。
      コードの書き方の問題なのかなあ。

    代案: 現在本文内で CPL を使っているのは「ページ」なので、本文から出してページテンプレに書くとか?

  1. arguments = 引数[back]
  2. 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]
  3. 原文に「by Page/post title」とあるが、ページは対象外のような。。一応、後でソースをチェック。[back]
  4. Codex には 'ASC' がデフォルトとあるが、実際には 'DESC' がデフォルトみたい。[back]

YOU、これも読んじゃないなYO!

16 Responses to “WP: テンプレートタグ get_posts で新着記事リスト等を表示”

コメントをどうぞ

ファイルアップロード

画像やファイルをコメント内に表示できます。ファイルを選ぶと、このサイトのサーバにアップロードされ、コメント欄にリンクが挿入されます。ファイルは複数アップロードできます。

  • あなたのコンピュータ上のファイル名がそのまま使われます。
  • アップロードするファイルを間違えたたときは、URLの行を削除して、ファイル名を教えてください。コメントには表示されません。
  • 他の人の著作物は勝手にアップしちゃダメだよー。


※ XREA無料サーバのため広告表示が義務となっています。お許しを。。