我想向自定义帖子类型添加自定义批量操作。我碰到了过滤器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');


评论

先前评论中的链接已更改。您仍然可以在这里阅读文章。

看起来这很快就会在wordpress中修复。票务core.trac.wordpress.org/ticket/16031于16年10月底刚刚关闭。

#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' );
    }
}