web-dev-qa-db-ja.com

WP_Queryの引数としての配列内の関数

私はこの関数をcontent-single-product.php(WooCommerce)にハードコードしてあり、それは カテゴリID 64と72 から3つのランダムな商品を表示するように動作します。

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

さて、カテゴリIDをハードコーディングする代わりに、カスタムフィールドを製品MyCustomFieldに追加し、その中に 64,72 と書きました。それから私は動的に移入されるように上記のコードを修正しようとしました:

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

残念ながら、これは正しく機能しません。

'terms' => array( $MyCustomField )

なぜなら、最初のカテゴリ(ID 64)の商品のみが表示され、両方の商品は表示されないためです。

私は初心者プログラマですので、私は何を間違っていましたか?ありがとうございます。

5
Alex

問題は$MyCustomFieldから来ているのではないかと思います。

'terms' => array( $MyCustomField ),

クエリはそれを唯一の値、'64,72'、文字列と見なします。

だから試してみてください。

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

これはまたあなたの値が整数であることを保証するでしょう。

その後:

'terms' => $MyCustomFieldValues,
7
ClemC

WordPressコーデックスから:

relation(string) - 複数の配列がある場合の各内部分類配列間の論理的な関係。可能な値は 'AND'、 'OR'です。単一の内部分類法配列と一緒に使用しないでください。

他にもいくつか、あなたは配列としてカスタムメタに値を保存しているべきです、WordPressは自動的にその値をシリアル化します:

update_post_metaを使うことはあなたがそれに渡すどんなアレイでも自動的に直列化するでしょう:

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

それから値を引っ張るときあなたはただそれをシリアル化解除することができます:

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

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

}

あなたの計画がWP Adminインターフェースを通してこれらの値を追加することであるなら(あなたはCSVを入力したいという意味です)、そしてあなたは整数に変換するためにarray_mapと共に@ClemCアプローチを使い、explodeを使うべきです

4
sMyles

整数の配列を必要とする関数にテキスト(文字列) "64,72"を渡す場合、その入力文字列を整数配列に変換する必要があります。 $args =ステートメントの前にこのステートメントを追加してみてください。

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