我创建了一个插件,可以更新值为 0 或 1 的单个字段。我现在想添加仅过滤该字段等于 1 的订单的功能。字段元数据是“manual_order”,我'我们调整了订单表的代码:
add_action( 'woocommerce_order_list_table_restrict_manage_orders', 'show_is_first_order_checkbox' );
function show_is_first_order_checkbox() {
?>
<div class="mo_box">
<p><strong>Manual Orders</strong></p>
<input type="checkbox" name="manual_order_filter" class="checkbox" id="manual_order_toggle" <?php echo isset( $_GET['manual_order'] ) ? 'checked' : ''; ?>>
<label for="manual_order_toggle" class="switcher"></label>
</div>
<?php
}
add_action( 'woocommerce_order_query_args', 'filter_woocommerce_orders_in_the_table', 99, 1 );
function filter_woocommerce_orders_in_the_table( $query ) {
if ( ! isset( $_GET['manual_order'] ) ) {
return $query;
}
$meta_query = array(
array(
'key' => 'manual_order',
'value' => 1,
'compare' => '='
)
);
$query->set( 'meta_query', $meta_query );
return;
}
第一个功能很好用,0 个问题!主要问题是第二个函数,我还没有为 HPOS 创建查询,所以我采用了旧的订单查询系统并更新了一些代码。还有什么事情需要做吗?请注意,所有这些代码仅在 HPOS 订单页面上运行。当此过滤器被激活时,它会导致表格模板内部出现严重错误。
尝试编辑旧代码用法以使用新的 HPOS 挂钩。添加过滤器有效,但实际查询参数会导致错误。
您的代码中存在一些错误......在管理订单列表(启用了 HPOS)上,最好使用下拉列表来过滤元数据而不是复选框。
关于您之前的问题,我假设您想要过滤具有“manual_order”作为元键和“1”作为元值的订单。
尝试以下方法:
add_action( 'woocommerce_order_list_table_restrict_manage_orders', 'show_is_first_order_checkbox', 5 );
function show_is_first_order_checkbox() {
$selected = isset($_GET['metadata']) ? esc_attr($_GET['metadata']) : '';
$options = array(
'' => __('By Metadata', 'woocommerce'),
'manual_order' => __('Manual Orders', 'woocommerce')
);
echo '<select name="metadata" id="dropdown_shop_order_metadata">';
foreach( $options as $value => $label_name ) {
printf('<option value="%s" %s>%s</option>', $value, selected($selected, $value, false), $label_name);
}
echo '</select>';
}
add_filter('woocommerce_order_query_args', 'filter_woocommerce_orders_in_the_table');
function filter_woocommerce_orders_in_the_table( $query_args ) {
if ( isset($_GET['metadata']) && $_GET['metadata'] === 'manual_order' ) {
$query_args['meta_key'] = 'manual_order';
$query_args['meta_value'] = '1';
}
return $query_args;
}
代码位于子主题的functions.php 文件中(或插件中)。经过测试并适用于高性能订单存储 (HPOS)。