简体   繁体   中英

WP_Query, using AND with OR

I have the below PHP:-

    $args = array(
        'posts_per_page'=> -1,
        'post_type'     => 'jobs',
        'order'             => 'ASC',
        's' => $search_field,
        'meta_query'    => array(
            'relation' => 'AND',
            array(
                'key'       => 'job_salary_from',
                'value'     => $job_salary_from,
                'compare'   => '>=',
            ),
            array(
                'key'       => 'job_salary_from',
                'value'     => $job_salary_to,
                'compare'   => '<=',
            ),
            array(
            'relation' => 'OR',
            array(
                'key'       => 'job_salary_to',
                'value'     => $job_salary_from,
                'compare'   => '>=',
            ),
            array(
                'key'       => 'job_salary_to',
                'value'     => $job_salary_to, 
                'compare'   => '<=',
            ),
        ))              
    );

Lets say there is a job that is from 19000 to 22000 called 'ABC', so job_salary_from = 19000 and job_salary_to = 22000.

Now lets say I search a job that is between 10000 and 19000, so $job_salary_from = 10000 and $job_salary_to = 19999.

This shows up when I do a search which is correct. However, if I search for a job that is between 20000 and 29999, so $job_salary_from = 19999 and $job_salary_to = 29999 nothing is showing up.

Where as the job 'ABC' should show up because $job_salary_to is within the search bracket.

Any help would be much appreciated.

I think the meta_query syntax is not quite right. Try this:

$args = array(
    'posts_per_page'=> -1,
    'post_type'     => 'jobs',
    'order'             => 'ASC',
    's' => $search_field,
    'meta_query'    => array(
        'relation' => 'OR',

        array(
            'relation' => 'AND',
            array(
                'key'       => 'job_salary_to',
                'value'     => $job_salary_from,
                'type'    => 'numeric', //for each case
                'compare'   => '>=',
            ),
            array(
                'key'       => 'job_salary_to',
                'value'     => $job_salary_to,
                'type'    => 'numeric',
                'compare'   => '<=',
            ),
        ),

        array(
            'relation' => 'AND',
            array(
                'key'       => 'job_salary_from',
                'value'     => $job_salary_from,
                'type'    => 'numeric',
                'compare'   => '>=',
            ),
            array(
                'key'       => 'job_salary_from',
                'value'     => $job_salary_to,
                'type'    => 'numeric',
                'compare'   => '<=',
            ),
        )
    )
);

Also you can try to use BETWEEN , even I am not sure if this is inclusive or exclusive compare.

that is because there is a different function to fetch results in between a range.

Try the following example to fetch results in between a range

$args = array(
    'post_type'  => 'product',
    'meta_query' => array(
        array(
            'key'     => 'color',
            'value'   => 'blue',
            'compare' => 'NOT LIKE',
        ),
        array(
            'key' => 'price',
            'value'   => array( 20, 100 ),
            'type'    => 'numeric',
            'compare' => 'BETWEEN',
        ),
    ),
);
$query = new WP_Query( $args );

More resources here https://codex.wordpress.org/Class_Reference/WP_Query

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM