Wordpress WP_Query where clause with OR?

2019-01-28 21:45发布

问题:

hello friends this is my args for WP_Query.

$args = array('post_type' => 'job_listing');
$args['meta_query']=array(
   'relation' => 'OR',
    array(
        'key' => 'app_trailer-type',
        'value' => $job_tailor,
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'app_pay-type',
        'value' => $app_pay_type,
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'geo_address',
        'value' => $geo_address,
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'geo_country',
        'value' => $geo_country,
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'geo_short_address',
        'value' => $geo_short_address,
        'compare' => 'LIKE'
    ),
);

this is return query like.

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  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)
INNER JOIN wp_postmeta AS mt3 ON (wp_posts.ID = mt3.post_id)
INNER JOIN wp_postmeta AS mt4 ON (wp_posts.ID = mt4.post_id) WHERE 1=1  AND wp_posts.post_type = 'job_listing' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'expired' OR wp_posts.post_status = 'tr_pending' OR wp_posts.post_status = 'tr_failed' OR wp_posts.post_status = 'tr_completed' OR wp_posts.post_status = 'tr_activated' OR wp_posts.post_status = 'private') AND ( (wp_postmeta.meta_key = 'app_trailer-type' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%Flatbed%')
AND  (mt1.meta_key = 'app_pay-type' AND CAST(mt1.meta_value AS CHAR) LIKE '%Per Week%')
AND  (mt2.meta_key = 'geo_address' AND CAST(mt2.meta_value AS CHAR) LIKE '%Davenport%')
AND  (mt3.meta_key = 'geo_country' AND CAST(mt3.meta_value AS CHAR) LIKE '%United States%')
AND  (mt4.meta_key = 'geo_short_address' AND CAST(mt4.meta_value AS CHAR) LIKE '%Davenport%') ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10

i required query that query like.

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  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)
INNER JOIN wp_postmeta AS mt3 ON (wp_posts.ID = mt3.post_id)
INNER JOIN wp_postmeta AS mt4 ON (wp_posts.ID = mt4.post_id) WHERE 1=1  AND wp_posts.post_type = 'job_listing' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'expired' OR wp_posts.post_status = 'tr_pending' OR wp_posts.post_status = 'tr_failed' OR wp_posts.post_status = 'tr_completed' OR wp_posts.post_status = 'tr_activated' OR wp_posts.post_status = 'private') AND ( (wp_postmeta.meta_key = 'app_trailer-type' OR CAST(wp_postmeta.meta_value AS CHAR) LIKE '%Flatbed%')
OR  (mt1.meta_key = 'app_pay-type' AND CAST(mt1.meta_value AS CHAR) LIKE '%Per Week%')
OR  (mt2.meta_key = 'geo_address' AND CAST(mt2.meta_value AS CHAR) LIKE '%Davenport%')
OR  (mt3.meta_key = 'geo_country' AND CAST(mt3.meta_value AS CHAR) LIKE '%United States%')
OR  (mt4.meta_key = 'geo_short_address' AND CAST(mt4.meta_value AS CHAR) LIKE '%Davenport%') ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10

please help.

回答1:

changed args with like.

$args = array('post_type' => 'job_listing', 'relation' => 'OR');
$args['meta_query']=array(
    array(
        'key' => 'app_trailer-type',
        'value' => $job_tailor,
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'app_pay-type',
        'value' => $app_pay_type,
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'geo_address',
        'value' => $geo_address,
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'geo_country',
        'value' => $geo_country,
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'geo_short_address',
        'value' => $geo_short_address,
        'compare' => 'LIKE'
    ),
);


回答2:

For the OR Query argument array should be like this:

$args = array(
    'post_type' => 'post',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'app_trailer-type',
            'value' => $job_tailor,
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'app_pay-type',
            'value' => $app_pay_type,
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'geo_address',
            'value' => $geo_address,
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'geo_country',
            'value' => $geo_country,
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'geo_short_address',
            'value' => $geo_short_address,
            'compare' => 'LIKE'
        ),
    )
);

Reference: http://codex.wordpress.org/Class_Reference/WP_Query



回答3:

You may try something like this

$args = array(
    'post_type' => 'job_listing',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'app_trailer-type',
            'value' => $job_tailor,
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'app_pay-type',
            'value' => $app_pay_type,
            'compare' => 'LIKE'
        ),
        // ....
    )
);

Read more on Codex.



回答4:

From the WP_Query Class Reference (link):

Important Note: tax_query takes an array of tax query arguments arrays (it takes an array of arrays) - you can see this in the second example below. This construct allows you to query multiple taxonomies by using the relation parameter in the first (outer) array to describe the boolean relationship between the taxonomy queries.

You should add an array('relation' => 'OR') to the beginning of your meta_query array.



标签: php wordpress