質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.31%
WordPress

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

PHP

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

Q&A

2回答

9230閲覧

WP_Queryを使ってタイトルのLike検索がしたい

CharSS

総合スコア15

WordPress

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

PHP

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

0グッド

2クリップ

投稿2018/11/06 13:15

前提・実現したいこと

wordpressのWP_Queryを使用して、カスタム投稿タイプで投稿した記事のタイトルに対して
部分一致検索をしたいと思っています。
(簡単な検索システムです)

色々なサイトを調べたところ、
WP_Queryに渡す配列に
's' => $word
又は
'title' => $word
と記載することで、実装できるとの事で試してみました。
実際にどのようなqueryがはしっているのかを見たかったので
WP_Queryを実行した直後に
echo $my_query->request;
を入れ確認したところ意図しない結果がでました。

該当のソースコード

$condition = array(
'post_type' => 'cus_post', //表示させたい投稿タイプ
'title' => $word, // 検索ワード
'post_status' => 'publish', //投稿ステータスの指定
'posts_per_page' => 12, //表示させたい件数
'orderby' => 'post_date',
'order' => 'DESC'
);

$my_query = new WP_Query($condition);

echo $my_query->request;

試したこと

■パターン1
's' => $word
で試した場合
SELECT * FROM wp_posts WHERE 1=2
という結果が返ってきました。
■パターン2
'title' => $word
で試した場合
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_title = 'テスト' AND wp_posts.post_type = 'cus_post' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date DESC LIMIT 0, 12
という結果が返ってきました。

パターン1の方は
WHERE 1=2
という条件文が生成されていました。
パターン2の方は
うまくいっていそうに見えたのですが、完全一致で抽出されました。実装したいのは部分一致です。

よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

PHP7.2
MySQL 5.7
WordPress 4.8.7

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

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

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

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

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

guest

回答2

0

フィルタして書き換えるしかないと思います。

【WordPressのサイト内検索の検索条件をカスタマイズする | webOpixel】
https://www.webopixel.net/wordpress/584.html

その他SQLのクエリに対応したフックは下記があります。
posts_groupby
posts_join
posts_orderby
posts_where
posts_request

【【WordPressでフィルターフックをした関数を除去する】フックした条件や値を「あとに引きずらない」ように解除(除去)する方法 | 今村だけがよくわかるブログ】
https://www.imamura.biz/blog/8176

フィルター「posts_where」を使えば、SQL文のwhere節の書き方さえなんとなくわかれば、思いのままの条件で必要な情報を取得することができるんで、便利ですね。

投稿2018/11/25 08:49

kei344

総合スコア69625

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

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

0

これでどうでしょうか

php

1$condition = array( 2'post_type' => 'cus_post', //表示させたい投稿タイプ 3'title' => $word, // 検索ワード 4'compare'=>'LIKE',//$wordが含まれる投稿を検索 5'post_status' => 'publish', //投稿ステータスの指定 6'posts_per_page' => 12, //表示させたい件数 7'orderby' => 'post_date', 8'order' => 'DESC' 9); 10 11$my_query = new WP_Query($condition); 12 13echo $my_query->request; 14

投稿2018/11/21 13:39

編集2018/11/21 13:41
Drthomas

総合スコア17

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

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

Drthomas

2018/11/23 14:03

すいません。初歩的なミスでした。お騒がせしました。
CharSS

2018/11/25 08:41

Drthomas様、ありがとうございます。 結果は■パターン2で返ってきたものと同じでした。 kei344様のおっしゃる通りcompareはマニュアルにはmeta_query内でのみ使用されているようでした。 現在直接SQLを書いて、postsのidだけを取得するようにして配列に格納し、それをpost__inに設定しWP_Queryに投げる方法で取りあえず作業を進めています。 2回同じようなqueryが流れているような感じで気持ち悪いのですが。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問