web-dev-qa-db-ja.com

カスタム分類用語、役職、メタフィールド内の検索クエリ

以下のような検索を作成したいです。

  1. カスタム分類法 - custom-tags内を検索
  2. 投稿のタイトルを検索
  3. メタフィールドを選択知らない
  4. カスタム投稿タイプで検索 - 簡単な部分

私はwordpress APIに見えましたが、有用な組み込み関数を見つけることができませんでした、私は以下のカスタムクエリを作成しました。それはいつか重複した結果を返すのでここにバグがあります。

このクエリは現時点でのみtermとtitleを検索しますが、ctermと呼ばれるメタフィールドも検索したいです。

SELECT   wp_posts.*
    FROM wp_posts, wp_term_relationships, wp_term_taxonomy, wp_terms
    WHERE (wp_terms.name LIKE '%car%'
        OR wp_posts.post_title LIKE '%car%')
            AND wp_posts.post_status = 'publish'
            AND wp_posts.post_type = 'posts_vch'
        AND wp_posts.ID = wp_term_relationships.object_id
        AND wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
        AND wp_term_taxonomy.term_id = wp_terms.term_id  GROUP BY  wp_posts.ID  LIMIT  1 ,50

更新:

上記の更新されたクエリでは、group byを使用して重複した結果を削除することができます。基本的にはタイトルに "car"という単語が含まれているがterm/tagには含まれていない投稿のみが表示されます。

1
TheDeveloper

投稿タイトルのみで検索する以外は、 WP_Query で許可されている検索パラメータを使用して、必要なことはすべて実行できます。そうするためには、この答えを見てください。

WP_Queryに渡される引数で許可されている分類法とメタサブクエリを必ず見てください。

編集:あなたはORを使用して選択する必要があるので、あなたは2つの選択肢があります - 後で2つのクエリを実行して2つのpost配列をマージすることができます。上に書いた。グローバル$ wpdbオブジェクトと関数$wpdb->get_results()を使います。クエリが重複した結果を返さないようにするには、SELECT DISTINCTを使用できます。

1
jessica

これを試してください、それは助けるかもしれません:

if( !defined( 'ABSPATH' ) )
    exit;

function modify_wp_search_where( $where ) {
    if( is_search() ) {
        global $wpdb, $wp;
        $where = preg_replace(
            "/($wpdb->posts.post_title (LIKE '%{$wp->query_vars['s']}%'))/i",
            "$0 OR ( $wpdb->postmeta.meta_value LIKE '%{$wp->query_vars['s']}%' )",
            $where
            );
        add_filter( 'posts_join_request', 'modify_wp_search_join' );
        add_filter( 'posts_distinct_request', 'modify_wp_search_distinct' );
    }
    return $where;      
}
add_action( 'posts_where_request', 'modify_wp_search_where' );

function modify_wp_search_join( $join ) {  
    global $wpdb;   
    return $join .= " LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) ";   
}

function modify_wp_search_distinct( $distinct ) {   
    return 'DISTINCT';      
} 
0
Alvin