如何通过POST_META选择WooCommerce产品并订购

时间:2017-12-06 作者:Richard Tinkler

我使用以下代码选择具有以下post\\u Meta的产品:

_product\\u new、\\u product\\u几乎\\u new、\\u product\\u 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->集合(\'orderby\',数组(……)但这没有任何效果。我的产品总是被订购product\\u old,product\\u几乎是新的,product\\u new。

你知道为什么我的“orderby”不起作用吗?提前感谢您的帮助!

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

具有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).

问题是这只会按一个元值排序,_product_new, 忽略其他人。但这只是WP_Query. 不可能按多个元数据对结果进行排序

一个潜在的解决方案是使用一个元密钥,例如_product_age, 并将其设置为一个数字值,该值表示要排序的每个状态。因此_product_new 作为布尔值,设置_product_age1, 而不是_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\',
        ),
    )
);

SO网友:Sharpey

我知道这很古老,但这里有一个可能的解决方案:

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

所以,只要试着按要求的顺序将参数作为字符串传递即可。

结束

相关推荐

Double loop output

大家好,我是一个中等权重的wp设计师/开发人员,在我工作的网站上遇到了问题。演示页面如下:http://flock.simonpointer.com/blog/我在模板文件中继承了以下循环代码,我一辈子都不明白为什么我在特色内容框中的作者信息会有两个输出。我似乎得到了第一篇和第二篇文章。在第二个页面上,不会加载作者照片和链接详细信息,但会加载到第一个页面上,并且会显示第二个页面的帖子缩略图,但不会显示第一个页面的帖子缩略图。感谢您的帮助: <div class=\"col-2-