如何在WordPress列表中添加自定义批量操作?

时间:2014-05-08 12:06:09

标签: php wordpress-plugin wordpress

我正在为黑名单用户开发一个插件,所以我需要在批量操作下拉列表中再显示一个名为黑名单的下拉项目删除选项后​​的“用户”页面。但是,我无法看到这两个动作来自何处以及如何将特定用户列入黑名单。

我的想法是在用户表中再添加一个字段 is_blacklisted 作为布尔,默认值为false,并在应用时< strong>黑名单操作更改为true。还有其他想法吗?

2 个答案:

答案 0 :(得分:4)

There's a filter,但它仅对删除批量操作有用。

this WPSE question, answer and comments开始,有以下解决方法:使用jQuery向下拉列表添加自定义选项,并挂钩到admin_action_$your-action以捕获提交。

钩子admin_footer-$current_page用于在特定管理页面上打印我们的JavaScript(调整为在其他屏幕中使用)。

add_action( 'admin_footer-users.php', 'bulk_footer_so_23541269' );
add_action( 'admin_action_black_list', 'bulk_request_so_23541269' );

function bulk_footer_so_23541269() 
{
    # global $typenow; if( $typenow != 'page' ) return; // if used on edit.php screen
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function($) {
            $('<option>').val('black_list').text('Black list')
                .appendTo("select[name='action'], select[name='action2']");
        });
    </script>
    <?php
}

function bulk_request_so_23541269() 
{
    # Array with the selected User IDs
    wp_die( '<pre>' . print_r( $_REQUEST['users'], true ) . '</pre>' ); 
    // $_REQUEST['post'] if used on edit.php screen
}

您对阻止用户的疑问值得另一个问题,但我开始research here first

答案 1 :(得分:4)

add_filter( 'bulk_actions-screenid', 'register_my_bulk_actions' )的正确支持来自Wordpress 4.7。

引用announcement post

要在“批量操作”下拉列表HTML元素中添加选项,请在bulk_actions-{screen_id}过滤器上注册一个回调,以将新选项添加​​到阵列上。将{screen_id}替换为管理员屏幕的ID以提供批量操作。

要添加批量操作“向Eric发送电子邮件”,我们可以使用以下代码:

add_filter( 'bulk_actions-edit-post', 'register_my_bulk_actions' );

function register_my_bulk_actions($bulk_actions) 
{
  $bulk_actions['email_to_eric'] = __( 'Email to Eric', 'email_to_eric');
  return $bulk_actions;
}

要处理批量操作表单提交,请在相应屏幕的handle_bulk_actions-{screen_id}过滤器上注册回调。过滤器需要修改重定向URL,因此请务必修改传递的$redirect_url。这允许我们将成功或失败状态带入下一个向用户显示通知的请求中。其他回调参数将根据此处的屏幕而有所不同,以包含与上下文相关的数据。

要添加批量操作处理程序以通过电子邮件发送所选帖子,我们可以使用以下代码:

add_filter( 'handle_bulk_actions-edit-post', 'my_bulk_action_handler', 10, 3 );

function my_bulk_action_handler( $redirect_to, $doaction, $post_ids ) 
{
  if ( $doaction !== 'email_to_eric' ) {
    return $redirect_to;
  }
  foreach ( $post_ids as $post_id ) {
    // Perform action for each post.
  }
  $redirect_to = add_query_arg( 'bulk_emailed_posts', count( $post_ids ),  $redirect_to );
  return $redirect_to;
}

显示通知:我们可以使用现有的通知挂钩让用户知道发生了什么,具体取决于我们在网址中设置的状态:

add_action( 'admin_notices', 'my_bulk_action_admin_notice' );

function my_bulk_action_admin_notice() 
{
  if ( ! empty( $_REQUEST['bulk_emailed_posts'] ) ) {
    $emailed_count = intval( $_REQUEST['bulk_emailed_posts'] );
    printf( '<div id="message" class="updated fade">' .
      _n( 'Emailed %s post to Eric.',
        'Emailed %s posts to Eric.',
        $emailed_count,
        'email_to_eric'
      ) . '</div>', $emailed_count );
  }
}