1

I try to integrate to my CPT archive page some ACF filters. I start with this tutorial : https://www.advancedcustomfields.com/resources/creating-wp-archive-custom-field-filter/ It works when I use it with ACF radio field (like the example in the tutorial). Now, I try to make it work with ACF checkbox field. When I select one filter, I have no results...

This is my code :

$GLOBALS['my_query_filters'] = array(
'field_5cb6ef1f75209'  => 'alcool',
);


// action
add_action('pre_get_posts', 'my_pre_get_posts', 10, 1);

function my_pre_get_posts( $query ) {

// bail early if is in admin
if( is_admin() ) return;


// bail early if not main query
// - allows custom code / plugins to continue working
//if( !$query->is_main_query() ) return;

// get meta query
$meta_query = $query->get('meta_query');


// loop over filters
foreach( $GLOBALS['my_query_filters'] as $key => $name ) {

    // continue if not found in url
    if( empty($_GET[ $name ]) ) {

        continue;

    }

    // get the value for this filter
    // eg: http://www.website.com/events?city=melbourne,sydney
    $value = explode(',', $_GET[ $name ]);

    // append meta query
    $meta_query = array(
        array(
            'key'     => $name,
            'value'       => $value,
            'compare'  => 'IN',
        )
    );

}

// update meta query
$query->set('meta_query', $meta_query);
return;

}

My field 'alcool' is a checkbox. When I replace it with a radio field, it's okay. But I have to use checkboxes.

I try several solutions and I work around arrays and strings, but nothing work...

Thank's !

1 Answer 1

0

Checkbox field is stored as serialized array, therefore you can not use the IN operator and array with the values you are looking for.

To get posts with checked "melbourne", change meta_query to:

$meta_query = array(
    array(
        'key'      => $name,
        'value'    => '"melbourne"',
        'compare'  => 'LIKE',
    )
);

To get posts with melbourne or sydney:

$meta_query = array(
    'relation' => 'OR',
    [
        'key'      => $name,
        'value'    => '"melbourne"',
        'compare'  => 'LIKE',
    ],
    [
        'key'      => $name,
        'value'    => '"sydney"',
        'compare'  => 'LIKE',
    ],
);

Think about changing the solution, because these types of queries negatively affect performance.

2
  • Thank you ! I was inspired by your code to make a loop between meta_query keys, and it works ;) Commented May 3, 2019 at 9:21
  • Hi @NicolasLorand, I'm just trying to do the same as you, but looping through a few different "filters" with different names (rooms, surface etc.) and many different values. All my ACF fields are checkboxes. Would you mind posting your solution, please? I can't figure out how to make it work dynamically, where it loops through all the ACF fields and their values without having to specify them one by one in the function. Thank you!
    – Kai
    Commented Dec 30, 2023 at 12:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.