京都大学東南アジア地域研究研究所 情報処理室

List View for Posts

投稿、カスタム投稿、固定ページ、イベントプラグイン(The Event Calendar)の一部をまとめて一覧表示するためのプラグインです。
加えて、プラグイン「WPML」による多言語機能に対応しています。日本語サイトは日本語だけ、英語サイトは英語だけの一覧表示ができます。

作成したばかりのプラグインのため、特にHTML出力のためのテンプレートはデフォルト(”li”)を除き、微調整していきます。

List View for Posts

変更履歴

ショートコード

デフォルトでは、「投稿」の一覧表示となります。表示形式は <li>と<span>タグです。

を使えば、<p>と <span>タグで表示されます。
それ以外にも現在テンプレートは、li, p, dd, lip の4種類を用意しています。
また、後述するフックを使えば、出力データを自分のテーマに合わせたカスタマイズできます!

ショートコードオプション(Version 1.0)

オプションを利用することで多彩な設定が可能になります。
カテゴリーやカスタム投稿名をカテゴリー表示したり、予約記事やパスワード保護(保護はされたまま)記事の表示、日付フォーマット変更なども可能です。また50〜100件まで表示など、表示箇所の指定もできるのでテンプレートなどでループすることで、ページ送り機能にも活用できるのではと思います。

※プラグイン「WPML」が有効な場合、現在の表示言語のみが一覧表示に出ます。これを変更したい場合には、wpml_lang オプションを使います。
また、WPML設定の翻訳オプションから本ショートコードで利用したいカスタム投稿やタクソノミー等については「翻訳する」を設定してください。「翻訳しない」に設定されたものは表示されません

各オプションの説明は下記の通りです。

 

事例

便利そうな事例を見つけたら増やしていきます。
ざっとした TiPSは日本語のみですが、筆者個人ブログに掲載しています。

事例1)カスタム投稿タイプで、複数のカテゴリー(タクソノミー)を一覧表示する

とした場合、ショートコードは

となり出力コードは次のようになります。実際には一項目一行ですが、下記は分かりやすくするために適宜改行しています。

<li class='list-view-posts_item'>
  <span class='list-view-posts_date'>2017.08.29</span>
  <span class='list-view-posts_post_type'>FAQ</span>
  <span class='list-view-posts_category_troubleshooting'>
     <a class='list-view-posts_category_link_troubleshooting'> href='***/faq_type/troubleshooting/'>トラブル解決</a>
  </span>
  <span class='list-view-posts_category_windows'>
     <a class='list-view-posts_category_link_windows' href='http://localhost/wordpress-single/os/windows/'>Windows</a>
  </span> 
  <a class='list-view-posts_link' href='****/faq/*****'>Windowsでデータを救出する方法</a>
</li>

 

フックの使い方

以下、サポートしているフックを テーマのための関数「functions.php」 内でどのように記述するかの例をあげておきます。 フックを利用すると fucntions.php やプラグインから出力データを変更できます。意図せぬ変更を防ぐために、ショートコードに「hook_secret_key」オプションを設定し、このhook_secret_key と、フック内の hook_secrey_key が一致するときのみ有効となります。

フックで活用できる配列

$out_atts として受け渡されます。
extract($out_atts);
を使えば、下記の変数として利用できます。
ショートコードオプションとして与えた値に対して、プログラム処理しやすいように一部配列に変換しているものもあります。

フック:lvp_each_item

例として、 includes/tags/lip.php と同じ表示として、次のHTMLコードを出力することにします。
※筆者はデザイン力皆無のため、このHTMLコードが冗長すぎることはご容赦ください。一応カテゴリーは <span></span> で括るようにしてます。

<li class='list-view-posts_item'>
  <p class='list-view-posts_date'><span>2017.08.29</span></p>
  <p class='list-view-posts_post_type'><span>FAQ</span></p>
  <p class='list-view-posts_category_troubleshooting'>
     <span><a class='list-view-posts_category_link_troubleshooting' href='***/faq_type/troubleshooting/'>トラブル解決</a></span>
  </p>
  <p class='list-view-posts_category_windows'>
     <span><a class='list-view-posts_category_link_windows' href='***/os/windows/'>Windows</a></span>
  </p> 
  <a class='list-view-posts_link' href='****/faq/*****'>***トラブルの解決方法</a>
</li>

 

まずショートコードオプションとして、hook_secret_key を設定します。ここでは値を hogehoge にしています。
実際には類推しにくい値にすることを勧めます。

重要なのは、hook_secrey_key を設定することです。

以下、テーマの functions.php に記載します。
必ず  return array(‘hook_secret_key’=>’hogehoge‘, ‘data’=>$out_temp); の  ‘hook_secret_key’ の値に ‘hogehoge‘ を設定してください。
これが一致しない場合には、フックは適用されません。カテゴリーの表示・非表示部分がコードの大半を占めています。そのあたりはいらないぜ〜ってことなら、とても短いコードになります。

add_filter( 'lvp_each_item' , 'lvp_each_item_fix' , 10 , 2 );

function lvp_each_item_fix($out, $out_atts){
   extract($out_atts);

$output_category_temp = '';
$output_category_temp_post_type = '';
$output_category_temp_category = '';

if(!empty($enable_view_post_type)):
    if( ! isset($default_post_types[get_post_type_object(get_post_type())->name]) ? $default_post_types[get_post_type_object(get_post_type())->name] : "" ):
        $custom_category_label = esc_html( get_post_type_object(get_post_type())->label );
        $output_category_temp_post_type = "<p class='{$html_tag_class}_post_type'><span>$custom_category_label</span></p>";
    endif;
endif;

if(!empty($enable_view_category)):
    foreach($category_taxonomy as $cat):
        $terms = get_the_terms($post->ID, $cat);
        if($terms && !is_wp_error($terms)):
            $term  = esc_html( isset($terms[0]->name) ? $terms[0]->name : "" ); // Only get first value in the terms.
            $term_slug = esc_attr( isset($terms[0]->slug) ? $terms[0]->slug : "" );
            if (strtolower($term) === 'uncategorized'): // 'uncategorized' is ignored.
                 continue;
            endif;
            $term_link = get_term_link($terms[0]);
            $output_category_temp_category .= "<p class='{$html_tag_class}_category_{$term_slug}'>";
            if(!is_wp_error($term_link) && !is_wp_error($term)):
                $output_category_temp_category .= "<span><a class='{$html_tag_class}_category_link_{$term_slug}' href='$term_link'>$term</a></span></p>";
            else:
                $output_category_temp_category .= "<span>$term</span></p>";
            endif;                              
        endif;
    endforeach;
endif;

$output_category_temp = $output_category_temp_post_type . $output_category_temp_category;

$out_temp = <<< ___EOF___
 <li class='{$html_tag_class}_item'><p class='{$html_tag_class}_date'>$date</p>$output_category_temp<a class='{$html_tag_class}_link' href='$link'>$title</a></li>
 
___EOF___;

    return array('hook_secret_key'=>'hogehoge', 'data'=>$out_temp);

}

 

またショートコードごとに出力コードを変更したければ、

[list-view-posts ” hook_secret_key=”hogehoge” id=1]

[list-view-posts ” hook_secret_key=”hogehoge” id=”case2″]

などのように ユニークな番号かキーワードである idをいれた上で、下記のようにすれば、 各ID だけに適用できるフックを作成できますよ!

このように id ごとに条件分岐するなら、ショートコードごとに 出力を変更する関数も作れますよ!

2017年8月29日作成 @kimipooh

モバイルバージョンを終了