Найкращий спосіб
ВСІ ЦІ ВІДПОВІДИ ТУТ МАЮТЬ КОНСЕРНЕНТИ БЕЗПЕКИ.
Найкращий спосіб - додавання спеціальних можливостей та керування повідомленнями тощо.
Простий спосіб
Рішення Артема здається кращим, оскільки WP не посилається на кількість повідомлень лише на екрані редагування публікацій, але також у віджеті інформаційної панелі, відповіді Ajax тощо.
Для кращого рішення на базі Артема.
- очистити кеш-пам'ять підрахунків публікацій за замовчуванням.
чому: wp_count_posts
раніше повертає підрахунок кешованої пошти, коли результат був кешований раніше.
- кеш-результат результатів користувацьких підрахунків публікацій.
чому: кеш збільшує продуктивність.
- поважайте 3-й
$perm
параметр wp_count_posts
гака.
чому: підрахунок публікацій повинен включати власні приватні публікації користувача на основі readable
perm.
- застосувати фільтри як фільтри високого пріоритету.
чому: фільтри можуть бути замінені іншими фільтрами.
- видалити (або змінити) кількість клейких публікацій
чому: кількість ліпких дописів включає інші дописи, і їх окремо підраховують WP_Posts_List_Table
.
- використовуйте належні можливості для користувальницького типу пошти,
чому: 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)
Відомий випуск: Клейкі публікації, які не належать користувачеві, враховуються. виправлено видаленням липких постів.