问题描述

我想为自定义帖子类型添加自定义批量动作。我碰到过滤器 bulk_actions-screenid,根据它的 documentation,将会按照我的意愿做。然而,经过大约两个小时的调试,我发现以下评论// 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 是通过请求传递的。但是,在 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');

最佳解决方案

bulk_actions-*过滤器不允许您精确添加自定义批量操作,因为添加一个该操作的处理程序很棘手。更新了法典。

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

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。