「Advanced Custom Field」などで作成したカスタムフィールドやカテゴリは、そのままでは検索対象になりません。
「Search Everything」などのプラグインもありますが、今回は特定のカスタム投稿の記事のみの条件付きだった為、以下方法で実現します。
カスタムフィールドを検索対象に含める場合
<?php
global $wpdb;
$keyword = get_search_query();
$keyword = '%' . like_escape( $keyword ) . '%';
// ここでカスタムフィールドのカラムを指定
$post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT post_id FROM {$wpdb->postmeta}
WHERE meta_value LIKE '%s'
", $keyword ) );
// ここで記事のタイトルとコンテンツの中身を指定
$post_ids_post = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT ID FROM {$wpdb->posts}
WHERE post_title LIKE '%s'
OR post_content LIKE '%s'
", $keyword, $keyword ) );
$post_ids = array_merge( $post_ids_meta, $post_ids_post );
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'post__in' => $post_ids,
);
$query = new WP_Query( $args );
if ( $query->have_posts() ): while ( $query->have_posts() ) : $query->the_post(); ?>
//ここにループさせる内容
<?php endwhile; else: ?>
//ここに検索キーワードと一致する記事がない場合の表示
<?php endif; ?>
カテゴリを検索対象に含める場合
<?php
global $wpdb;
$keyword = get_search_query();
$keyword = '%' . like_escape( $keyword ) . '%';
// ここでカテゴリの指定
$post_ids_cate = $wpdb->get_col( $wpdb->prepare( "
SELECT object_id
FROM {$wpdb->term_relationships}
WHERE term_taxonomy_id = (
SELECT term_taxonomy_id
FROM {$wpdb->term_taxonomy} AS tt
INNER JOIN {$wpdb->terms} AS tm ON tt.term_id = tm.term_id
WHERE tm.name LIKE '%s' )
", $keyword ) );
// ここで記事のタイトルとコンテンツの中身を指定
$post_ids_post = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT ID FROM {$wpdb->posts}
WHERE post_title LIKE '%s'
OR post_content LIKE '%s'
", $keyword, $keyword ) );
$post_ids = array_merge( $post_ids_cate, $post_ids_post );
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'post__in' => $post_ids,
);
$query = new WP_Query( $args );
if ( $query->have_posts() ): while ( $query->have_posts() ) : $query->the_post(); ?>
//ここにループさせる内容
<?php endwhile; else: ?>
//ここに検索キーワードと一致する記事がない場合の表示
<?php endif; ?>
カスタムフィールドとカテゴリを検索対象に含める場合
<?php
global $wpdb;
$keyword = get_search_query();
$keyword = '%' . like_escape( $keyword ) . '%';
// ここでカスタムフィールドのカラムを指定
$post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT post_id FROM {$wpdb->postmeta}
WHERE meta_value LIKE '%s'
", $keyword ) );
// ここでカテゴリの指定
$post_ids_cate = $wpdb->get_col( $wpdb->prepare( "
SELECT object_id
FROM {$wpdb->term_relationships}
WHERE term_taxonomy_id = (
SELECT term_taxonomy_id
FROM {$wpdb->term_taxonomy} AS tt
INNER JOIN {$wpdb->terms} AS tm ON tt.term_id = tm.term_id
WHERE tm.name LIKE '%s' )
", $keyword ) );
// ここで記事のタイトルとコンテンツの中身を指定
$post_ids_post = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT ID FROM {$wpdb->posts}
WHERE post_title LIKE '%s'
OR post_content LIKE '%s'
", $keyword, $keyword ) );
$post_ids = array_merge( $post_ids_meta, $post_ids_cate, $post_ids_post );
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'post__in' => $post_ids,
);
$query = new WP_Query( $args );
if ( $query->have_posts() ): while ( $query->have_posts() ) : $query->the_post(); ?>
//ここにループさせる内容
<?php endwhile; else: ?>
//ここに検索キーワードと一致する記事がない場合の表示
<?php endif; ?>