wordpressの検索結果を記事タイトルとタグ・カテゴリーで検索したいです。
本文に含まれるキーワードから検索結果を出すと、関係のない記事も多くでてくるので
・タイトル
・カテゴリー
・タグ
に絞って検索結果を出したいです。
試したこと
タイトルのみ出力する
php
1function posts_search_title_only( $orig_search, $query ) { 2 if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) { 3 global $wpdb; 4 $search = ''; 5 6 $q = $query->query_vars; 7 $n = ! empty( $q['exact'] ) ? '' : '%'; 8 $searchand = ''; 9 10 foreach ( $q['search_terms'] as $term ) { 11 $include = '-' !== substr( $term, 0, 1 ); 12 if ( $include ) { 13 $like_op = 'LIKE'; 14 $andor_op = 'OR'; 15 } else { 16 $like_op = 'NOT LIKE'; 17 $andor_op = 'AND'; 18 $term = substr( $term, 1 ); 19 } 20 $like = $n . $wpdb->esc_like( $term ) . $n; 21 // 検索対象をタイトルのみにします。 22 $search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title $like_op %s))", $like ); 23 $searchand = ' AND '; 24 } 25 if ( ! empty( $search ) ) { 26 $search = " AND ({$search}) "; 27 if ( ! is_user_logged_in() ) 28 $search .= " AND ($wpdb->posts.post_password = '') "; 29 } 30 return $search; 31 } 32 else { 33 return $orig_search; 34 } 35} 36add_filter( 'posts_search', 'posts_search_title_only', 10, 2 );
こちらの処理を行いタイトルのみ出力を行いました。
サイト内検索の範囲に、カテゴリー名、タグ名、を含める
以下2点を試しました。
php
1/** 2 * サイト内検索の範囲に、カテゴリー名、タグ名、を含める 3 */ 4function custom_search($search, $wp_query) { 5global $wpdb; 6 7//サーチページ以外だったら終了 8if (!$wp_query->is_search) 9 return $search; 10 11if (!isset($wp_query->query_vars)) 12 return $search; 13 14// ユーザー名とか、タグ名・カテゴリ名も検索対象に 15$search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : ''); 16 if ( count($search_words) > 0 ) { 17 $search = ''; 18 foreach ( $search_words as $word ) { 19 if ( !empty($word) ) { 20 $search_word = $wpdb->escape("%{$word}%"); 21 $search .= " AND ( 22 {$wpdb->posts}.post_title LIKE '{$search_word}' 23 OR {$wpdb->posts}.post_content LIKE '{$search_word}' 24 OR {$wpdb->posts}.post_author IN ( 25 SELECT distinct ID 26 FROM {$wpdb->users} 27 WHERE display_name LIKE '{$search_word}' 28 ) 29 OR {$wpdb->posts}.ID IN ( 30 SELECT distinct r.object_id 31 FROM {$wpdb->term_relationships} AS r 32 INNER JOIN {$wpdb->term_taxonomy} AS tt ON r.term_taxonomy_id = tt.term_taxonomy_id 33 INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id 34 WHERE t.name LIKE '{$search_word}' 35 OR t.slug LIKE '{$search_word}' 36 OR tt.description LIKE '{$search_word}' 37 ) 38 ) "; 39 } 40 } 41 } 42 43 return $search; 44 } 45 add_filter('posts_search','custom_search', 10, 2);
プラグインの追加
下記のプラグインを追加しタグとカテゴリーを表示
search everything
https://ja.wordpress.org/plugins/search-everything/
タイトルのみの設定をおこなったあと、下記のソースを入れてみましたが、
検索結果は本文もでてきてしまいました。
function posts_search_title_only( $orig_search, $query ) { if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) { global $wpdb; $search = ''; $q = $query->query_vars; $n = ! empty( $q['exact'] ) ? '' : '%'; $searchand = ''; foreach ( $q['search_terms'] as $term ) { $include = '-' !== substr( $term, 0, 1 ); if ( $include ) { $like_op = 'LIKE'; $andor_op = 'OR'; } else { $like_op = 'NOT LIKE'; $andor_op = 'AND'; $term = substr( $term, 1 ); } $like = $n . $wpdb->esc_like( $term ) . $n; // 検索対象をタイトルのみにします。 $search .= $wpdb->prepare( "{$searchand}(($wpdb->posts.post_title $like_op %s))", $like ); $searchand = ' AND '; } if ( ! empty( $search ) ) { $search = " AND ({$search}) "; if ( ! is_user_logged_in() ) $search .= " AND ($wpdb->posts.post_password = '') "; } return $search; } else { return $orig_search; } } add_filter( 'posts_search', 'posts_search_title_only', 10, 2 ); /** * サイト内検索の範囲に、カテゴリー名、タグ名、を含める */ 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 = $wpdb->escape("%{$word}%"); $search .= " AND ( {$wpdb->posts}.post_title LIKE '{$search_word}' OR {$wpdb->posts}.post_content LIKE '{$search_word}' OR {$wpdb->posts}.post_author IN ( SELECT distinct ID FROM {$wpdb->users} WHERE display_name 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}' ) ) "; } } } return $search; } add_filter('posts_search','custom_search', 10, 2);
次にソースの部分をやめ
プラグインの追加でも試してみましたが、やはり本文のキーワードがでてきてしまいました。
何かソースの書き方がまずいのでしょうか?
記事タイトルとタグ、カテゴリーのみで検索結果を表示するやり方はなにかいい方法はないでしょうか?
もしくはなにかいいプラグインはないでしょうか?
回答1件
あなたの回答
tips
プレビュー