Я думаю, что проблема в основном относится к структуре запросов SQL, и я не эксперт ....
Мне нужно искать сообщения (пользовательский тип сообщения) по 2 параметрам:
pd_city
pd_country
Обратите внимание, что отношение meta_query имеет значение «ИЛИ», поэтому, если любой из двух выше, как «LIKE», мы должны получить некоторые результаты.
Третий ключ (is_sponsored) используется для сортировки сообщений! Это может быть 1 или 0, и посты, чье значение is_sponsored равно 1, должны быть указаны вверху.
Итак, вот вещь WordPress:
$sfp_query_args = array(
'sfp_complex_search' => 'yeap',
'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $term_id ) ),
//'meta_key' => 'is_sponsored',
'post_type' => 'sfpposts',
'post_status' => 'publish',
'showposts' => (int)$per_page,
'paged' => $paged,
'meta_query' => array( 'relation' => 'OR',
array( 'key' => 'pd_city', 'value' => $sfp_search_meta, 'compare' => 'LIKE' ),
array( 'key' => 'pd_country', 'value' => $sfp_search_meta, 'compare' => 'LIKE' ),
array( 'key' => 'is_sponsored' )
)
);
$sfp_search = new WP_Query( $sfp_query_args );
Мне также нужно отфильтровать результаты с помощью "posts_orderby", чтобы спонсировать результаты в топ:
add_filter( 'posts_orderby', 'sfp_modify_search' );
function sfp_modify_search( $orderby ) {
if( !is_admin() && is_page( $this->options[ 'sfp_page_entries_search' ] ) ) {
global $wpdb;
$orderby = " CASE WHEN mt2.meta_value = 0 THEN 1 END, $wpdb->posts.post_date DESC ";
}
return $orderby;
}
Реальная проблема заключается в том, что с этим запросом возвращаются ВСЕ ПОЗИЦИИ из "sfp_post_category", а не только те, которые соответствуют "pd_city" или "pd_country", потому что ВСЕ ПОСТЫ ИМЕЮТ "is_sponsored" мета-ключ (и значение установлено в 1 или 0). Еще раз: "is_sponsored" необходим для сортировки!
Когда var_dump
var_dump( $sfp_search->request );
... WordPress 'sql выглядит так:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (77) )
AND wp_posts.post_type = 'sfpposts'
AND (wp_posts.post_status = 'publish')
AND ( (wp_postmeta.meta_key = 'pd_city'
AND CAST(wp_postmeta.meta_value AS CHAR)
LIKE '%something%')
OR (mt1.meta_key = 'pd_country'
AND CAST(mt1.meta_value AS CHAR)
LIKE '%something%')
OR mt2.meta_key = 'is_sponsored' )
GROUP BY wp_posts.ID
ORDER BY CASE WHEN mt2.meta_value = 0 THEN 1 END, wp_posts.post_date DESC
LIMIT 0, 10
Как удалить из результатов все сообщения, которые не соответствуют "pd_city" или "pd_country"?
источник