Multiple relationships in a query

I’m researching a bit WP_Query and me a problem has arisen.

I have custom fields in tickets and would like to make a WP_Query showing this (put an example):

Read More
(field1 = “data1″ AND field2 = “data2″) OR (field1 = “data2″ AND field2 = “data1″)

To do this I created this query but it returns me well.

'meta_query' => array (
    'relation' => 'AND',
    array (
        'key'     => 'field1',
        'value'   => 'data1',
        'compare' => '='
    ),
    array (
        'key'     => 'field2',
        'value'   => 'data2',
        'compare' => '='
    ),

    'relation' => 'OR',
    array (
        'relation' => 'AND',
        array (
            array (
                'key'     => 'field1',
                'value'   => 'data2',
                'compare' => '='
            ),
            array (
                'key'     => 'field2',
                'value'   => 'data1',
                'compare' => '='
            ),
        ),
    ),
)

Does anyone know what I’m wrong? I tried different ways but nothing (I put this because it is what I think is the one that comes closest.

Greetings and thanks!

PD: Sorry for my english! (Google Translate)

Related posts

3 comments

  1. Unfortunately, meta queries do not support a combination of AND & OR. But what you can do, is make two queries, one for each rule, then combine the results.

    $group_1 = get_posts(
        array(
            'posts_per_page' => -1,
            'fields'         => 'ids',
            'meta_query'     => array (
                array (
                    'key'   => 'field1',
                    'value' => 'data1',
                ),
                array (
                    'key'   => 'field2',
                    'value' => 'data2',
                ),
            ),
        )
    );
    
    $group_2 = get_posts(
        array(
            'posts_per_page' => -1,
            'fields'         => 'ids',
            'meta_query'     => array (
                array (
                    'key'   => 'field1',
                    'value' => 'data2',
                ),
                array (
                    'key'   => 'field2',
                    'value' => 'data1',
                ),
            ),
        )
    );
    
    $query = new WP_Query(
        array(
            'post__in' => array_merge( $group_1, $group_2 ),
        )
    );
    
  2. Use the posts_clauses filter for that. Just alter the array parts in there to what you need.

  3. You could still do this within a WP_Query delcaration. Use the compare value of IN and pass the value an array of possible values.

    $my_query = new WP_Query( array(
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key' => 'field1',
                'value' => array('data1', data2'),
                'compare' => 'IN'
            ),
            array(
                'key' => 'field2',
                'value' => array('data1', data2'),
                'compare' => 'IN'
            ),
        ) );
    

    This would also however, return the possibilities of (field1='data1' and field1='data1') or (field1='data2' and field1='data2)', so perhaps this isn’t ideal. I’m not sure if that doesn’t meet your requirements.

Comments are closed.