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

Change Style


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

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

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

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

参考資料

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>
          

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

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

  1. ともかめ :

    ぼのさん、初めまして、こんばんは。ともかめと申します。
    自分が新たに WordPress を使い始めるとき、ぼのさんの記事を大変参考にさせていただきました(とくにプラグイン!)。遅ればせながら、ありがとうございます。これからも記事、楽しみにしています。

    さて、突然ですが、わたしのサイトで WordPress ME2.2.1 × Customizable Post Listings を使っていまのところ正常に動作しているので、すでにご存知かもしれませんがご報告です。とはいえ、「c2c_get_recently_modified」しか使ってないので、検証としてははなはだ頼りないですが……もちろん、ME2.1 系でもちゃんと動作していました。サイト右下の「最近更新された記事」です。ご参考までに……

  2. ぼの :

    ともかめさん、はじめまして。書き込みありがとうございます。
    読みにくさ満点の記事にもかかわらず、うれしいお言葉をいただけて感激ですー。ありがとうございます。(*’-'*)

    ともかめさんのサイトを拝見しました。Customizable Post Listings、動いていますねー。
    プラグイン中で使われているテーブル関係の変数が 2.2 で削除されたので、動かないだろうと思ってたんです。ちょうど 2.2 対応+α版を作ろうとしていたところでした。
    うれしいのですけれど不思議でもあるので、もう一度ソースなどを確認してみますね。
    最新版で動かないよー、という話を聞かないので、日本語ユーザはあまりいないのかなあ。。と、さみしく思っていました。
    貴重な情報をありがとうございました。 :-)

    ともかめさんのサイトのデザインは見やすいですね。うらやましいです。。うちはごちゃごちゃしてるので、ともかめさんを見習って直していきたいなあと思いました。
    これからもよろしくお願いいたします。(^-^

  3. 5×2.info» ブログアーカイブ » WordPressのget_postで変数を使う :

    [...] get_postの引数に変数を使う方法です。 こちらのページに書いてあるようにすれば可能なようです。 power source* » WP: テンプレートタグ get_posts で新着記事リスト等を表示 [...]

  4. コンタ :

    古い記事へのコメント、失礼いたします。
    PHPの勉強中です。

    こちらに書かれている「新着記事リストをカテゴリー別に出す」ということをしたくて色々と調べています。

    5件表示・WPカテゴリ・昇順

    を試させていただき、思ったようなことが出来ました。
    更に子カテゴリー内の記事も表示させたいと思うのですが、うまくいきません。
    大変不躾なお願いですが、何かアドバイスいただけませんか。

    よろしくお願いいたします。

  5. ぼの :

    コンタさん、はじめまして、こんにちは。

    「子カテゴリー内の記事」は、具体的にはどのように表示したいですか?
    きっと、単純に子カテゴリのID を指定するのとは違うということですよね。。?
    表示したい場所や表示例などを書いていただけると、何か分かるかもしれません。 :-)

    あと、get_posts の解説の最新版がこちらにあるので、あわせてご覧になってみてください。
    テンプレートタグ/get posts - ps*wiki

  6. NFHニュースの時間です。 » 続・WordPress テーマ作り。 :

    [...] こちらのサイトを参考にしました。 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. [...]

コメントをどうぞ