在 WooCommerce 管理订单列表 (HPOS) 中创建自定义过滤器

问题描述 投票:0回答:1

我创建了一个插件,可以更新值为 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 挂钩。添加过滤器有效,但实际查询参数会导致错误。

php wordpress woocommerce orders highperformance
1个回答
2
投票

您的代码中存在一些错误......在管理订单列表(启用了 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)。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.