1

I have two custom post types, playlists and games. Playlists have a ACF repeater field, that contain games.

My goal: I am trying to build a simple query, that gets all playlists that DO NOT have this game listed in the repeater field AND alll playlists that are empty (do not have any repeater fields / database entries at all). I want to use the get_posts() function to achieve my goal, if possible.

My problem: I can only get the query to show ONLY the playlists that HAVE the game by using the = operator in the "game_filter" meta query compare field (but I want the opposite). If I choose the != or <> or IS NOT operator, it spits out all available posts. And if I also include my "empty_playlists" meta query, it ALWAYS shows me all playlists, no matter what operators I use, even tho it is a OR and the listed posts do have entrys.

I tried a lot but just cant get it to work. All exmaples I found were about different things, mostly about the % problem with the repeater field names and its solution. I hope someone can help me with this real quick. What am I doing wrong? Please help fellow and better coders! :-)

This is my code

$excluded_playlists_game_id = 274;
$user_id = 1;
$args = array(
    'post_type'        => PSiCorePostTypes::PLAYLISTS,
    'author'           => $user_id,
    'order_by'         => 'title',
    'order'            => 'ASC',
    'suppress_filters' => false,
    'meta_query'       => array(
        'relation'  => 'OR',
        'game_filter'     => array(
            'type'    => 'NUMERIC',
            'key'     => 'psi_playlist_games_%_item',
            'compare' => '!=',
            'value'   => $excluded_playlists_game_id,
        ),
        'empty_playlists' => array(
            'key'     => 'psi_playlist_games_%_item',
            'compare' => 'NOT EXISTS',
        ),
    ),
);
$user_playlists = get_posts( $args );

and this function for the % problem.

add_filter( 'posts_where', 'get_user_playlists_query_allow_wildcard' );
function get_user_playlists_query_allow_wildcard( $where ) {
    global $wpdb;
    $where = str_replace(
        "meta_key = 'psi_playlist_games_%_item",
        "meta_key LIKE 'psi_playlist_games_%_item",
        $wpdb->remove_placeholder_escape( $where )
    );

    return $where;
}

0 Answers0