version 1.7.0 release.
標準のウィジェットに拡張機能を追加するプラグイン、WordPress Default Widget Extensionのバージョン1.7.0をリリースしました。WordPressのバージョン4.8のリリースに伴う動作確認とともに、ウィジェットの「最近の投稿」に機能を追加しました。
カスタム投稿が出力できない
「最近の投稿」ウィジェットはwp_post
テーブルのpost_type
がpost
のデータが出力対象ですので、デフォルトでは通常の投稿のみ投稿日順に出力されます。このウィジェットにカスタム投稿も混ぜて出したり、カスタム投稿のみを出力したりできるようにしたいと思い、実装することにしました。
「最近の投稿」ウィジェットのフィルターを探す
「最近の投稿」ウィジェットで投稿のデータを取得しているフィルターフックがないかと探してみることに。wp-includes/widgets
ディレクトリのclass-wp-widget-recent-posts.php
を覗いてみるとやっぱりあったフィルターフック。
/** * Filters the arguments for the Recent Posts widget. * * @since 3.4.0 * * @see WP_Query::get_posts() * * @param array $args An array of arguments used to retrieve the recent posts. */ $r = new WP_Query( apply_filters( 'widget_posts_args', array( 'posts_per_page' => $number, 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true ) ) );
widget_posts_args
というフィルターフックがあるので、配列にpost_type
をセットしてあげればよさそう。
登録されているカスタム投稿タイプの取得
「最近の投稿」ウィジェットを生成しているクラスWP_Widget_Recent_Posts
を継承して新規クラスを作成します。その中で、post_type
にセットする値、通常の投稿とカスタム投稿のオブジェクトを取得する関数を作りました。
/** * Setting post type array. * * @version 1.7.0 * @since 1.7.0 * @return array $post_types */ private function set_post_type () { // default post $args = array( 'public' => true, '_builtin' => true ); $post_types = get_post_types( $args, 'objects' ); unset( $post_types['page'] ); unset( $post_types['attachment'] ); // custom post $args = array( 'public' => true, '_builtin' => false ); $custom_post_types = get_post_types( $args, 'objects' ); $post_types = array_merge( $post_types, $custom_post_types ); return (array) $post_types; }
get_post_types
の引数で渡す配列の要素の_builtin
がポイント。
まず最初に12行目を見てわかるように、trueをセットします。post(通常の投稿), page(固定ページ), attachment(添付ファイル)のオブジェクトを取得するのですが、通常の投稿のオブジェクトのみでよいので、pageとattachmentは取得した配列から外しました。(unset)
次にfalseをセットします。するとカスタム投稿タイプのみを取得してくれるので、それを配列に保存。最後に通常の投稿とカスタム投稿の配列を合体させてその値を返します。これで準備OK。あとは、フィルターフックにこの関数の戻り値を追加でセットしてあげます。
ウィジェットで選択して出力
「最近の投稿」ウィジェットに出力する投稿タイプの選択ができるようにしました。以下のキャプチャの通り。
このブログのカスタム投稿は「イベント投稿」と「Video Posts」なので選択できます。何も選択しなかった場合は、通常の投稿が表示されますのでご安心を。先日参加したPHPカンファレンス福岡2017の参加レポートの内容はカスタム投稿「イベント投稿」で書いたので、その投稿をウィジェットで出力できるように設定。
でた!\(^o^)/
できたできた!通常の投稿も「最近の投稿」としてウィジェットで表示しています。混在させたり別々に表示したりをウィジェットごとでできるので便利です。この機能を追加してバージョン1.7.0をリリースしました。試してみて下さい。
- WordPress Default Widget Extension
- Author : Kazuya Takami
- Version : 2.1.3
- Downloads : 6,035 ( Active Install: 300 )
- Downloads Site: https://wordpress.org/plugins/wp-widget-extentions
- Plug-ins that extend the standard of the widget function.
3 thoughts on “WordPressの最近の投稿ウィジェットにカスタム投稿を実装”
こんにちは
wpのカスタム投稿の記事を最新の記事に入れたいと思い
このサイトにたどり着きました。
「WP_Widget_Recent_Postsを継承して新規クラスを作成」とありますが
このクラスはどこから呼ばれるように設定したらいいのでしょうか?
wp-includes/widgetsディレクトリに新しいファイルを作成し、新規クラスを作るのでしょうか?
すみませんが、もしよければ教えてください。
こんにちは
テーマ固有で実装するのであれば、テーマディレクトリ(wp-content/themes/)の使用中のテーマディレクトリにある functions.php 内で新規クラスを作成すればよいですね。
お返事頂き、ありがとうございます。
教えて頂いた通り、function.php内で上記のset_post_type()を記述した
WP_Widget_Recent_Postsのオーバーライドクラスを書き込み
widgets_initに作成した関数をフックしてみましたが
最近の投稿にカスタム投稿の記事が入りません。
もう少し修行してみます。