ワードプレスの検索機能で、複数のカスタムフィールドの値を検索、できれば記事本文を除外したい。
投稿: 更新:2018/08/19
ワードプレスのカスタムフィールドの値を検索させたい場合
とりあえず、簡単なものでも良かったのでプラグイン等も考えたのですが、思ったような動きをしてくれない為、他の方法を。
ということで、プラグインを使わずカスタムフィールドの検索を行うという上記を少し変更しました。
(検索させたいカスタムフィールドだけを追加できるような形で変更。)
検索時に特定のカスタムフィールドも検索に含めるようにするため、functions.php に以下を追加します。
検索時に複数のカスタムフィールドを検索対象に含める
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
function cf_search_join($join) { global $wpdb; if (is_search()) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id '; } return $join; } add_filter('posts_join', 'cf_search_join'); function cf_search_where($where) { global $wpdb; $meta = '"フィールド1","フィールド2","フィールド3"';//検索させたいカスタムフィールドのmeta key if (is_search()) { $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR ( ".$wpdb->postmeta.".meta_key IN ( ".$meta." ) ) AND (".$wpdb->postmeta.".meta_value LIKE $1)", $where); } return $where; } add_filter('posts_where', 'cf_search_where'); function cf_search_distinct($where) { global $wpdb; if (is_search()) { return "DISTINCT"; } return $where; } add_filter('posts_distinct', 'cf_search_distinct'); |
上記では、3つのカスタムフィールドしか指定していませんが、下記のソースの部分に、検索させたいカスタムフィールドのmata keyを、同じように追加していくだけです。
1 |
$meta = '"フィールド1","フィールド2","フィールド3","フィールド4","フィールド5"'; //検索させたいカスタムフィールドのmeta key |
検索時に本文は検索から除外したかったので、以下も追加。
検索時に投稿記事の本文を検索させたくない(検索から除外したい)場合
※以下のソースだけ functions.phpに、追加した場合は、「記事のタイトルのみでの検索」になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function search_not_in_content( $search, $query ){ global $wpdb; if ( empty( $search ) ) return $search; $q = $query->query_vars; $n = ! empty( $q['exact'] ) ? '' : '%'; $search = $searchand = ''; foreach ( (array) $q['search_terms'] as $term ) { $term = esc_sql( like_escape( $term ) ); $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')"; $searchand = ' AND '; } if ( ! empty( $search ) ) { $search = " AND ({$search}) "; if ( ! is_user_logged_in() ) $search .= " AND ($wpdb->posts.post_password = '') "; } return $search; } add_filter( 'posts_search', 'search_not_in_content', 10, 2 ); |
カスタムフィールドに色々とデータを入力すようなサイトの場合は、限定されたデータのみ検索させたいということが多いので上記でで対応しています。