投稿、カスタム投稿、固定ページ、イベントプラグイン(The Event Calendar)の一部をまとめて一覧表示するためのプラグインです。
加えて、プラグイン「WPML」による多言語機能に対応しています。日本語サイトは日本語だけ、英語サイトは英語だけの一覧表示ができます。
作成したばかりのプラグインのため、特にHTML出力のためのテンプレートはデフォルト(”li”)を除き、微調整していきます。
*サポートについては、次のフォーラムをご利用ください:https://wordpress.org/support/plugin/list-view-for-posts/
変更履歴
- 2020.02.28: 1.8公開(PHP8.2対応)
- 2020.12.03: 1.7公開
- 2020.02.23: 1.6公開
- 2020.02.04: 1.5公開
- 2018.07.19: 1.4公開
- 2017.11.11: 1.3公開
- 2017.09.01: 1.2公開
- 2017.08.31: 1.1公開
- 2017.08.30: 1.0公開
- 2017.08.29: 1.0公開申請
ショートコード
- [list-view-posts]
デフォルトでは、「投稿」の一覧表示となります。表示形式は <li>と<span>タグです。
- [list-view-posts html_tag=”p”]
を使えば、<p>と <span>タグで表示されます。
それ以外にも現在テンプレートは、li, p, dd, lip の4種類を用意しています。
また、後述するフックを使えば、出力データを自分のテーマに合わせたカスタマイズできます!
ショートコードオプション(Version 1.0)
オプションを利用することで多彩な設定が可能になります。
カテゴリーやカスタム投稿名をカテゴリー表示したり、予約記事やパスワード保護(保護はされたまま)記事の表示、日付フォーマット変更なども可能です。また50〜100件まで表示など、表示箇所の指定もできるのでテンプレートなどでループすることで、ページ送り機能にも活用できるのではと思います。
※プラグイン「WPML」が有効な場合、現在の表示言語のみが一覧表示に出ます。これを変更したい場合には、wpml_lang オプションを使います。
また、WPML設定の翻訳オプションから本ショートコードで利用したいカスタム投稿やタクソノミー等については「翻訳する」を設定してください。「翻訳しない」に設定されたものは表示されません。
- [list-view-posts post_type=”post” post_status=”publish” date_format=”Y.m.d” orderbysort=”DESC” max_items=5 page=1 html_tag=”li” html_tag_class=”” enable_view_post_type=”” enable_view_category=”” category_taxonomy=”category” enable_passowrd_protected_post=”” enable_the_event_calendar_events=”” wpml_lang=”” hook_secret_key=”” id=””]
各オプションの説明は下記の通りです。
- post_type = 投稿タイプを指定します。複数指定する場合にはコンマで区切ります(デフォルトは、post(投稿))。各投稿タイプのスラッグを入れて下さい。
- post_status = 投稿ステータスを指定します。複数指定する場合にはコンマで区切ります(デフォルトは、publish(公開))、予約済み投稿も含めるなら、publish,future を指定します。
- date_format = データ表示時の日付フォーマットを変更できます。dateフォーマットを記述できます。デフォルトは Y.m.d = YYYY.MM.DD です。英語表記でよく見かける d/m/Y = DD/MM/YYYY、M d, Y = Aug 29, 2017 などのように変更できます。
- orderbysort = 一覧表示する項目の日付ソートです。デフォルトはDESC(降順)です。ASC(昇順)かDESC(降順) の何れかを指定します。誤った指定をした場合には、DESC(降順)がセットされます。
- max_items = 表示件数を指定します。デフォルトは 5件表示です。
- page = 表示起点を設定します。デフォルトは1(最初から)です。 max_items が 50で、 page が2 の場合、51〜100 が表示されます。
- html_tag = 出力データのテンプレートを指定します。li, p, dd, lipの4つを指定できて、それ以外の値を設定した場合には li がセットされます。テンプレートは、プラグインフォルダ/includes/tags/ に保存されています。後述するフックを使えば、自分でテンプレートを設定することができます。
- html_tag_class = 出力 HTMLコードで利用する classの接頭文字です。デフォルトは、list-view-posts です。html_tagともに指定しなければ、<li class=”list-view-posts “><span class=”list-view-posts_date”>[Date]</span><a class=”list-view-posts_link” href=”[Link]”>[Title]</a></li> が基本セットになります。これに加えて、enable_view_post_type, enable_view_category の設定が有効の場合には、それぞれのカテゴリーが追加されます。
- enable_view_post_type = カスタム投稿タイプ名をカテゴリーとして表示/非表示を選択します。デフォルトは非表示(空)です。true 等何か文字を設定すると、表示されます。<li class=”list-view-posts “><span class=”list-view-posts-date”>[Date]</span><span class=”list-view-posts_post_type”>カスタム投稿タイプ名</span><a class=”list-view-post_link” href=”[Link]”>[Title]</a></li> が基本セットになります。
- enable_view_category = 投稿カテゴリーやタクソノミーで設定されたカテゴリーをカテゴリーとして表示/非表示するか選択します。デフォルトは非表示(空)です。true 等何か文字を設定すると、表示されます。記事に対して複数カテゴリーを設定していた場合、ぞれぞれの最初の1つのみが表示されます。<li class=”list-view-posts “><span class=”list-view-posts_date”>[Date]</span><span class=”list-view-posts_category_カテゴリー1のslug”>カテゴリー1(カテゴリー on 投稿)</span><span class=”list-view-posts_category_カテゴリー2のslug”>カテゴリー2(◯◯ on タクソノミー)</span><a class=”list-view-posts_link” href=”[Link]”>[Title]</a></li> が基本セットになります。カテゴリーのうち未分類(スラッグが、 Uncategorized か Unclassified)のみ表示されません。
- category_taxonomy = カテゴリー表示する対象を、投稿のカテゴリーやタクソノミで設定したカテゴリーのスラッグで入力します。デフォルトは、category(投稿のカテゴリー)です。複数設定する場合にはコンマで区切ります。
- enable_password_protected_post = パスワード保護された投稿の一覧への表示/非表示を選択します。デフォルトは非表示(空)です。 true等何か文字を設定すると表示になります。もちろんパスワード保護された状態であることには変わりありません。
- enable_the_event_calendar_events = プラグイン「The Events Calendar」が有効である場合、そのイベントも一覧表示に含めるかどうかのオプションです。デフォルトは含めません(空)。true 等何か文字を設定すると、含むようになります。なお The Events Calendar のイベントカテゴリーは、category_taxsonomyで指定しても表示されません。
- wpml_lang =プラグイン「WPML」が有効な場合、WPMLで設定した言語タグ(日本語 = ja, 英語 = en等)を値として設定することで、その言語の記事一覧を表示します。タクソノミーやカスタム投稿タイプで有効にしたい場合には、WPML設定の翻訳オプションから「翻訳する」を設定してください。
- hook_secret_key = フックを安全に利用するためのキーです。フックを利用する場合には指定した上で、フック側でも値を返してください。詳しくは、末尾のフック項目参照。
- id = もしフック利用時に、各ショートコードにおいてカスタマイズを変更したければ、この id を活用してみてください。
事例
便利そうな事例を見つけたら増やしていきます。
ざっとした TiPSは日本語のみですが、筆者個人ブログに掲載しています。
事例1)カスタム投稿タイプで、複数のカテゴリー(タクソノミー)を一覧表示する
- カスタム投稿:FAQ(faq)
- タクソノミー:タイプ(faq_type)、OS(os)
- 投稿記事:Windowsでデータを救出する方法
- トラブル解決(troubleshooting) – <タクソノミー>タイプ(faq_type)
- Windows(windows) – <タクソノミー>OS(os)
とした場合、ショートコードは
- [list-view-posts post_type=”faq” post_status=”publish” enable_view_post_type=”true” enable_view_category=”true” category_taxonomy=”faq_type,os”]
となり出力コードは次のようになります。実際には一項目一行ですが、下記は分かりやすくするために適宜改行しています。
<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);
を使えば、下記の変数として利用できます。
ショートコードオプションとして与えた値に対して、プログラム処理しやすいように一部配列に変換しているものもあります。
- ショートコードオプションを変数にしたものが利用できます(デフォルト値は、 => の 右側の値)
- post_type => array(‘category’) : 配列に変換しています。
- post_status => ‘publish’
- date_format => ‘Y.m.d’
- orderbysort => ‘DESC’ : DESC / ASC 以外を指定すると、’DESC’ をセットします。
- max_items => 5 : 0以下を設定すると、5をセットします。
- page => 1
- html_tag => ‘li’
- html_tag_class => ‘list-view-posts’
- enable_view_post_type =>”
- enable_view_category => ”
- category_taxonomy => ‘category’
- enable_the_event_calendar => ”
- enable_password_protected_post => ”
- wpml_lang => ”
- hook_secret_key => ”
- id => ”
- ショートコードオプション以外の変数
- title : 投稿名
- link : 投稿へのリンク
- date : 投稿の作成日時
- default_post_types => array(‘post’=>’post’, ‘page’=>’page’, ‘attachment’=>’attachment’, ‘revision’=>’revision’, ‘nav_menu_item’=>’nav_menu_item’)
カスタム投稿かどうかの判定に利用できます。
フック: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 にしています。
実際には類推しにくい値にすることを勧めます。
- [list-view-posts ******* 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 が case2 のときのみ & カテゴリーなど不要な場合の簡素例
add_filter( 'lvp_each_item' , 'lvp_each_item_fix' , 10 , 2 ); <span id="_mce_caret" data-mce-bogus="true"><code></code><span id="_mce_caret" data-mce-bogus="1"><code data-mce-bogus="1"></code></span></span> function lvp_each_item_fix($out, $out_atts){ extract($out_atts); if(isset($id) && $id === "case2"): $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___; endif; return array('hook_secret_key'=>'hogehoge', 'data'=>$out_temp); }
このように id ごとに条件分岐するなら、ショートコードごとに 出力を変更する関数も作れますよ!
2017年8月29日作成 @kimipooh