WordPress - 2018-02-07

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

「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; ?>
Related Posts

Related Posts

WordPressの投稿画面カスタマイズ-必須項目設定

2017-10-05

Node.jsをバージョン管理する方法(Windows・Mac)

2019-07-03

WordPressのテンプレートタグを独自のclass名に変更する方法

2018-07-04

マルチサイトでつまずいたことまとめ

2019-04-03