La mejor manera
TODAS ESTAS RESPUESTAS AQUÍ TIENEN PREOCUPACIONES DE SEGURIDAD.
La mejor manera es agregar capacidades personalizadas y administrar publicaciones, etc. mediante las capacidades.
Una forma fácil
La solución de Artem parece ser mejor porque WP no refiere el número de publicaciones solo en la pantalla de edición posterior, sino también dentro del widget del Tablero, la respuesta Ajax, etc.
Para una mejor solución basada en la de Artem.
-
borra la memoria caché predeterminada de las cuentas.
por qué: wp_count_posts
anteriormente devuelve los conteos de publicaciones en caché cuando el resultado se ha almacenado en caché anteriormente.
-
almacena en caché el resultado de los conteos personalizados.
por qué: el caché aumenta el rendimiento.
-
respeta el parámetro 3rd
$perm
de wp_count_posts
hook.
por qué: el conteo de publicaciones debe incluir las publicaciones privadas 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 número de publicaciones adhesivas.
por qué: la cuenta de publicaciones adhesivas incluye las publicaciones de otros y se cuentan por separado por WP_Posts_List_Table
.
-
use la capacidad adecuada para el tipo de publicación personalizada
por qué: la capacidad de read_others_posts
podría modificarse.
Es posible que desee realizar ajustes adicionales
- filtre los comentarios de otras publicaciones estableciendo
post_author
query var en WP_Comment_Query
.
- ajustes de los comentarios cuentan por
wp_count_comments
gancho.
- impide el acceso a las pantallas de administración que deberían estar restringidas.
La siguiente es una versión modificada basada en wp_post_counts()
de 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 contabilizan las publicaciones adhesivas que no pertenecen al usuario. se solucionó eliminando la vista de publicaciones adhesivas.