我几乎做到了这一点,但需要改进以适应问题的具体情况,并以不同的方式处理附件和帖子类型(请参见代码中的注释)。。。
首先,我认为值得注意的是我是如何找到过滤器的:
apply_filters( \'views_\' . $screen->id, $views )
检查元件
在中进行全局搜索/wp-admin
和/wp-includes
对于子subsubsub(有趣的类名,顺便说一下)。。。
这里是:/wp-admin/includes/class-wp-list-table.php
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;
}