为WooCommerce后台订单列表添加支付方式筛选下拉框及报错解决
问题原因
restrict_manage_posts钩子在订单列表页顶部加载筛选控件时触发,此时还未进入订单列表的循环逻辑,全局变量$the_order未被初始化,值为null,调用其方法自然会抛出错误。- 原有逻辑即使拿到单个订单的支付方式,也只是单个字符串,无法遍历生成所有可选的支付方式筛选选项,不符合需求。
- 筛选逻辑中使用的meta键错误,WooCommerce订单的支付方式存储的自定义字段键为
_payment_method,不是payment_method,会导致筛选失效。
修复后完整代码
你原有的自定义列代码无需修改,替换新增的筛选代码为以下内容即可:
add_action('restrict_manage_posts', 'add_shop_order_filter_by_payment'); function add_shop_order_filter_by_payment(){ global $pagenow, $typenow; if( 'shop_order' === $typenow && 'edit.php' === $pagenow ) { // 获取站点所有已启用的支付网关 $available_gateways = WC()->payment_gateways->get_available_payment_gateways(); $filter_id = 'payment_method'; $current = isset($_GET[$filter_id])? wc_clean($_GET[$filter_id]) : ''; echo '<select name="'.$filter_id.'"> <option value="">'.__( 'Filter by payment method', 'woocommerce' )."</option>"; // 遍历所有支付网关生成选项 foreach( $available_gateways as $gateway_id => $gateway ) { printf( '<option value="%s" %s>%s</option>', esc_attr($gateway_id), selected($gateway_id, $current, false), esc_html($gateway->get_title()) ); } echo '</select>'; } } add_filter( 'request', 'process_admin_shop_order_filtering_by_payment', 99 ); function process_admin_shop_order_filtering_by_payment( $vars ) { global $pagenow, $typenow; $filter_id = 'payment_method'; if ( $pagenow == 'edit.php' && 'shop_order' === $typenow && isset( $_GET[$filter_id] ) && ! empty($_GET[$filter_id]) ) { // 修正meta键为WooCommerce默认的带下划线格式 $vars['meta_key'] = '_payment_method'; $vars['meta_value'] = wc_clean($_GET[$filter_id]); $vars['orderby'] = 'meta_value'; } return $vars; }
内容的提问来源于stack exchange,提问作者Jod
相关产品推荐
相关产品推荐

