version 1.7.0 release.

標準のウィジェットに拡張機能を追加するプラグイン、WordPress Default Widget Extensionのバージョン1.7.0をリリースしました。WordPressのバージョン4.8のリリースに伴う動作確認とともに、ウィジェットの「最近の投稿」に機能を追加しました。

カスタム投稿が出力できない

「最近の投稿」ウィジェットはwp_postテーブルのpost_typepostのデータが出力対象ですので、デフォルトでは通常の投稿のみ投稿日順に出力されます。このウィジェットにカスタム投稿も混ぜて出したり、カスタム投稿のみを出力したりできるようにしたいと思い、実装することにしました。

「最近の投稿」ウィジェットのフィルターを探す

「最近の投稿」ウィジェットで投稿のデータを取得しているフィルターフックがないかと探してみることに。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