A melhor maneira
TODAS AS RESPOSTAS AQUI TÊM PREOCUPAÇÕES DE SEGURANÇA.
A melhor maneira é adicionar recursos personalizados e gerenciar postagens etc. pelos recursos.
Uma maneira fácil
A solução de Artem parece ser melhor porque o WP não refere as contagens de postagens apenas na tela de pós-edição, mas também no widget Dashboard, na resposta do Ajax etc.
Para uma melhor solução baseada na de Artem.
- limpe o cache padrão de contagem de postagens.
why: wp_count_posts
retorna anteriormente as contagens de postagem em cache quando o resultado foi armazenado em cache antes.
- armazenar em cache o resultado de contagens de postagens personalizadas.
por que: cache aumenta o desempenho.
- respeite o terceiro
$perm
parâmetro do wp_count_posts
gancho.
por que: a contagem de postagens deve incluir as postagens particulares do usuário com base em readable
perm.
- aplique filtros como filtros de alta prioridade.
por quê: os filtros podem ser substituídos por outros filtros.
- remova (ou modifique) a contagem de postagens adesivas.
Motivo: contagem de postagens adesivas inclui postagens de outras pessoas e são contabilizadas separadamente por WP_Posts_List_Table
.
- use a capacidade adequada para o Tipo de postagem personalizada
Por que: a read_others_posts
capacidade pode ser modificada.
Você pode querer ajustes adicionais
- filtre os comentários de outras pessoas definindo
post_author
query var como WP_Comment_Query
.
- tweaks comentários contam por
wp_count_comments
gancho.
- impedir o acesso às telas de administrador que devem ser restritas.
A seguir está uma versão modificada com base no 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 conhecido: as postagens fixas que não pertencem ao usuário são contadas. corrigido removendo a exibição de postagens aderentes.