web-dev-qa-db-ja.com

Post_metaでWooCommerce商品を選択して注文する方法

次のコードを使用して、次のpost_metasの商品を選択します。

_product_new、_product_almost_new、_product_old

add_action( 'woocommerce_product_query', 'custom_vtp_shop_order' );

function custom_vtp_shop_order($q){
    if ( ! $q->is_main_query() ) return;
    if (! is_admin() && (is_shop() || is_archive) ) {

        $q->set( 'tax_query', array(array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => array( 'Sold', 'Service' ),  
            'operator' => 'NOT IN'
        )));

        $q->set('meta_query', array(array(
            'relation' => 'OR',
                'product_new' => array(
                    'key' => '_product_new',
                    'value' => '1',
                ),
                'product_almost_new' => array(
                    'key' => '_product_almost_new',
                    'value' => '1',
                ), 
                'product_old' => array(
                    'key' => '_product_old',
                    'value' => '1',
                )
            )));

        /*THIS HAS NO EFFECT*/
        $q->set('orderby', array(array( 
                'product_new' => 'DESC',
                'product_old' => 'DESC',
                'product_almost_new' => 'DESC',
            )        
        ));

    }

}

次に、製品を次の順序で表示します。

  1. product_new
  2. product_old
  3. product_almost_new

私は$ q-> set( 'orderby'、array(......)を使用していますが、これは効果がありません。私の製品は常にproduct_old、product_almost_new、product_newの順に並べられています。

私の「orderby」が機能しない理由は何ですか?ご協力ありがとうございます。

1
Richard Tinkler

WP_Queryでは、meta_key引数をソートするキーに設定し、orderbymeta_value(またはmeta_value_num値を数値でソートする場合)。

引数は次のようになります。

$args = array(
    'meta_key' => '_product_new',
    'orderby'  => 'meta_value_num',
    'meta_query' = array(
        'relation' => 'OR',
        array(
            'key'   => '_product_new',
            'value' => '1',
        ),
        array(
            'key'   => '_product_almost_new',
            'value' => '1',
        ), 
        array(
            'key'   => '_product_old',
            'value' => '1',
        )
    )
);

これは、_product_new_product_almost_new、または_product_oldを含むすべての投稿をクエリし、_product_newの投稿が上部または下部になるように並べ替えます(orderに応じて) )。

問題は、これが1つのメタ値_product_newのみでソートし、他の値を無視することです。しかし、これはWP_Queryの単なる制限です。 複数のメタ値で結果をソートすることはできません。

潜在的な解決策は、単一のメタキー(たとえば、_product_age)を用意し、それを並べ替える各状態を表す数値に設定することです。したがって、_product_newをブール値として持つ代わりに、_product_ageの代わりに1_product_almost_newに設定し、_product_age3に設定し、 _product_old_product_age2に設定します。

次に、これらの引数を使用して、希望する方法で並べ替えることができます。

$args = array(
    'meta_key' => '_product_age',
    'orderby'  => 'meta_value_num',
    'order'    => 'ASC',
    'meta_query' = array(
        array(
            'key'     => '_product_age',
            'value'   => array( 1, 2, 3 ),
            'compare' => 'IN',
        ),
    )
);
2
Jacob Peattie

私はこれが古いことを知っていますが、ここに可能な解決策があります:

$q->set('orderby', 'product_new product_old product_almost_new');
$q->set('order', 'DESC');

したがって、必要な順序でパラメータを文字列として渡すようにしてください。

0
Sharpey