web-dev-qa-db-fra.com

Correspondance des tableaux sérialisés avec meta_query

J'ai déjà posé une question connexe auparavant, mais je pense avoir enfin résolu le noeud du problème.

J'utilise Champs personnalisés avancés et un certain nombre de champs personnalisés sont attachés à mon type de publication. J'essaie de modifier l'URL pour recevoir des publications via leur champ et leur valeur personnalisés.

Et je deviens vraiment proche. C'est ce qui se trouve actuellement dans mon functions.php :

add_action('pre_get_posts', 'my_pre_get_posts');

function my_pre_get_posts( $query ) {
    if( is_admin() ) { return; }

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

        if( isset($_GET['type']) ) {                        

        $type = '"' . $_GET['type'] . '"';      

        $meta_query[] = array(
            'key'       => 'type',
            'value'     => $type,
            'compare'   => 'LIKE',
        );
    }
    $query->set('meta_query', $meta_query); // update the meta query args
    return; // always return
}

Maintenant, parce qu'ACF utilise des tableaux sérialisés lorsqu'il s'agit de gérer plusieurs valeurs dans des champs personnalisés, j'utilise la requête LIKE. Le champ personnalisé type accepte en réalité plusieurs valeurs et je peux afficher les publications de un type (i.e: women) avec succès.

website.com?type=women

Mais lorsque vous essayez de récupérer plusieurs types (c'est-à-dire: femmes, hommes, garçons), cela ne fonctionne pas.

website.com?type=women,men,boys

Maintenant, je réalise que je travaille avec des tableaux sérialisés ici, et si je voulais interroger plusieurs type, je devrais exploser cette variable $type, mais cela ne semble pas fonctionner non plus.

Si quelqu'un peut aider, je cherche désespérément une solution. Merci!

EDIT | Plusieurs fois pour chaque type:

$meta_query[] = array(
    'relation'  => 'OR',
    array( 
        'key'       => 'type',
        'value'     => 'men',
    ),
    array( 
        'key'       => 'type',
        'value'     => 'women',
    ),
    array( 
        'key'       => 'type',
        'value'     => 'boys',
    ),
);
4
realph

Je viens de comprendre moi-même comment le faire

Jetez un oeil à cet exemple:

$args = array();
$args['relation'] = 'OR';
foreach ( $tag_ids as $t ) {
    $args[] = array(
        'key'     => 'afz_entry_tags',
        'value'   => serialize( strval( $t->id ) ),
        'compare' => 'LIKE'
    );
}

$query->set( 'meta_query', $args );

Je reçois $tag_ids avec un get_results normal.

Ensuite, je crée le premier élément du tableau pour meta_query afin de définir le OR i nécessaire.

Ensuite, je parcoure la collection d'objets que j'ai reçus de get_results et crée autant de tableaux pour la méta_query que nécessaire.

Il fonctionne comme un charme.

7
e4rthdog

LIKE ne prend pas de valeur de tableau. Vos options sont probablement:

  1. Ajouter une méta requête pour chaque type, risque de ne pas bien fonctionner car vous ajoutez déjà ce contenu et vous auriez besoin de la clause OR.
  2. Utilisez REGEXP compare et collez plusieurs types dans une expression régulière, ce qui peut être très lent à exécuter.
0
Rarst