次のコードを使用して、次の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',
)
));
}
}
次に、製品を次の順序で表示します。
私は$ q-> set( 'orderby'、array(......)を使用していますが、これは効果がありません。私の製品は常にproduct_old、product_almost_new、product_newの順に並べられています。
私の「orderby」が機能しない理由は何ですか?ご協力ありがとうございます。
WP_Query
では、meta_key
引数をソートするキーに設定し、orderby
をmeta_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_age
を3
に設定し、 _product_old
、_product_age
を2
に設定します。
次に、これらの引数を使用して、希望する方法で並べ替えることができます。
$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',
),
)
);
私はこれが古いことを知っていますが、ここに可能な解決策があります:
$q->set('orderby', 'product_new product_old product_almost_new');
$q->set('order', 'DESC');
したがって、必要な順序でパラメータを文字列として渡すようにしてください。