web-dev-qa-db-fra.com

Filtrer les publications avec meta_query NOT IN où la valeur a plusieurs valeurs

Je voudrais utiliser un meta_key pour stocker plusieurs valeurs dans cette clé. Par la suite, j'aimerais filtrer les publications qui ne contiennent pas de valeur spécifique dans la clé. En d'autres termes, il suffit d'afficher les publications qui ne contiennent pas de valeur spécifique. Cela ne semble toutefois pas possible. J'écris cette question ici pour voir si quelqu'un est arrivé à la même conclusion ou s'il me manque quelque chose. Voici le code que j'ai utilisé:

// The values in key "_no_interest" are: 1,2,3
add_action( 'pre_get_posts', 'custom_pre_query' );
function custom_pre_query( $query ) {
    if( $query->is_main_query() && !is_admin() && $query->is_post_type_archive( 'my_custom_post_type' ) ) {
        $meta_query = array(
            array(
                'key'       => '_no_interest',
                'value'     => '3',
                'compare'   => 'NOT IN'
            )
        );
        $query->set( 'meta_query', $meta_query );
        $query->set( 'posts_per_page', -1 );
        $query->set( 'post_status', 'publish' );
        $query->set( 'orderby', 'date' );   
    }
}

Cela ne fonctionnera pas et cela ne fonctionnera pas non plus si j'utilise l'opérateur '!='. Cependant, si je mets la comparaison à 'IN' ou '=', cela fonctionnera.

Quelqu'un peut-il confirmer ceci ou quelque chose me manque-t-il?

2
Vayu Robins

Les opérateurs de comparaison NOT IN et! = Fonctionnent correctement, mais sachez que si vous utilisez des méta, vos données risquent de ne pas fonctionner correctement. En particulier, les méta_keys ne doivent pas nécessairement être uniques par publication. Un message peut avoir _no_interest défini sur 1 ET avoir une autre méta-ligne avec ce paramètre défini sur 2 également.

Ainsi, par exemple, si vous avez une publication avec _no_interest définie sur 1 et également définie sur 2 dans une autre ligne, alors même si vous excluez 2, cette publication apparaîtra car elle contient un 1 dans une autre ligne.

De plus, si vous utilisez IN ou NOT IN, votre paramètre "valeur" doit être un tableau des valeurs. Donc, votre valeur de '3' devrait être un tableau ('3') à la place.

Sachez également qu'avoir une méta qui n'existe pas pour une publication vous donnera également des résultats inattendus avec un NOT IN. Si vous faites des publications avec meta NOT IN une valeur, les publications qui n'ont pas de méta ne s'afficheront pas non plus. En d'autres termes, ils devront avoir une valeur A pour la méta, mais PAS CETTE valeur particulière. En effet, la spécification d'une méta provoque la création d'une jointure INNER, ce qui élimine les lignes dépourvues de cette méta. L'exception à cette règle utilise la comparaison NOT EXISTS.

1
Otto