我在订购我的产品时遇到了问题,我在每个产品中都有一个名为"cheapest_worktop"的元值和一个数字值,

我正在使用筛选器"WooCommerce_Get_CATALOG_ORDING_ARGS"更改查询,以便它按元值进行排序:

 $args["meta_key"] = "cheapest_worktop";
 $args["orderby"] = "meta_value_num";
 $args["meta_type"] = 'DECIMAL';
 $args["order"] = "ASC";
 $args["meta_query"] = array(
     'relation' => 'AND',
     array(
         'key' => "cheapest_worktop",
         'compare' => 'EXISTS', // Only retrieve products where the meta key exists
     )
 );

但它最终显示了有和没有Meta密钥的产品,

只有当我移除

 $args["meta_key"] = "cheapest_worktop";

这会隐藏不具有meta_key的产品,但不会对其进行排序,最初只是

$args["meta_key"] = "cheapest_worktop";
$args["orderby"] = "meta_value_num";
$args["meta_type"] = 'DECIMAL';
$args["order"] = "ASC";

这确实工作,然后出于某种原因,它只是停止工作,而不是100%,为什么没有其他变化发生在网站上,没有更新,没有新的插件或代码什么都没有.

我用过

global $wp_query;
echo print_r($wp_query, true);
echo print_r($args, true);

仔细判断正在执行的$args,它们返回正确.

如有任何建议,我们将不胜感激.

推荐答案

我想您添加了一个定制的"最便宜的工作台"排序选项,类似于:

add_filter( 'woocommerce_catalog_orderby', 'add_catalog_orderby_cheapest_worktop' );
function add_catalog_orderby_cheapest_worktop( $orderby ) {
    $orderby['cheapest_worktop'] = __('Sort by cheapest worktop', 'woocommerce');
    return $orderby;
}

现在,由于$args参数只处理‘orderby’和‘order’,而不处理‘meta_query’,因此您将try 执行以下操作:

add_filter( 'woocommerce_get_catalog_ordering_args', 'get_catalog_ordering_by_cheapest_worktop', 10, 3 );
function get_catalog_ordering_by_cheapest_worktop( $args, $orderby, $order ) {
    if ( isset( $_GET['orderby'] ) && $_GET['orderby'] === 'cheapest_worktop' ) {
        // Custom sorting order
        $args['orderby'] = array(
            'meta_value_num' => 'ASC', // Sort numerically ascending
        );
    }
    return $args;
}

// Here we set the query (meta query)
add_filter( 'woocommerce_product_query', 'product_query_by_cheapest_worktop', 10, 1 );
function product_query_by_cheapest_worktop( $q ) {
    if ( isset($_GET['orderby']) && $_GET['orderby'] === 'cheapest_worktop' ) {
        $meta_query = $q->get('meta_query');

        $meta_query['relation'] = 'AND';

        $meta_query[] = array(
            'key'     => 'cheapest_worktop',
            'value'   => 0,
            'compare' => '>=',
            'type'    => 'NUMERIC',
        );

        $q->set('meta_query', $meta_query);
        $q->set('orderby', array(
            'meta_value_num' => 'ASC', // Sort numerically ascending
        ) );
    }
}

应该能行得通.

Php相关问答推荐

调用woocommerce_customer_Save_add动作挂钩时发生致命错误

Laravel有一个具有两个匹配字段

PHP php_mongodb.dll for 32bit

编写WooCommerce多步骤签出

PHP日期操作,将多个日期输出为格式化字符串

如何将WooCommerce产品属性术语名称显示为链接术语?

EBay Inventory API createOrReplaceInventoryItem出错

将数组推送到数组时,数组推送()出现问题

根据WooCommerce Cart小计阈值自动应用优惠券

从字符串转换日期和/或时间时,Laravel转换失败

Azure应用程序无法访问共享文件夹

在具有Angular 的 Laravel 应用程序中,不显示图像

在 PHP MySQL 中自动生成账单编号

服务器升级到新的mysql版本8.0.34后查询错误

htaccess 重定向子域错误的 url

如何正确判断 PHP 是否已正确配置为使用 DOMDocument?

根据所选付款方式启用/禁用 WooCommerce 所需的 checkout 字段

注册命名空间后如何获取xml node 值?

构建 [Controller] 时目标 [Interface] 不可实例化

Symfony 自定义注销