WP Query Relations / Compare

Я пытаюсь заставить поисковый запрос использовать «OR» для этих аргументов. В настоящее время используется «AND», и я не могу понять, как это изменить.

Я думал, что линия:

$ args ['meta_query'] = array ('relation' => 'OR');

будет делать это, но это не работает.

if ($search != '') { $args = array( 's' => $search, 'posts_per_page' => $posts_per_page, 'paged' => $paged, 'post_type' => 'property', 'post_status' => 'publish' ); }else{ $args = array( 'posts_per_page' => $posts_per_page, 'paged' => $paged, 'post_type' => 'property', 'post_status' => 'publish' ); } //Custom Searches $search_array = get_search_array($search); $compare = 'REGEXP'; $search_array = implode("|", $search_array); $args['meta_query'] = array('relation' => 'OR'); array_push($args['meta_query'], array('relation' => 'OR', array( 'key' => 'property_address', 'value' => $search_array, 'compare' => $compare ), array( 'key' => 'property_city', 'value' => $search_array, 'compare' => $compare ), array( 'key' => 'property_state', 'value' => $search_array, 'compare' => $compare ), array( 'key' => 'property_zip', 'value' => $search_array, 'compare' => $compare ), array( 'key' => 'mlnumber', 'value' => $search_array, 'compare' => $compare ), array( 'key' => 'marketing_remarks', 'value' => $search, 'compare' => 'LIKE' ) ) ); 

К сожалению, я продолжаю:

 SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND (((wp_posts.post_title LIKE '%201701057%') OR (wp_posts.post_excerpt LIKE '%201701057%') OR (wp_posts.post_content LIKE '%201701057%'))) AND ( ( ( wp_postmeta.meta_key = 'property_address' AND wp_postmeta.meta_value REGEXP '201701057' ) OR ( wp_postmeta.meta_key = 'property_city' AND wp_postmeta.meta_value REGEXP '201701057' ) OR ( wp_postmeta.meta_key = 'property_state' AND wp_postmeta.meta_value REGEXP '201701057' ) OR ( wp_postmeta.meta_key = 'property_zip' AND wp_postmeta.meta_value REGEXP '201701057' ) OR ( wp_postmeta.meta_key = 'mlnumber' AND wp_postmeta.meta_value REGEXP '201701057' ) OR ( wp_postmeta.meta_key = 'marketing_remarks' AND wp_postmeta.meta_value LIKE '%201701057%' ) ) ) AND wp_posts.post_type = 'property' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_title LIKE '%201701057%' DESC, wp_posts.post_date DESC LIMIT 0, 1000" 

Когда я захочу:

 SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND (((wp_posts.post_title LIKE '%201701057%') OR (wp_posts.post_excerpt LIKE '%201701057%') OR (wp_posts.post_content LIKE '%201701057%'))) **OR** ( ( ( wp_postmeta.meta_key = 'property_address' AND wp_postmeta.meta_value REGEXP '201701057' ) OR ( wp_postmeta.meta_key = 'property_city' AND wp_postmeta.meta_value REGEXP '201701057' ) OR ( wp_postmeta.meta_key = 'property_state' AND wp_postmeta.meta_value REGEXP '201701057' ) OR ( wp_postmeta.meta_key = 'property_zip' AND wp_postmeta.meta_value REGEXP '201701057' ) OR ( wp_postmeta.meta_key = 'mlnumber' AND wp_postmeta.meta_value REGEXP '201701057' ) OR ( wp_postmeta.meta_key = 'marketing_remarks' AND wp_postmeta.meta_value LIKE '%201701057%' ) ) ) AND wp_posts.post_type = 'property' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_title LIKE '%201701057%' DESC, wp_posts.post_date DESC LIMIT 0, 1000" 

Вы не указываете, где используется код в вашем вопросе. Это что-то вроде следующего:

 $args = array ( 's' => '201701057', 'meta_query' => array ( 'relation' => 'OR', array ( 'key' => 'property_address', ... ), array ( 'key' => 'property_city', ... ), ... ), ) ; $query = new WP_Query ($args) ; 

Если да, то вы должны иметь возможность подключиться к get_meta_sql следующим образом:

 add_filter ('get_meta_sql', 'wpse_get_meta_sql_OR', 10, 6) ; function wpse_get_meta_sql_OR ($sql, $queries, $type, $primary_table, $primary_id_column, $context) { $sql['where'] = preg_replace ('/^(\s*)AND/', "$1OR", $sql['where']) ; return ($sql) ; } 

Предостережение

Как и в случае, wpse_get_meta_sql_OR() выше не предназначена для использования в коде общего назначения … потому что вы НЕ МОЖЕТЕ не хотеть OR meta_query если в meta_query есть meta_query 's' => '...' … но он, безусловно, создает желаемый SQL IF 's' => '...' это ТОЛЬКО другой аргумент WP_Query, чем `meta_query '.