🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1458閲覧

wordpressの検索結果を記事タイトルとタグ・カテゴリーで検索したい。

ttkun

総合スコア30

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/09/06 02:17

編集2019/09/09 00:41

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 );

参考:
http://wpcj.net/1709

こちらの処理を行いタイトルのみ出力を行いました。

サイト内検索の範囲に、カテゴリー名、タグ名、を含める

以下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);

次にソースの部分をやめ
プラグインの追加でも試してみましたが、やはり本文のキーワードがでてきてしまいました。

何かソースの書き方がまずいのでしょうか?
記事タイトルとタグ、カテゴリーのみで検索結果を表示するやり方はなにかいい方法はないでしょうか?
もしくはなにかいいプラグインはないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2019/09/08 07:00

質問に記載された custom_search の function の 前半が切れているように見えるのですが、この custom_search は、記載されたコードで全部でしょうか?
ttkun

2019/09/09 00:42

失礼しました。切れていたところを追加しました。 ただコードを突っ込んだだけなので細かい意味まで把握しておりません。 不要なソースなどあればご指摘ください。
guest

回答1

0

ベストアンサー

質問に記載された custom_searchの下の部分が検索条件を設定している部分です。

php

$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}' ) ) ";
3行目でpost_content(本文)から$search_wordを探すと指定しているので、この行を削除すればご希望の検索結果になるかと思います。

投稿2019/09/09 23:28

warajies

総合スコア82

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問