如何从管理员列表中删除筛选器?

时间:2019-05-10 作者:Peter Westerlund

enter image description here

我不想在管理订单页面中使用“注册客户”筛选选项。

我试图搜索如何删除它。我已经了解了WooCommerce代码,看看它是如何实现的。

我可以看到它是在类中实现的WC_Admin_List_Table_Orders 它扩展了WC_Admin_List_Table. 这个WC_Admin_List_Table_Orders 类别位于:

/woocommerce/includes/admin/list tables/class wc admin list table订单。php

_construct 中的方法WC_Admin_List_Table 有一个add_action( \'restrict_manage_posts\', array( $this, \'restrict_manage_posts\' ) );.

所以在WC_Admin_List_Table_Orders 我们会找到restrict_manage_posts 方法调用下一个方法render_filter():

/**
 * See if we should render search filters or not.
 */
public function restrict_manage_posts() {
    global $typenow;

    if ( in_array( $typenow, wc_get_order_types( \'order-meta-boxes\' ), true ) ) {
        $this->render_filters();
    }
}

/**
 * Render any custom filters and search inputs for the list table.
 */
protected function render_filters() {
    $user_string = \'\';
    $user_id     = \'\';

    if ( ! empty( $_GET[\'_customer_user\'] ) ) { // phpcs:disable  WordPress.Security.NonceVerification.NoNonceVerification
        $user_id = absint( $_GET[\'_customer_user\'] ); // WPCS: input var ok, sanitization ok.
        $user    = get_user_by( \'id\', $user_id );

        $user_string = sprintf(
            /* translators: 1: user display name 2: user ID 3: user email */
            esc_html__( \'%1$s (#%2$s – %3$s)\', \'woocommerce\' ),
            $user->display_name,
            absint( $user->ID ),
            $user->user_email
        );
    }
    ?>
    <select class="wc-customer-search" name="_customer_user" data-placeholder="<?php esc_attr_e( \'Filter by registered customer\', \'woocommerce\' ); ?>" data-allow_clear="true">
        <option value="<?php echo esc_attr( $user_id ); ?>" selected="selected"><?php echo htmlspecialchars( wp_kses_post( $user_string ) ); // htmlspecialchars to prevent XSS when rendered by selectWoo. ?><option>
    </select>
    <?php
}
所以,现在的问题是如何防止任何一个被调用。我喜欢这个过程中包含一个add\\u操作挂钩。因为这通常意味着remove_action(). 这就是我一直试图做的。没有成功。

What Iv\'e tried:

下面的示例WC_Admin_List_TableWC_Admin_List_Table_Orders:

remove_action( \'restrict_manage_posts\', array( \'WC_Admin_List_Table\', \'restrict_manage_posts\' ) );
但优先考虑以下各项109999999:

remove_action( \'restrict_manage_posts\', array( \'WC_Admin_List_Table\', \'restrict_manage_posts\' ), 10 );
Wrapping it to wp_loaded 使用$wc\\U admin\\U post\\U types全局变量。从联机搜索中找到此。我还尝试了另一个全局变量,$wc\\u list\\u table。最终尝试了有优先权和无优先权:

add_action(\'wp_loaded\', function() {
    global $wc_admin_post_types;
    remove_action( \'restrict_manage_posts\', array($wc_admin_post_types, \'restrict_manage_posts\'), 10, 2 );
});
我也试过woocommerce_loadedwoocommerce_init. 我也在这些初始化和加载操作中尝试了上述示例。

Nothing works.

有人知道怎么做吗?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

我可以看到它是在类中实现的WC_Admin_List_Table_Orders 它扩展了WC_Admin_List_Table.

是的,没错。

订单列表通过WC_Admin_Post_Types::setup_screen() 通过这些钩子调用方法的地方:(参见WC_Admin_Post_Types::__construct())

// Load correct list table classes for current screen.
add_action( \'current_screen\', array( $this, \'setup_screen\' ) );
add_action( \'check_ajax_referer\', array( $this, \'setup_screen\' ) );
在这方面setup_screen() 方法时,列表表被实例化,其中实例被放入全局变量mdash;$wc_list_table:

include_once \'list-tables/class-wc-admin-list-table-orders.php\';
$wc_list_table = new WC_Admin_List_Table_Orders();
因此,您可以按如下方式移除过滤器:

// Be sure to rename this function..
function my_func() {
    global $wc_list_table;
    if ( $wc_list_table instanceof WC_Admin_List_Table_Orders ) {
        remove_action( \'restrict_manage_posts\', array( $wc_list_table, \'restrict_manage_posts\' ) );
    }
}
add_action( \'current_screen\', \'my_func\', 11 );
add_action( \'check_ajax_referer\', \'my_func\', 11 );
在WooCommerce 3.6.2上进行了尝试和测试。

相关推荐

如何插入类别通过php发布?

我不能让它工作。我有一个用户可以提交帖子的页面。在那里,理想情况下,我想显示所有类别,让他们通过下拉菜单选择类别来分配帖子。我无法做到这一点,因为我是一个PHP新手,所以我决定一步一步来,首先添加一个空的输入字段,用户可以在其中添加一个随机文本,该文本将成为该帖子的类别。为此,我做了以下工作: if(isset($_POST[\'entry\']) AND !$_POST[\'entry\'] == \"\"):