【问题标题】:How to select WooCommerce products by post_meta and order them如何通过 post_meta 选择 WooCommerce 产品并订购它们
【发布时间】:2017-12-06 10:46:28
【问题描述】:

我正在使用以下代码选择具有以下 post_meta 键的产品:_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_oldproduct_almost_newproduct_new

任何想法为什么我的“orderby”不起作用?任何帮助表示赞赏。

【问题讨论】:

    标签: php mysql wordpress woocommerce


    【解决方案1】:

    除了一件事,你做得很好。您在 orderby 中使用了数组中的数组,这是不正确的。 它应该是这样的:

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

    【讨论】:

    • 感谢指正,但 'orderby' 仍然无效
    • 在你写的给定代码中:'product_new' => 'DESC', 'product_old' => 'DESC', 'product_almost_new' => 'DESC', 但是你应该把它们写在右边订单:'product_new' => 'DESC', 'product_almost_new' => 'DESC', 'product_old' => 'DESC',
    • _new、_old、_almost_new 是我想要的顺序,但输出始终是 _old、_almost_new、_new。是否可以按不同键的多个元值排序?
    • 现在我明白你的意思了。不,您的方法不适用于此类情况。使用多个 orderby-s 是针对同一个帖子 ID 都给出了元键(例如 Country、City、District)并且需要由它们排序的情况。但是在您的情况下,每个产品只有一个给定的元字段。所以你需要改变你的方法。与其使用 3 个不同的元键,不如只使用一个:_product_state,它的值可能为“old, new, most_new”,然后通过新的 meta_key 轻松对您的帖子进行排序。使用小型 php 脚本,您可以更新现有帖子并在所有帖子中插入新的元数据。
    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多