Il modo migliore
TUTTE QUESTE RISPOSTE HANNO QUI SONO PROBLEMI DI SICUREZZA.
Il modo migliore è l'aggiunta di funzionalità personalizzate e la gestione di post, ecc. Per le funzionalità.
Un modo semplice
La soluzione di Artem sembra essere migliore perché WP non fa riferimento al conteggio dei post solo nella schermata di modifica post, ma anche all'interno del widget Dashboard, risposta Ajax ecc.
Per una soluzione migliore basata su quella di Artem.
- svuota la cache dei conteggi post predefiniti.
perché: wp_count_posts
restituisce in precedenza i conteggi dei post memorizzati nella cache quando il risultato è stato precedentemente memorizzato nella cache.
- memorizza nella cache il risultato del conteggio dei post personalizzati.
perché: la cache aumenta le prestazioni.
- rispettare il 3o
$perm
parametro di wp_count_posts
hook.
perché: il numero di post dovrebbe includere i post privati dell'utente in base al readable
perm.
- applica i filtri come filtri ad alta priorità.
perché: i filtri potrebbero essere sostituiti da altri filtri.
- rimuovere (o modificare) il conteggio dei post appiccicosi.
perché: il conteggio dei post appiccicosi include i post di altri e vengono conteggiati separatamente da WP_Posts_List_Table
.
- utilizzare la capacità adeguata per il tipo di posta personalizzato
perché: la read_others_posts
capacità potrebbe essere modificata.
Potresti voler apportare ulteriori modifiche
- filtra i commenti degli altri post impostando la
post_author
query var su WP_Comment_Query
.
- tweaks commenti contano per
wp_count_comments
gancio.
- impedire l'accesso alle schermate dell'amministratore che dovrebbero essere limitate.
La seguente è una versione modificata basata su 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 noto: vengono conteggiati i messaggi permanenti che non appartengono all'utente. risolto rimuovendo la visualizzazione dei post appiccicosi.