HoBoFoTo

Hobo everyday foto.

日本語 English

カスタム投稿 をアルファベット順見出し付きのリスト表示にする

あんまり必要な人はいないと思いますが、このサイトでやっているWordPressAPIリストの表示はショートコードを使って実現しています。もし何かの参考になればと思い乗せておきますね。

まずコード全体を見てもらいましょう。

<?php
function yoshi_wordpressapi_list($html) {
    $message=array();
    $buf="";
    $alphabets = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');


    $args = array(
        'post_type'   => array('wordpressapi'),
        'orderby'     => 'title',
        'order'       => 'ASC',
        'posts_per_page' => -1,
        
    );
    $posts = get_posts($args);
    foreach( $posts as $post ) : setup_postdata( $post );
        $message[]=get_the_title( $post ).",<a href=\"".get_permalink( $post )."\">".get_the_title( $post )."</a>";
    endforeach;
    foreach($alphabets as $alphabet):
        if(preg_grep("/^$alphabet.*/i", $message)){
            $in_messages=preg_grep("/^$alphabet.*/i", $message);
            $buf=$buf."<h3>".$alphabet."</h3><ul>";
            foreach($in_messages as $in_message):
                $pieces = explode(",", $in_message);
                $buf=$buf."<li>".$pieces[1]."</li>";
            endforeach;
            $buf=$buf."</ul><br/>\n";
        }
    endforeach;
    return $buf;
}
add_shortcode('list', 'yoshi_wordpressapi_list');

まず、

function yoshi_wordpressapi_list($html) {
    $message="";
    $buf="";
    $alphabets = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
}
add_shortcode('list', 'yoshi_wordpressapi_list');

で関数yoshi_wordpressapi_listというの作っています。そして初めにいくつかの変数を初期化しています。最後の行でショートコード[list]に関連付けを行っています。

その次の

    $args = array(
        'post_type'   => array('wordpressapi'),//カスタム投稿wordpressapiを選択
        'orderby'     => 'title',//タイトルを基準に
        'order'       => 'ASC',//降順で
        'posts_per_page' => -1,//-1にするとすべてのページになる
        
    );
    $posts = get_posts($args);

で、カスタム投稿であるWordPressAPIの投稿を15行目のget_posts()を使って、タイトルの昇順ですべて変数$postsにとりだしています。

    foreach( $posts as $post ) : setup_postdata( $post );
        $message[]=get_the_title( $post ).",<a href=\"".get_permalink( $post )."\">".get_the_title( $post )."</a>";
    endforeach;

次にforeach文を使って、setup_postdata()でとりだした投稿を配列$messageにget_the_title()でタイトルと、get_permalink()でリンクを設定しています。

    foreach($alphabets as $alphabet):
        if(preg_grep("/^$alphabet.*/i", $message)){
            $in_messages=preg_grep("/^$alphabet.*/i", $message);
            $buf=$buf."<h3>".$alphabet."</h3><ul>";
            foreach($in_messages as $in_message):
                $pieces = explode(",", $in_message);
                $buf=$buf."<li>".$pieces[1]."</li>";
            endforeach;
            $buf=$buf."</ul><br/>\n";
        }
    endforeach;

最後に、19行目で配列$alphabetsから一つずつアルファベットをとりだし、20行目のif文で$messageの第1引数にしたタイトルの一文字目と比べています。

もしタイトルの一文字目と同じならば、21行目でまずそのアルファベットと一文字目が同じアルファベットを持つ投稿をすべて配列$in_messageにとりだします。

その後、22行目でアルファベットを<h3>タグで出力し、23行目から26行目までのforeach文で$in_messageに入っているリンクを出力していきます。

 

わかりにくかったかもしれませんが、上のカスタム投稿IDのwordpressapiを入れ替えればアルファベット順で出力されると思います。

 

よかったらクリックしてください。
にほんブログ村 IT技術ブログ WordPressへ

共有:

コメント一覧

  1. はじめまして
    まさにこれと同じことをしたく検索から、やっとたどり着きました!
    function.phpにそのままコピペし、post_typeのところを変更しテンプレートで実行をさせたのですが動かず…
    私にはどこを直したら良いのかわからず、ご教授いただけたら嬉しいです。

    • Dr?Thomas より

       私のサイトではこれで動いているので、なんともいえませんが・・・
       もしよろしければ、WordPressをインストールしているトップフォルダに「wp-config.php」があります。そこに書いてある、「define(‘WP_DEBUG’, false);」を
      「define(‘WP_DEBUG’, ture);」に変えてアップロードし、出てくるエラーを教えていただければ少しは、ご協力できるかもしれません。

      • ご返答ありがとうございます!
        「define(‘WP_DEBUG’, ture);」に変えてエラーを見てみました(この方法があったんですね…)
        そしてエラーの文章を検索してみたところ、解決方法が書かれているサイトがあり
        そこを参考に書き換えることで解消がされました!

        上記の全体コードで言う17行目に『Fatal error: Uncaught Error: [] operator not supported for strings in〜〜』が出ていたので
        3行目の「$message=””;」を「$message=array();」に変更をしたら
        表示されました!

        本当にありがとうございました!!
        やりたいことも実現されていたので大変助かりました。

        • たびたびすみません。。
          実際に表示する部分をカスタマイズしています。
          カスタムフィールドの値を表示させたりしたいので、post_idを取得したく
          17行目の上に「$post_id=get_the_ID( $post );」と入れてみたのですが
          最初の投稿のIDだけ取得してしまって…
          書くべき場所はここではないのか、別の書き方が必要なのか。。初歩的な質問かとは思いますがご教授いただけたら嬉しいです。
          何卒よろしくお願いいたします。

          • get_the_ID( $post )では、現在の表示されているページのIDしか取得されません。ですので「$post_id=$post->ID;」を使ってもらうと上手くいくと思います。

          • ご返答ありがとうございます。
            初歩的なところでしたね。。無事やりたいことが実現できました!本当にありがとうございました!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です