自定义bulk_action


17

我想向自定义帖子类型添加自定义批量操作。我遇到了过滤器bulk_actions-screenid根据它的文档该过滤器将完全按照我的意愿工作。但是,经过大约两个小时的调试,我// This filter can currently only be used to remove actions.在class-wp-list-table.php的278行找到了以下注释-太好了!

我想我可以通过使用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是通过请求传递的。但是,create_invoice从不打印edit.php 。

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自定义批量操作
Ayoub 2013年

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

1
看起来很快就会在wordpress中修复此问题。票务core.trac.wordpress.org/ticket/16031于16年10月底刚刚关闭。
丹妮丝·德雷珀

Answers:


2

考虑到该问题的普遍性,我认为最新的主要版本为该问题提供了新的答案。

自WordPress 4.7(2016年12月发布)以来,无需使用JavaScript即可添加自定义批量操作。

过滤器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 );
玛丽亚·丹尼尔·迪帕克

@MariaDanielDeepak什么不起作用?对我来说,在4.7.2上工作正常。需要考虑的几件事:(1)回调是针对管理员中“页面”概述的(因为edit-page部分是其屏幕ID)(2)如果未选择任何页面(即尝试执行以下操作),则不会执行该操作在一组空白页面上执行批量操作)
engelen

感谢您的评论。我已经添加了有关WordPress 论坛中不起作用的完整说明。
玛丽亚·丹尼尔·迪帕克

9

bulk_actions-*过滤器不允许你精确添加自定义批量操作,因为它是棘手的,然后添加一个处理一个采取行动。更新了食典。

我建议使用load-*动作代替admin_init。请注意,您必须执行所有安全检查,例如check_ajax_referrer()和current_user_can()。


谢谢!该load-*挂钩似乎是工作。另外,感谢您更新法典并重新打开追踪票。
v0idless 2011年

1
我可能过早接受了答案。我更新了代码以使用该load-*钩子。当我对users.php应用批量操作时-我看到create_invoice是通过请求传递的。但是,create_invoice从不打印edit.php 。
v0idless 2011年

尝试exit;在之后添加通话echo "<pre>" . print_r($_REQUEST, true) . "</pre>";
scribu 2011年

1
我认为这是一个更好的行动挂钩比load-*:在admin_action_*admin_action_create_invoice你的情况)。仅在load-*挂钩之后且仅在触发自定义批量操作时才调用它。
Fabien Quatravaux 2014年

0

定义对象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' );
    }
}    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.