私たちの大規模なWordpressのインストールの作家は、コンテンツ検索機能を使用するのが大好きです。この機能と同じくらい便利ですが、そのクエリの複雑さはデータベースをかなり遅くします。これは、ほんの数分前の遅いクエリログで見つけたSQLクエリの例です。
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE 1=1
AND (
((wp_posts.post_title LIKE '%Made%') OR (wp_posts.post_content LIKE '%Made%'))
AND ((wp_posts.post_title LIKE '%in%') OR (wp_posts.post_content LIKE '%in%'))
AND ((wp_posts.post_title LIKE '%the%') OR (wp_posts.post_content LIKE '%the%'))
AND ((wp_posts.post_title LIKE '%shade:%') OR (wp_posts.post_content LIKE '%shade:%'))
AND ((wp_posts.post_title LIKE '%Easy%') OR (wp_posts.post_content LIKE '%Easy%'))
AND ((wp_posts.post_title LIKE '%tips%') OR (wp_posts.post_content LIKE '%tips%'))
AND ((wp_posts.post_title LIKE '%to%') OR (wp_posts.post_content LIKE '%to%'))
AND ((wp_posts.post_title LIKE '%care%') OR (wp_posts.post_content LIKE '%care%'))
AND ((wp_posts.post_title LIKE '%for%') OR (wp_posts.post_content LIKE '%for%'))
AND ((wp_posts.post_title LIKE '%your%') OR (wp_posts.post_content LIKE '%your%'))
AND ((wp_posts.post_title LIKE '%outdoor%') OR (wp_posts.post_content LIKE '%outdoor%'))
AND ((wp_posts.post_title LIKE '%furniture%') OR (wp_posts.post_content LIKE '%furniture%'))
)
AND wp_posts.post_type = 's5_post'
AND (
wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'future'
OR wp_posts.post_status = 'draft'
OR wp_posts.post_status = 'pending'
OR wp_posts.post_status = 'private'
)
ORDER BY wp_posts.post_date DESC LIMIT 0, 20
あの男のサイズをチェックしてください。ゆっくり走るのも不思議ではありません。
この機能を少し効率的にするための微調整をコーディングする方法についてのアイデアを聞きたいです。 (私はすでに私自身のアイデアをいくつか持っています。うまくいけばあなたのものは私のものより優れています!:))
WHERE
句の変更検索中にクエリに使用されるSQLのWHERE
句をフィルタできるposts_search
というフィルタがあります(WP_Query::is_search()
がtrueを返し、WP_Query->s
が設定されている場合)。
add_filter( 'posts_search', 'wpse134392PostsSearchSQL', 20, 2 );
function wpse134392PostsSearchSQL( $sql, $wp_query )
{
// Alter SQL clause here
return $where;
}
ORDERBY
ORDERBY
ステートメントを傍受するには(例えば著者によるソートのために、検索する著者が最初に/最後に投稿を取得するため)、posts_search_orderby
を使用することができます。
add_filter( 'posts_search_orderby', 'wpse134392PostsSearchOrderbySQL', 20, 2 );
function wpse134392PostsSearchOrderbySQL( $orderby, $wp_query )
{
if ( is_admin() )
return $GLOBALS['wpdb']->posts."post_date";
return $orderby;
}
is_admin()
と$query->is_search()
がTRUE
であるかどうかをコールバック内でチェックすることで、posts_clauses
またはpre_get_posts
を変更してさらに細かく調整された結果を返すこともできます。
役に立たない一般的な用語を除外するには、WP_Query::get_search_stopwords()
またはそれ以上を使用します。フィルタのコールバック。現在ストップワードは次のとおりです。
about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www
フィルタコールバックの例:
add_action( 'wp_search_stopwords', 'wpse134392SearchStopwords' );
function wpse134392SearchStopwords( $stopwords )
{
return $stopwords + array(
'my',
'your',
'easy',
);
}
ヒント:検索されてはいけない単語があるので、何か(おそらくプラグイン)が既にコールバックを妨害しているようです。
$ argsを次のようにして、クエリをに変更することをお勧めします。
$args = array(
'post_status' => array('pending', 'draft', 'future' ),
'post_type' => array( 'post', 'page', 'movie', 'book' ),
'orderby' => 'date',
'order' => 'DESC',
's' => 'keyword'
);
$search_query = new WP_Query($args);
もっと詳しい説明 もあります 。私が見つけることができないように思われる唯一のことは複数のキーワードについて質問することです。たぶん、あなたがこのようなことをするならそれはうまくいくかもしれません
's' => 'keyword1+keyword2+keyword3'