Лучший путь
ВСЕ ЭТИ ОТВЕТЫ ЗДЕСЬ ИМЕЮТ БЕЗОПАСНОСТЬ.
Лучший способ - добавить пользовательские возможности, управлять сообщениями и т. Д. С помощью этих возможностей.
Легкий способ
Решение Артема кажется лучше, потому что WP не учитывает количество сообщений только на экране редактирования сообщения, но также в виджете Dashboard, ответе Ajax и т. Д.
Для лучшего решения, основанного на Артеме.
- очистить кеш подсчета сообщений по умолчанию.
почему: wp_count_posts
раньше возвращает количество записей в кэше, когда результат был ранее кэширован.
- кэшировать результат пользовательских подсчетов сообщений.
почему: кеш увеличивает производительность.
- соблюдайте 3-й
$perm
параметр wp_count_posts
хука.
почему: в число сообщений должны входить личные сообщения пользователя на основе readable
разрешений.
- применять фильтры в качестве фильтров высокого приоритета.
почему: фильтры могут быть переопределены другими фильтрами.
- удалить (или изменить) количество липких сообщений.
почему: количество прикрепленных постов включает посты других, и они подсчитываются отдельно WP_Posts_List_Table
.
- используйте правильную возможность для Custom Post Type,
почему: read_others_posts
возможность может быть изменена.
Возможно, вы захотите дополнительные настройки
- Отфильтруйте комментарии других сообщений, установив
post_author
запрос var WP_Comment_Query
.
- твики комментарии подсчитывают на
wp_count_comments
крючке.
- запретить доступ к экранам администратора, которые должны быть ограничены.
Ниже приведена модифицированная версия, основанная на wp_post_counts()
WP 4.8.
function clear_cache() {
// deletes the default cache for normal Post. (1)
$cache_key = _count_posts_cache_key( 'post' , 'readable' );
wp_cache_delete( $cache_key, 'counts' );
}
add_action( 'admin_init', 'clear_cache' ); // you might use other hooks.
function fix_count_orders( $counts, $type, $perm ) {
global $wpdb;
if ( ! post_type_exists( $type ) ) {
return new stdClass();
}
$query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s";
$post_type_object = get_post_type_object( $type );
// adds condition to respect `$perm`. (3)
if ( $perm === 'readable' && is_user_logged_in() ) {
if ( ! current_user_can( $post_type_object->cap->read_private_posts ) ) {
$query .= $wpdb->prepare(
" AND (post_status != 'private' OR ( post_author = %d AND post_status = 'private' ))",
get_current_user_id()
);
}
}
// limits only author's own posts. (6)
if ( is_admin() && ! current_user_can ( $post_type_object->cap->edit_others_posts ) ) {
$query .= $wpdb->prepare( ' AND post_author = %d', get_current_user_id() );
}
$query .= ' GROUP BY post_status';
$results = (array) $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A );
$counts = array_fill_keys( get_post_stati(), 0 );
foreach ( $results as $row ) {
$counts[ $row['post_status'] ] = $row['num_posts'];
}
$counts = (object) $counts;
$cache_key = _count_posts_cache_key( $type, 'readable' );
// caches the result. (2)
// although this is not so efficient because the cache is almost always deleted.
wp_cache_set( $cache_key, $counts, 'counts' );
return $counts;
}
function query_set_only_author( $wp_query ) {
if ( ! is_admin() ) {
return;
}
$allowed_types = [ 'post' ];
$current_type = get_query_var( 'post_type', 'post' );
if ( in_array( $current_type, $allowed_types, true ) ) {
$post_type_object = get_post_type_object( $type );
if (! current_user_can( $post_type_object->cap->edit_others_posts ) ) { // (6)
$wp_query->set( 'author', get_current_user_id() );
add_filter( 'wp_count_posts', 'fix_count_orders', PHP_INT_MAX, 3 ); // (4)
}
}
}
add_action( 'pre_get_posts', 'query_set_only_author', PHP_INT_MAX ); // (4)
function fix_views( $views ) {
// For normal Post.
// USE PROPER CAPABILITY IF YOU WANT TO RISTRICT THE READABILITY FOR CUSTOM POST TYPE (6).
if ( current_user_can( 'edit_others_posts' ) ) {
return;
}
unset( $views[ 'sticky' ] );
return $views;
}
add_filter( 'views_edit-post', 'fix_views', PHP_INT_MAX ); // (5)
Известная проблема: липкие сообщения, которые не принадлежат пользователю, учитываются. исправлено удаление липких сообщений.