Support

Account

Home Forums General Issues Relationship Field query by array of IDS.

Solved

Relationship Field query by array of IDS.

  • I have a custom post type named file. I also have a custom post type named ‘circle’. The file post type has a custom relationship field called circles which allows for one or more circles to be selected and attached to the file post type.

    Now I would like to query for files based on circle ids if another field called file_type is set to circle.

    If I hard code this query it works exactly as I would expect.

    	$fileArgs = array(
    		'posts_per_page' => -1,
    		'post_type'      => 'file',
    		'meta_query'     => array(
    			'relation' => 'AND',
    			array(
    				'key'     => 'file_type',
    				'value'   => 'circle',
    				'compare' => '=', 
    			),
    			array(
    				'relation' => 'OR',
    				array(
    					'key' => 'circles',
    					'value' => "67",
    					'compare' => 'LIKE'
    				),
    				array(
    					'key' => 'circles',
    					'value' => "62",
    					'compare' => 'LIKE'
    				)
    			)
    		),
    	);
    	
    	return get_posts($fileArgs);

    Now the problem I have is the ids of circles will need to be dynamic so my solution I thought should work looks something like this.

    	$ids = array(67, 62);
    	foreach ($ids as $id) {
    		$circleRelations[] = array(
    			'key' => 'circles',
    			'value' => "$id",
    			'compare' => 'LIKE'
    		);
    	}
    
    	$fileArgs = array(
    		'posts_per_page' => -1,
    		'post_type'      => 'file',
    		'meta_query'     => array(
    			'relation' => 'AND',
    			array(
    				'key'     => 'file_type',
    				'value'   => 'circle',
    				'compare' => '=', 
    			),
    			array(
    				'relation' => 'OR',
    				$circleRelations
    			)
    		),
    	);
    	
    	return get_posts($fileArgs);

    However this does not work and I am not really sure why.

  • When you append the query like that, it becomes another level deep, which is not what you want.

    
    ...
    [relation] => OR
    [0] => Array (
        [0] => Array (
            [key] => circles
            [value] => 67
            [compare] => LIKE
        ),
        [1] => Array (
            [key] => circles
            [value] => 62
            [compare] => LIKE
        )
    )
    

    Try to use array merge to merge them, something like:

    
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key'     => 'file_type',
            'value'   => 'circle',
            'compare' => '=',
        ),
        array_merge(array('relation' => 'OR'), $circleRelations)
    ),
    

    Cheers.

  • @gummiforweb Thanks for the help. This worked perfectly.

Viewing 3 posts - 1 through 3 (of 3 total)

You must be logged in to reply to this topic.