Tôi đã làm điều này gần như hoạt động, nhưng các sàng lọc là cần thiết để phù hợp với các chi tiết cụ thể của câu hỏi và để xử lý các Tệp đính kèm và Loại bài khác nhau (xem các nhận xét trong mã) ...
Đầu tiên, tôi nghĩ rằng đáng chú ý làm thế nào tôi tìm thấy bộ lọc:
apply_filters( 'views_' . $screen->id, $views )
foreach( array( 'edit-post', 'edit-page', 'edit-movie', 'upload' ) as $hook )
add_filter( "views_$hook" , 'wpse_30331_custom_view_count', 10, 1);
function wpse_30331_custom_view_count( $views )
{
global $current_screen;
switch( $current_screen->id )
{
case 'edit-post':
$views = wpse_30331_manipulate_views( 'post', $views );
break;
case 'edit-page':
$views = wpse_30331_manipulate_views( 'page', $views );
break;
case 'edit-movie':
$views = wpse_30331_manipulate_views( 'movie', $views );
break;
case 'upload':
$views = wpse_30331_manipulate_views( 'attachment', $views );
break;
}
return $views;
}
function wpse_30331_manipulate_views( $what, $views )
{
global $user_ID, $wpdb;
/*
* This is not working for me, 'artist' and 'administrator' are passing this condition (?)
*/
if ( !current_user_can('artist') )
return $views;
/*
* This needs refining, and maybe a better method
* e.g. Attachments have completely different counts
*/
$total = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE (post_status = 'publish' OR post_status = 'draft' OR post_status = 'pending') AND (post_author = '$user_ID' AND post_type = '$what' ) ");
$publish = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'publish' AND post_author = '$user_ID' AND post_type = '$what' ");
$draft = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = '$user_ID' AND post_type = '$what' ");
$pending = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'pending' AND post_author = '$user_ID' AND post_type = '$what' ");
/*
* Only tested with Posts/Pages
* - there are moments where Draft and Pending shouldn't return any value
*/
$views['all'] = preg_replace( '/\(.+\)/U', '('.$total.')', $views['all'] );
$views['publish'] = preg_replace( '/\(.+\)/U', '('.$publish.')', $views['publish'] );
$views['draft'] = preg_replace( '/\(.+\)/U', '('.$draft.')', $views['draft'] );
$views['pending'] = preg_replace( '/\(.+\)/U', '('.$pending.')', $views['pending'] );
// Debug info
//echo 'Default counts: <pre>'.print_r($views,true).'</pre>';
//echo '<hr><hr>';
//echo 'Query for this screen of this post_type: <b>'.$what.'</b><pre>'.print_r($wp_query,true).'</pre>';
return $views;
}