web-dev-qa-db-fra.com

Fonction dans le tableau comme argument pour WP_Query

J'ai cette fonction codée en dur dans content-single-product.php (WooCommerce) et cela fonctionne pour montrer 3 produits aléatoires de catégories ID 64 et 72 :

$args = array(
    'post_type'      => 'product',
    'post_status'    => 'publish',
    'posts_per_page' => '3',
    'orderby'        => 'Rand',
    'tax_query'      => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'term_id',
            'terms'    => array( 64, 72 ),
        ),
    ),
);

$loop = new WP_Query( $args );

while ( $loop->have_posts() ) : $loop->the_post();
    global $product;

Maintenant, au lieu de coder en dur l'ID de la catégorie, j'ai ajouté un champ personnalisé au produit MyCustomField et écrit 64,72 dans celui-ci. Ensuite, j'ai essayé de modifier le code ci-dessus pour qu'il soit rempli dynamiquement:

$MyCustomField = get_post_meta($post->ID, 'MyCustomField', true);

$args = array(
    'post_type'      => 'product',
    'post_status'    => 'publish',
    'posts_per_page' => '3',
    'orderby'        => 'Rand',
    'tax_query'      => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'term_id',
            'terms'    => array( $MyCustomField ),
        ),
    ),
);

$loop = new WP_Query( $args );

while ( $loop->have_posts() ) : $loop->the_post();
    global $product;

Malheureusement, cela ne fonctionne pas correctement:

'terms' => array( $MyCustomField )

car il n’affiche que les produits de la première catégorie (ID 64), et non des deux, comme je le souhaite.

Je suis un programmeur débutant alors qu'est-ce que j'ai mal fait? Merci!

5
Alex

Je soupçonne que le problème provient de $MyCustomField que vous entrez en tant que tel dans:

'terms' => array( $MyCustomField ),

La requête la considère comme une seule valeur: '64,72', une chaîne.

Alors essayez:

$MyCustomFieldValues = array_map( 'intval', explode( ',', $MyCustomField ) );

Cela garantira également que vos valeurs sont des entiers.

Ensuite:

'terms' => $MyCustomFieldValues,
7
ClemC

À partir du codex WordPress:

relation (chaîne) - La relation logique entre chaque tableau de taxonomie interne lorsqu'il en existe plusieurs. Les valeurs possibles sont 'AND', 'OU'. Ne pas utiliser avec un seul tableau de taxonomie interne.

Peu d’autres choses aussi, vous devriez enregistrer les valeurs dans la méta personnalisée sous forme de tableau. WordPress sérialisera automatiquement cette valeur:

Utiliser update_post_meta va sérialiser automatiquement tout tableau que vous lui transmettez:

update_post_meta( $post_id, 'MyCustomField', array( 64, 72 ) );

Ensuite, vous pouvez simplement le désérialiser lorsque vous extrayez la valeur:

$MyCustomField = maybe_unserialize( get_post_meta( $post->ID, 'MyCustomField', TRUE ) );

Vous devriez probablement également vérifier que vous avez une valeur avant de passer l'appel WP_Query.

if( ! empty( $MyCustomField ) ){

    $args = array(
        'post_type'      => 'product',
        'post_status'    => 'publish',
        'posts_per_page' => '3',
        'orderby'        => 'Rand',
        'tax_query'      => array(
            array(
                'taxonomy' => 'product_cat',
                'field'    => 'term_id',
                'terms'    => $MyCustomField,
            ),
        ),
    );

}

Si vous envisagez d'ajouter ces valeurs via l'interface WP _ Admin (ce qui signifie que vous souhaitez saisir un fichier CSV), vous devez utiliser l'approche @ClemC et utiliser explode, avec array_map pour convertir en entiers.

4
sMyles

Si vous passez le texte (chaîne) "64,72" à une fonction qui attend un tableau d'entiers, vous devez traduire cette chaîne entrante en un tableau d'entiers. Essayez d’ajouter cette instruction avant votre instruction $args =:

$MyCustomField = array_map('intval', explode(',', $MyCustomField));
2
C C