pre_get_postsで登録されている投稿タイプを自動的に抽出するのは難しい?

公開日:2023(令和5)年3月15日/最終更新日:

, ,
WordPress Customize Ideas | Personal WP Customization Notes (PWCN)

【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています



一覧が作られる前に作用して、一覧の抽出条件を変更するための「pre_get_posts」フック。

基本的な使い方はWP_Queryと同じなので、

$query->set( '作用させる要素', 適用させる範囲など );

を追加していけば、目的の一覧が簡単にカスタマイズできるというものです。

詳しい方が多々情報を公開していらっしゃるので、詳細はそちらを検索してください

例えば、今回私がやったように、ホーム(ブログ一覧)で、カスタム投稿タイプを含めた一覧にしたいと思った場合には、以下のコードで簡単にカスタマイズができます。

/* フロントエンドの新着記事一覧へ追加 */
function sample_pre_get_posts( $query ) {

//特定のリストのみに作用させるためのおまじない
	if ( is_admin() || ! $query->is_main_query() ) {
		return;
	}

//特定の一覧のみに作用させる
	if ( $query->is_home() ) {
		$query->set( 'post_type', array('post','カスタム投稿タイプスラグ') );
		return;
	}
}
add_action( 'pre_get_posts', 'sample_pre_get_posts' );

また、複数の投稿タイプを含める場合には、赤文字の部分を外に出して変数化して、以下のようにすることもできます。

/* フロントエンドの新着記事一覧へ追加(投稿タイプを変数にする) */
function sample_pre_get_posts_val( $query ) {

//投稿タイプを変数化
	$post_types = array('post','カスタム投稿タイプスラグ');

//特定のリストのみに作用させるためのおまじない
	if ( is_admin() || ! $query->is_main_query() ) {
		return;
	}

//特定の一覧のみに作用させる
	if ( $query->is_home() ) {
		$query->set( 'post_type', $post_types );
		return;
	}
}
add_action( 'pre_get_posts', 'sample_pre_get_posts_val' );

さらにこれを自動化して、手動(functions.phpへ直接追加)または、CPT UIなどのプラグインを使って追加した場合に、投稿と追加したカスタム投稿タイプの投稿を混ぜた形で出力するためのものが以下のコード。

/* フロントエンドの新着記事一覧へ追加 */
function sample_pre_get_posts_all_posttype( $query ) {
//抽出条件
$args = array(
	'public'   => true,
);

//抽出条件に基づいてすべての投稿タイプ名を抽出
$post_types = get_post_types( $args, 'names', 'and' );

//除外する投稿タイプを指定(下記は固定ページを除外)
unset($post_types['page']);

//特定のリストのみに作用させるためのおまじない
	if ( is_admin() || ! $query->is_main_query() ) {
		return;
	}

//特定の一覧のみに作用させる
	if ( $query->is_home() ) {
		$query->set( 'post_type', $post_types );
		return;
	}
}
add_action( 'pre_get_posts', 'sample_pre_get_posts_all_posttype' );

まあ、できてしまえば、コードの上下を見比べてもらえば分かる通り、以下の順序で処理させて自動抽出することは可能です。

  1. 「公開されている(publish =>true)」という条件を付加
  2. get_post_typesを使って全部の投稿タイプから1の条件で抽出
  3. 固定ページが含まれてしまうので、「unset($post_types[‘page’]);」で除外

でもこの方法で困るのが、プラグインなどが作るカスタム投稿タイプで、公開になっているもの。

このサイトの場合だと、TT2の子テーマ配布や、自作プラグインの配布に使っている「Simple Download Monitor」というプラグイン。

基本的にこのサイトでは自分でボタンを作ってダウンロードできるようにしているので、このプラグインにあるダウンロード用ページというのは不要なのですが、この機能があるので、プラグインが生成するカスタム投稿タイプは「公開されている(publish =>true)」になっているんです。

さて、これをどうするかということなんですけど、以下のコードを使うことで「公開されていない(publish =>false)」にステータス変更することができます。

/***** Simple Download Monitorの個別ページをアーカイブから外す *****/
/* カスタム投稿タイプの公開ステータスを変更 */
function ha_change_sdm_custom_post_type_args( $args, $post_type ) {
    if ( $post_type == "sdm_downloads" ) {
        $args['public'] = false;
    }

    return $args;
}
add_filter( 'register_post_type_args', 'ha_change_sdm_custom_post_type_args', 20, 2 );

※「sdm_downloads」というのがプラグインの生成するカスタム投稿タイプ名(スラグ)です

そもそも、今回自動化したかった大きな理由は、投稿タイプの登録時に新着投稿一覧(いわゆるブログロール)へ参入させ忘れるのを防ぐのと、できるだけコードをすっきりさせたいのが目的。

せっかく自動化できたけど、今度はプラグインによって追加される投稿タイプの除外をする/しないを個別に指定しないといけないかもという懸念が出てきて、結局どちらでいった方がいいのか..という状況になってしまいました(泣)。

一応このサイトでも配布している「Hima Art Utility」というプラグインの機能の1つとして実装したいので、自動化はするのですが、これを他の人が使った場合、今回のようなプラグインと併用して、一覧に出てしまうと、「バグ」なんて言われるんでしょうねぇ..きっと。

まあ、それはさておき、自動で抽出することもできるんですね!これで個人的にカスタム投稿タイプを使う派としては、少し楽になる(忘れを防げる)かなあと思っています。

, , , , , , , , ,



Lolipop ServerMoshimo Ad x-serverMoshimo Ad

WordPress Customize Ideas | Personal WP Customization Notes (PWCN)
プラグインなしで、ユーザー(著者)ページのスラグを変更する方法