HoBoFoTo

Hobo everyday foto.

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

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

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

<?php
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');


    $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へ

コメントを残す

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