web-dev-qa-db-ja.com

より効率的な管理者検索機能/プラグインはありますか?

私たちの大規模な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

あの男のサイズをチェックしてください。ゆっくり走るのも不思議ではありません。

この機能を少し効率的にするための微調整をコーディングする方法についてのアイデアを聞きたいです。 (私はすでに私自身のアイデアをいくつか持っています。うまくいけばあなたのものは私のものより優れています!:))

5
rinogo

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

きめ細かいSQL

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

}

ヒント:検索されてはいけない単語があるので、何か(おそらくプラグイン)が既にコールバックを妨害しているようです。

3
kaiser

$ 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'
0
Kyle