我開發一個插件,我不得不黑名單用戶,所以我需要展示一個更下拉菜單項稱爲黑名單在用戶頁面的批量操作下拉列表內,後刪除選項。但我無法從這兩個動作的來源以及如何黑名單中列出特定用戶。如何在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