このページをご覧の方の多くは検索結果にカスタム投稿タイプを含めるにはどうしたらよいかお悩みですね?
結論から先に書きます。以下のコードをテーマの functions.php の適当なところにコピペしてください。
menus のところはご自分の投稿タイプのスラッグに変更してください。
wordpressの検索結果にカスタム投稿タイプを含める方法
functions.php
add_action ( 'pre_get_posts', 'my_pre_get_posts' );
function my_pre_get_posts( $query ) {
if ( ! is_admin() && $query->is_main_query() ) {
//検索にカスタム投稿タイプを含める
if ( is_search() ) {
$query->set( 'post_type', array ( 'post', 'menus' ) );
return $query;
}
}
}
なぜカスタム投稿タイプが検索結果に含まれていないのか?
これはカスタム投稿タイプがプラグインなどで使われることが多いからです。
例えば、プラグインで使用するユーザーの設定値をデータベースに保存するときに使う例です。有名なものではAdvanced Custom Fieldsプラグインもカスタム投稿タイプのカスタムフィールドを使って保存しています。この値は記事の内容とは無関係ですから検索結果には表示されない方がいいですよね。
最初から全てのカスタム投稿タイプが検索結果に含まれてしまうと、不要なものまで表示されてしまう訳です。
同様にフィードにも含まれていませんのでフィードにも含ませたい場合は下記を追加します。
wordpress のフィードにカスタム投稿タイプを含める方法
functions.php
add_action ( 'pre_get_posts', 'my_pre_get_posts' );
function my_pre_get_posts( $query ) {
if ( ! is_admin() && $query->is_main_query() ) {
//フィードにカスタム投稿タイプを含める
if ( is_feed() ) {
$post_type = $query->get( 'post_type' );
if ( empty( $post_type ) ) {
$query->set( 'post_type', array( 'post', 'menus' ) );
return $query;
}
}
}
}
今回はpre_get_posts にフックしましたが request にフックする方法もあるようです。Plugin API/Filter Reference/request