以下のような検索を作成したいです。
私は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には含まれていない投稿のみが表示されます。
投稿タイトルのみで検索する以外は、 WP_Query で許可されている検索パラメータを使用して、必要なことはすべて実行できます。そうするためには、この答えを見てください。
WP_Queryに渡される引数で許可されている分類法とメタサブクエリを必ず見てください。
編集:あなたはORを使用して選択する必要があるので、あなたは2つの選択肢があります - 後で2つのクエリを実行して2つのpost配列をマージすることができます。上に書いた。グローバル$ wpdbオブジェクトと関数$wpdb->get_results()
を使います。クエリが重複した結果を返さないようにするには、SELECT DISTINCT
を使用できます。
これを試してください、それは助けるかもしれません:
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';
}