我开发一个插件,我不得不黑名单用户,所以我需要展示一个更下拉菜单项称为黑名单在用户页面的批量操作下拉列表内,后删除选项。但我无法从这两个动作的来源以及如何黑名单中列出特定用户。如何在WordPress列表中添加自定义批量操作?
我的想法是在用户表为增加一个字段is_blacklisted布尔用默认值false
当应用黑名单行动它变成true
。任何其他想法?
我开发一个插件,我不得不黑名单用户,所以我需要展示一个更下拉菜单项称为黑名单在用户页面的批量操作下拉列表内,后删除选项。但我无法从这两个动作的来源以及如何黑名单中列出特定用户。如何在WordPress列表中添加自定义批量操作?
我的想法是在用户表为增加一个字段is_blacklisted布尔用默认值false
当应用黑名单行动它变成true
。任何其他想法?
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。
适当支持add_filter('bulk_actions-screenid', 'register_my_bulk_actions')
抵达Wordpress 4.7。
要在批量操作下拉HTML元素添加一个选项,寄存器上bulk_actions-{screen_id}
滤波器,增加了新的选项到阵列上的回调。将{screen_id}
替换为管理员屏幕的ID以提供批量操作。
要批量操作加上“发邮件给埃里克,”我们可以使用下面的代码:
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);
}
}
这太好了。此解决方案是否存在安全问题? – chris
您可以使用check_admin_referer('bulk-posts')'来检查它是否来自管理页面,请参阅wp-admin/edit.php第61行 – shahar