プラグインを使わずに、検索範囲にカスタムフィールドを含める
- 2016.11.02
- CMS Wordpress
- Advanced Custom Fields, 検索
1、search.phpに検索用のソースを用意する。
<?php // // 検索結果表示用 global $wpdb; // If you use a custom search form // $keyword = sanitize_text_field( $_POST['keyword'] ); // If you use default WordPress search form $keyword = get_search_query(); $keyword = '%' . $wpdb->esc_like( $keyword ) . '%'; // Thanks Manny Fleurmond // Search in all custom fields $post_ids_meta = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT post_id FROM {$wpdb->postmeta} WHERE meta_value LIKE '%s' ", $keyword ) ); // Search in post_title and post_content $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 ); // Query arguments $args = array( 'post_type' => 'post', 'posts_per_page' => -1, 'order' => 'DESC', 'post_status' => 'publish', 'orderby' => 'meta_value_num', 'meta_key' => 'product_txt_sortno', 'order' => 'asc', 'post__in' => $post_ids, ); $s_query = new WP_Query( $args ); ?>
2、検索結果を出力する
<?php if( (!($post_ids)) || (isset($_GET['s']) && empty($_GET['s'])) ) :?> <!-- 検索条件にヒットしなかった場合 または 検索条件が指定されていない場合 --> <?php else: ?> <!-- 検索がHitした場合 --> <?php if(have_posts()): while(have_posts()): the_post(); ?> //ここにループさせる内容 <?php endwhile; else: ?> //ここに検索キーワードと一致する記事がない場合の表示 <?php endif; ?> <?php endif; ?>
———————————-
■カスタマイズ
▽Query argumentsで検索の詳細を設定出来る。
例)投稿、固定ページ、カスタム投稿タイプ「movie」、「book」に限定する場合
’post_type’ => array( ‘post’, ‘page’, ‘movie’, ‘book’ )
▽検索するカスタムフィールドの範囲を絞る
// Search in all custom fields の項目を編集
例)1つのカスタムフィールドに絞る
$post_ids_meta = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT post_id FROM {$wpdb->postmeta} WHERE 1=1 AND (meta_key = 'hoge_field' AND meta_value LIKE '%s') ", $keyword ) );
例)複数のカスタムフィールドに絞る
WHERE 1=1 AND ( (hoge_Field_1) OR (hoge_Field_2) )
———————————-
■ページャーを使用する場合(上記のソースを元にカスタマイズされている/未検証)
<?php global $wpdb; // If you use a custom search form // $keyword = sanitize_text_field( $_POST['keyword'] ); // If you use default WordPress search form $keyword = get_search_query(); $keyword = '%' . like_escape( $keyword ) . '%'; // Thanks Manny Fleurmond // Search in all custom fields $post_ids_meta = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT post_id FROM {$wpdb->postmeta} WHERE meta_value LIKE '%s' ", $keyword ) ); // Search in post_title and post_content $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 ); // ページネーションのために、現在のpage番号が必要だが、 // $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // のコードでは上手くいかなかったので、get_query_var('page')も追加 if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } else if ( get_query_var('page') ) { $paged = get_query_var('page'); } else { $paged = 1; } // Query arguments $args = array( 'post_type' => 'any', // 必要であれば適宜変える。 'posts_per_page' => 10, // 指定追加 'paged' => $paged, // 指定追加 'post_status' => 'publish', 'post__in' => $post_ids, 'order'=>'DESC', // 条件は適宜追加 'orderby'=>'date' // 条件は適宜追加 ); $query = new WP_Query( $args ); // 後の件数表示に使いたいので、ここで取得している if ( (!($post_ids)) || (isset($_GET['s']) && empty($_GET['s'])) ) { $get_num = 0; $all_num = 0; } else { $get_num = $query -> post_count; $all_num = $query -> found_posts; } ?>
参考サイト
- Welcart カスタマイズ ブログ
- プラグインなしでカスタムフィールドの値を検索範囲に反映させる方法
- http://welcustom.net/extend-custom-fields-in-search/
- Deluxe Blog Tips
- Search ALL Custom Fields in WordPress
- http://www.deluxeblogtips.com/search-all-custom-fields/
- Qiita
- 【WordPress】カスタムフィールドの値を検索範囲に反映させる方法(の補足)
- http://qiita.com/WW-AT/items/16e63fb27aa3147d8cdb
-
前の記事
配列を50音の行毎に要素をまとめる 2016.11.01
-
次の記事
検索結果に検索条件を表示させる 2016.11.04