You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在WooCommerce后台订单列表按非指定元值过滤订单

WooCommerce后台订单列表实现元值非特定字符串过滤方案

完全可以实现筛选_created_via值不为admin或checkout的订单,不过WordPress默认查询参数不支持直接设置“非匹配”条件,需要通过修改SQL语句来实现。以下是完整的实现代码:

// 添加订单列表过滤器下拉选项
add_action('restrict_manage_posts', 'add_shop_order_marketing_meta_filter');
function add_shop_order_marketing_meta_filter() {
    global $typenow;
    if ('shop_order' === $typenow) {
        $filter_id = 'filter_shop_order_by_meta';
        $current_value = isset($_GET[$filter_id]) ? $_GET[$filter_id] : '';
        ?>
        <select name="<?php echo esc_attr($filter_id); ?>">
            <option value="">所有订单</option>
            <option value="_created_via_non_admin_checkout" <?php selected($current_value, '_created_via_non_admin_checkout'); ?>>非后台/结账创建的订单</option>
        </select>
        <?php
    }
}

// 处理过滤器请求,添加查询标记
add_filter('request', 'process_admin_shop_order_marketing_by_meta', 99);
function process_admin_shop_order_marketing_by_meta($vars) {
    global $pagenow, $typenow;
    
    $filter_id = 'filter_shop_order_by_meta';

    if ($pagenow == 'edit.php' && 'shop_order' === $typenow 
        && isset($_GET[$filter_id]) && $_GET[$filter_id] === '_created_via_non_admin_checkout') {
        $vars['_created_via_non_admin_checkout'] = true;
    }
    return $vars;
}

// 修改查询条件,添加非匹配筛选逻辑
add_filter('posts_where', 'filter_shop_order_by_non_admin_checkout_created_via', 10, 2);
function filter_shop_order_by_non_admin_checkout_created_via($where, $query) {
    global $pagenow, $typenow, $wpdb;
    
    if ($pagenow == 'edit.php' && 'shop_order' === $typenow 
        && isset($query->query_vars['_created_via_non_admin_checkout']) && $query->query_vars['_created_via_non_admin_checkout']) {
        // 拼接SQL条件,筛选_created_via值不为admin或checkout的订单
        $where .= $wpdb->prepare("
            AND {$wpdb->postmeta}.meta_key = '_created_via'
            AND {$wpdb->postmeta}.meta_value NOT IN (%s, %s)
        ", 'admin', 'checkout');
    }
    return $where;
}

代码说明:

  1. 添加过滤器选项:add_shop_order_marketing_meta_filter函数会在订单列表顶部添加下拉选择框,提供“非后台/结账创建的订单”筛选选项。
  2. 标记查询请求:process_admin_shop_order_marketing_by_meta函数检测到选中目标筛选选项时,添加自定义查询变量作为标记,告知后续查询需要应用非匹配筛选规则。
  3. 修改SQL条件:filter_shop_order_by_non_admin_checkout_created_via函数通过posts_where过滤器修改查询的SQL语句,添加NOT IN条件,精准筛选出符合要求的订单。

内容的提问来源于stack exchange,提问作者iv444

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:08:30