WordPressで現在使用しているカスタム投稿タイプ名を取得する方法の備忘録です。
あらかじめ用意されている関数を使うのでも十分ではありますが、より容易に且つ一部のカスタム投稿タイプは除外して取得したい場合も考慮した関数を作ってみます。
頻繁に利用するようなものではないかもしれませんが、繰り返し行う何らかの処理で各カスタム投稿タイプ名が必要みたいな場面では使えると思います。
get_post_types()を使う
現在使用しているカスタム投稿タイプの情報はget_post_types()
で取得することができ、下記のようにパラメータを指定することで公開されているカスタム投稿タイプのみを取得することができます。
$args = array(
'public' => true,
'_builtin' => false,
);
$post_types = get_post_types( $args );
ちなみに、今回は投稿タイプ名を取得したいので省略していますが第2引数で'objects'
を指定すればオブジェクトで取得することもでき、その辺も含めて詳細については以下で確認できます。
独自の関数をつくる
上で紹介した方法で使用しているカスタム投稿タイプ名を取得することができますが、そこまで長いコードではないとはいえ複数箇所で使用したい場合に毎回これを記述するのは面倒です。
また、この関数は基本的に条件にマッチした全カスタム投稿タイプが対象となるので、例えば自身で用意した投稿タイプのみ取得したいのにプラグインによって生成された投稿タイプの情報も含まれたり、部分的に特定の投稿タイプを除外したいときにもその都度除外する処理を行う必要が出てきます。
こういった面倒な部分を少しでも省いて容易に扱えるようにしたのが下記の関数です。
if ( ! function_exists( 'nxw_get_custom_post_types' ) ) {
function nxw_get_custom_post_types( $ignore_post_types = '' ) {
$always_ignore_post_types = array( '{post_type}' );
if ( ! is_array( $ignore_post_types ) ) {
$ignore_post_types = $ignore_post_types ? array( $ignore_post_types ) : array();
}
$args = array(
'public' => true,
'_builtin' => false,
);
return array_diff( get_post_types( $args ), array_merge( $always_ignore_post_types, $ignore_post_types ) );
}
}
使用時はnxw_get_custom_post_types();
のように記述し、後述する部分で特定の投稿タイプを除外していなければ全カスタム投稿タイプ名が、逆に除外していればそれ以外のカスタム投稿タイプ名が取得できます。
共通して除外させたい投稿タイプがある場合は、関数内の$always_ignore_post_types
で指定します。
例えば「xxx」という投稿タイプを除外したい場合はarray( 'xxx' )
に、「xxx」と「yyy」のように複数除外したい場合はカンマ区切りでarray( 'xxx', 'yyy' )
のように記述し、プラグインによって生成された投稿タイプを基本的に除外するときにもここに指定しておくのがいいと思います。
部分的に特定の投稿タイプを除外したいときには、使用時の引数にその投稿タイプ名を指定します。
例えば「xxx」という投稿タイプを部分的に除外したい場合はnxw_get_custom_post_types( 'xxx' );
と記述し、「xxx」と「yyy」のように複数除外したい場合はnxw_get_custom_post_types( array( 'xxx', 'yyy' ) );
と記述します。
上記を踏まえ、例えば「xxx」「yyy」「zzz」という3投稿タイプがあるテーマでfunctions.php
に下記を記述したとします。
if ( ! function_exists( 'nxw_get_custom_post_types' ) ) {
function nxw_get_custom_post_types( $ignore_post_types = '' ) {
$always_ignore_post_types = array( 'xxx' );
if ( ! is_array( $ignore_post_types ) ) {
$ignore_post_types = $ignore_post_types ? array( $ignore_post_types ) : array();
}
$args = array(
'public' => true,
'_builtin' => false,
);
return array_diff( get_post_types( $args ), array_merge( $always_ignore_post_types, $ignore_post_types ) );
}
}
これでnxw_get_custom_post_types();
と記述した場合は、共通除外の「xxx」のみが除外されて「yyy」と「zzz」の2投稿タイプ名が取得でき、nxw_get_custom_post_types( 'yyy' );
と記述した場合は、共通除外の「xxx」と部分的除外の「yyy」が除外されて「zzz」のみが取得できます。