问题描述
我正在开发一个 multi-user WordPress 设置,并使它成为一个特定类型的用户只能看到和他们已经创作的帖子,图像,页面等交互。使其发生的代码如下所示:
add_filter('pre_get_posts', 'current_author_posts');
function current_author_posts($query) {
if ($query->is_admin && current_user_can('artist')) {
global $user_ID;
$query->set('author', $user_ID);
}
return $query;
}
这在管理界面中工作得很好,但是所有的帖子计数都显示不正确:
您是否知道任何过滤器或钩子来操纵这些数字,并且在帖子,页面,媒体和自定义帖子类型之间是否正确?
非常感谢。
最佳解决方案
我得到这几乎工作,但需要改进以适应问题的细节,并处理附件和 Post-Types 不同 (见代码中的注释)…
首先,我认为值得注意的是我如何找到过滤器:apply_filters( 'views_' . $screen->id, $views )
-
检查元素
-
在
/wp-admin
和/wp-includes
中进行全局搜索,用于 subsubsub(有趣的类名称,btw)… -
这里是:
/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;
}
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。