我不想在管理订单页面中使用“注册客户”筛选选项。
我试图搜索如何删除它。我已经了解了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_Table 和
WC_Admin_List_Table_Orders:
remove_action( \'restrict_manage_posts\', array( \'WC_Admin_List_Table\', \'restrict_manage_posts\' ) );
但优先考虑以下各项
10 到
9999999:
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_loaded
和
woocommerce_init
. 我也在这些初始化和加载操作中尝试了上述示例。
Nothing works.
有人知道怎么做吗?
最合适的回答,由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上进行了尝试和测试。