そのままだとカスタムフィールド内も検索対象にならないのでfunction.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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | //サイト内検索の設定 function filter_search( $query ) { if ( $query ->is_search() && $query ->is_main_query() && !is_admin()) { //検索に含めるもの(記事、ページ、カスタム投稿) $post_array = array ( 'post' , 'page' , 'items' ); //検索に含めたくないもの(例えばお問い合わせの確認、完了画面とか) $page_ID_contact_confirm = get_page_by_path( 'contact/confirm' )->ID; $page_ID_contact_completion = get_page_by_path( 'contact/completion' )->ID; $not_in_array = array ( $page_ID_contact_confirm , $page_ID_contact_completion ); $query ->set( 'post_type' , $post_array ); $query ->set( 'post__not_in' , $not_in_array ); } } add_filter( 'pre_get_posts' , 'filter_search' ); //検索 function custom_search( $search , $wp_query ) { global $wpdb ; if (! $wp_query ->is_search) return $search ; if (!isset( $wp_query ->query_vars)) return $search ; $search_words = explode ( ' ' , isset( $wp_query ->query_vars[ 's' ]) ? $wp_query ->query_vars[ 's' ] : '' ); if ( count ( $search_words ) > 0) { $search = '' ; foreach ( $search_words as $word ) { if (! empty ( $word )) { $search_word = '%' . esc_sql( $word ) . '%' ; $search .= " AND ( { $wpdb ->posts}.post_title LIKE '{$search_word}' -- タイトル OR { $wpdb ->posts}.post_content LIKE '{$search_word}' -- コンテンツ OR { $wpdb ->posts}.ID IN ( -- タグ、カテゴリー、ターム SELECT distinct r.object_id FROM { $wpdb ->term_relationships} AS r INNER JOIN { $wpdb ->term_taxonomy} AS tt ON r.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN { $wpdb ->terms} AS t ON tt.term_id = t.term_id WHERE t.name LIKE '{$search_word}' OR t.slug LIKE '{$search_word}' OR tt.description LIKE '{$search_word}' ) OR { $wpdb ->posts}.ID IN ( -- カスタムフィールド SELECT distinct post_id FROM { $wpdb ->postmeta} WHERE meta_value LIKE '{$search_word}' ) )"; } } } return $search ; } add_filter( 'posts_search' , 'custom_search' , 10, 2); |