Le meilleur moyen
TOUTES CES RÉPONSES PRÉSENTENT DES PRÉOCCUPATIONS DE SÉCURITÉ.
La meilleure façon est d'ajouter des capacités personnalisées et de gérer les publications, etc. par les capacités.
Un moyen simple
La solution d'Artem semble être meilleure car WP ne fait pas référence au nombre de publications uniquement sur l'écran de modification des publications, mais également dans le widget Dashboard, la réponse Ajax, etc.
Pour une meilleure solution basée sur celle d'Artem.
- effacer le cache par défaut du nombre de publications.
pourquoi: wp_count_posts
renvoie plus tôt le nombre de messages mis en cache lorsque le résultat a été mis en cache auparavant.
- mettre en cache le résultat des comptages de messages personnalisés.
pourquoi: le cache augmente les performances.
- respecter le 3ème
$perm
paramètre du wp_count_posts
crochet.
pourquoi: le nombre de messages doit inclure les propres messages privés de l'utilisateur en fonction de la readable
perm.
- appliquer des filtres en tant que filtres de haute priorité.
pourquoi: les filtres peuvent être remplacés par d'autres filtres.
- supprimer (ou modifier) le nombre de messages collants.
pourquoi: le nombre de messages collants comprend les messages des autres et ils sont comptés séparément par WP_Posts_List_Table
.
- utiliser la capacité appropriée pour le type de message personnalisé
pourquoi: la read_others_posts
capacité pourrait être modifiée.
Vous voudrez peut-être des ajustements supplémentaires
- filtrer les commentaires des autres messages en définissant la
post_author
requête var sur WP_Comment_Query
.
- peaufiner les commentaires comptent par
wp_count_comments
crochet.
- empêcher l'accès aux écrans d'administration qui devraient être restreints.
Ce qui suit est une version modifiée basée sur 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)
Problème connu: les messages collants qui n'appartiennent pas à l'utilisateur sont comptés. corrigé en supprimant la vue des articles collants.