La mejor manera
TODAS ESTAS RESPUESTAS AQUÍ TIENEN PREOCUPACIONES DE SEGURIDAD.
La mejor manera es agregar capacidades personalizadas y administrar publicaciones, etc. por las capacidades.
Una manera fácil
La solución de Artem parece ser mejor porque WP no hace referencia a los recuentos de publicaciones solo en la pantalla de edición de publicaciones, sino también dentro del widget del Panel, la respuesta de Ajax, etc.
Para una mejor solución basada en la de Artem.
- borre el caché de conteos de publicaciones predeterminado.
por qué:wp_count_posts
anteriormente devuelve los recuentos de publicaciones en caché cuando el resultado se ha almacenado en caché anteriormente.
- almacenar en caché el resultado de los recuentos de publicaciones personalizadas.
por qué: el caché aumenta el rendimiento.
- respetar el 3er
$perm
parámetro del wp_count_posts
gancho.
por qué: el recuento de publicaciones debe incluir publicaciones privadas propias del usuario basadas en readable
perm
- aplicar filtros como filtros de alta prioridad.
por qué: los filtros pueden ser anulados por otros filtros.
- eliminar (o modificar) el recuento de publicaciones fijas.
por qué: el recuento de publicaciones fijas incluye las publicaciones de otros y se cuentan por separado WP_Posts_List_Table
.
- use la capacidad adecuada para el tipo de mensaje personalizado por
qué: la read_others_posts
capacidad podría modificarse.
Es posible que desee ajustes adicionales
- filtrar los comentarios de otras publicaciones configurando la
post_author
consulta var enWP_Comment_Query
.
- ajustes comentarios cuentan por
wp_count_comments
gancho.
- impedir el acceso a pantallas de administrador que deberían estar restringidas.
La siguiente es una versión modificada basada en 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)
Problema conocido: se cuentan las publicaciones fijas que no pertenecen al usuario. arreglado eliminando la vista de publicaciones fijas.