bulk_actions-screenid
,根据它的文档,该过滤器将完全按照我的意愿工作。但是,经过大约两个小时的调试,我在class-wp-list-table.php的278行找到了以下注释// This filter can currently only be used to remove actions.
-太棒了!我认为我可以通过使用jQuery注入可选动作
/**
* Hack to add a custom bulk action.
*/
public function admin_footer() {
if($_GET['post_type'] != self::POST_TYPE) return;
?>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']");
});
</script>
<?php
}
这有效。现在,该操作将出现在批量操作菜单中。我当时的假设是,然后可以向
admin_init
中添加一些逻辑以进行必要的处理-但是,看来create_invoice
从未发布过。我在做错什么吗?===更新===
我更新了代码以使用
load-*
挂钩。当我对users.php应用批量操作时-我看到create_invoice
通过了请求。但是,永远不会在edit.php上打印create_invoice
。function a39x2_admin_footer() {
?>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']");
jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action2']");
});
</script>
<?php
}
add_action('admin_footer', 'a39x2_admin_footer');
function a39x2_load() {
echo "<pre>" . print_r($_REQUEST, true) . "</pre>";
}
add_action('load-edit.php', 'a39x2_load');
add_action('load-users.php', 'a39x2_load');
#1 楼
考虑到此问题的普遍性,我认为最新的主要版本为该问题提供了新的答案。自WordPress 4.7(2016年12月发布)以来,可以在不使用JavaScript的情况下添加自定义批量操作。 br />
过滤器
bulk_actions-{$screen}
(例如,页面概述为bulk_actions-edit-page
)现在允许您添加自定义批量操作。此外,一个名为handle_bulk_actions-{$screen}
的新动作(例如handle_bulk_actions-edit-page
)使您可以处理该动作的执行。此博客文章对此进行了很好的解释。例如,假设我们想要添加批量操作,以通过电子邮件发送页面概述中所选项目的标题。我们可以这样做:
在一个小例子中,我们向批量操作下拉列表中添加了一个操作,并向其添加了处理函数。
添加批量操作到下拉列表:
function wpse29822_page_bulk_actions( $actions ) {
// Add custom bulk action
$actions['my-action-handle'] = __( 'My Custom Bulk Action' );
return $actions;
}
add_action( 'bulk_actions-edit-page', 'wpse29822_page_bulk_actions' );
为批量操作添加处理程序:
function wpse29822_page_bulk_actions_handle( $redirect_to, $doaction, $post_ids ) {
// Check whether action that user wants to perform is our custom action
if ( $doaction == 'my-action-handle' ) {
// Do stuff
}
return $redirect_to;
}
add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 );
评论
此处理程序操作对我不起作用。我正在使用WordPress 4.7.2。我会对此有所帮助。 add_action('handle_bulk_actions-edit-page','wpse29822_page_bulk_actions_handle',10,3);
–玛丽亚·丹尼尔·迪帕克(Maria Daniel Deepak)
17-2-22在11:13
@MariaDanielDeepak什么不起作用?对我来说,在4.7.2上工作正常。需要考虑的几件事:(1)回调是针对管理员中“页面”概述的(因为编辑页面部分是其屏幕ID)(2)如果未选择任何页面,则将不执行该操作(即尝试在一组空白页面上执行批量操作)
–engelen
17-2-22在13:27
感谢您的评论。我已经添加了有关WordPress论坛中不起作用的完整说明。
–玛丽亚·丹尼尔·迪帕克(Maria Daniel Deepak)
17-2-22在14:03
#2 楼
bulk_actions-*
过滤器不允许您恰好添加自定义批量操作,因为为该操作添加处理程序非常棘手。更新了食典。我建议使用
load-*
操作而不是admin_init
。请注意,您必须执行所有安全性检查,例如check_ajax_referrer()和current_user_can()。评论
谢谢! load- *挂钩似乎正在工作。另外,感谢您更新法典并重新打开交易票。
–v0idless
2011年9月29日16:16
我可能过早接受了答案。我更新了代码以使用load- *挂钩。当我对users.php应用批量操作时-我看到create_invoice通过了请求。但是,在edit.php上从不打印create_invoice。
–v0idless
2011年9月29日下午16:40
尝试添加出口;在echo“
”之后调用。 print_r($ _ REQUEST,true)。 “”;
–抄写员
2011-09-29 17:22
我认为有一个比load- *更好的动作挂钩:admin_action_ *(在您的情况下为admin_action_create_invoice)。仅在load- *挂钩之后且仅在触发自定义批量操作时才调用它。
–法比恩·夸特拉沃(Fabien Quatravaux)
2014年2月8日在17:51
#3 楼
定义bulk_actions
对象时必须使用WP_Screen
过滤器。像这样:
add_action( 'current_screen', 'custom_bulk_actions' );
function custom_bulk_actions() {
if( current_user_can( 'administrator' ) {
add_filter( 'bulk_actions-edit-post' , 'register_custom_bulk_actions' );
add_filter( 'handle_bulk_actions-edit-post', 'custom_bulk_action_handler', 10, 3 );
add_action( 'admin_notices' , 'custom_bulk_action_admin_notice' );
}
}
评论
先前评论中的链接已更改。您仍然可以在这里阅读文章。看起来这很快就会在wordpress中修复。票务core.trac.wordpress.org/ticket/16031于16年10月底刚刚关闭。