it-swarm.com.de

Funktion im Array als Argument für WP_Query

Ich habe diese Funktion in content-single-product.php (WooCommerce) fest codiert und sie zeigt 3 zufällige Produkte aus Kategorien ID 64 und 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;

Anstatt die Kategorie-ID fest zu codieren, fügte ich dem Produkt MyCustomField ein benutzerdefiniertes Feld hinzu und schrieb 64,72 hinein. Dann habe ich versucht, den obigen Code so zu ändern, dass er dynamisch ausgefüllt wird:

$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;

Leider funktioniert das nicht richtig:

'terms' => array( $MyCustomField )

weil es nur Produkte aus der ersten Kategorie (ID 64) anzeigt und nicht aus beiden, wie ich will.

Ich bin ein Programmieranfänger. Was habe ich falsch gemacht? Vielen Dank!

5
Alex

Ich vermute, das Problem kommt von $MyCustomField, den Sie als solches eingeben:

'terms' => array( $MyCustomField ),

Die Abfrage betrachtet es als nur einen Wert: '64,72', eine Zeichenfolge.

Also versuche:

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

Dadurch wird auch sichergestellt, dass Ihre Werte Ganzzahlen sind.

Dann:

'terms' => $MyCustomFieldValues,
7
ClemC

Aus dem WordPress-Codex:

relation (string) - Die logische Beziehung zwischen jedem inneren Taxonomie-Array, wenn es mehr als ein Array gibt. Mögliche Werte sind 'AND', 'OR'. Nicht mit einem einzelnen inneren Taxonomie-Array verwenden.

Einige andere Dinge auch, sollten Sie die Werte in der benutzerdefinierten Meta als Array speichern, wird WordPress diesen Wert automatisch serialisieren:

Durch die Verwendung von update_post_meta werden alle übergebenen Arrays automatisch serialisiert:

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

Dann können Sie es einfach unserialisieren, wenn Sie den Wert ziehen:

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

Sie sollten wahrscheinlich auch überprüfen, ob Sie einen Wert haben, bevor Sie den WP_Query-Aufruf durchführen

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,
            ),
        ),
    );

}

Wenn Sie diese Werte über die Admin-Schnittstelle WP hinzufügen möchten (dh, Sie möchten eine CSV-Datei eingeben), sollten Sie den @ ClemC-Ansatz verwenden und explode mit array_map zum Konvertieren in Ganzzahlen verwenden

4
sMyles

Wenn Sie den Text (String) "64,72" an eine Funktion übergeben, die ein Array von Ganzzahlen erwartet, müssen Sie diesen eingehenden String in ein ganzzahliges Array übersetzen. Fügen Sie diese Anweisung vor Ihrer $args =-Anweisung hinzu:

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