在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; }
代码说明:
- 添加过滤器选项:
add_shop_order_marketing_meta_filter函数会在订单列表顶部添加下拉选择框,提供“非后台/结账创建的订单”筛选选项。 - 标记查询请求:
process_admin_shop_order_marketing_by_meta函数检测到选中目标筛选选项时,添加自定义查询变量作为标记,告知后续查询需要应用非匹配筛选规则。 - 修改SQL条件:
filter_shop_order_by_non_admin_checkout_created_via函数通过posts_where过滤器修改查询的SQL语句,添加NOT IN条件,精准筛选出符合要求的订单。
内容的提问来源于stack exchange,提问作者iv444
相关产品推荐
相关产品推荐

