WordPressのカスタムフィールドやカテゴリを検索対象に含める方法

「Advanced Custom Field」などで作成したカスタムフィールドやカテゴリは、そのままでは検索対象になりません。
「Search Everything」などのプラグインもありますが、今回は特定のカスタム投稿の記事のみの条件付きだった為、以下方法で実現します。

カスタムフィールドを検索対象に含める場合

<?phpglobal $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

カテゴリを検索対象に含める場合

<?phpglobal $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

カスタムフィールドとカテゴリを検索対象に含める場合

<?phpglobal $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; ?>
PHP

read next