Die beste Weise
ALLE DIESEN ANTWORTEN HIER HABEN SICHERHEITSBEDINGUNGEN.
Der beste Weg ist das Hinzufügen benutzerdefinierter Funktionen und das Verwalten von Posts usw. anhand der Funktionen.
Ein einfacher Weg
Die Lösung von Artem scheint besser zu sein, da WP die Anzahl der Posts nicht nur auf dem Post-Bearbeitungsbildschirm, sondern auch im Dashboard-Widget, in der Ajax-Antwort usw. referenziert.
Für eine bessere Lösung basierend auf Artems.
- Löschen Sie den Standard-Cache für die Anzahl der Beiträge.
Warum: wp_count_posts
Gibt früher die Anzahl der zwischengespeicherten Beiträge zurück, wenn das Ergebnis zuvor zwischengespeichert wurde.
- Zwischenspeichern des Ergebnisses der Anzahl der benutzerdefinierten Posts.
Warum: Cache erhöht die Leistung.
- Beachten Sie den 3.
$perm
Parameter des wp_count_posts
Hakens.
Warum: Die Anzahl der Beiträge sollte die eigenen privaten Beiträge des Benutzers basierend auf readable
Dauerwelle enthalten.
- Wenden Sie Filter als Filter mit hoher Priorität an.
Warum: Die Filter werden möglicherweise von anderen Filtern überschrieben.
- Anzahl der klebrigen Beiträge entfernen (oder ändern).
Warum: Die Anzahl der klebrigen Beiträge umfasst die Beiträge anderer und sie werden getrennt von gezählt WP_Posts_List_Table
.
- Verwenden Sie die richtige Funktion für den benutzerdefinierten Beitragstyp.
Warum: Die read_others_posts
Funktion kann geändert werden.
Möglicherweise möchten Sie zusätzliche Optimierungen vornehmen
- Filtern Sie die Kommentare anderer Beiträge, indem Sie die
post_author
Abfrage var auf setzen WP_Comment_Query
.
- Optimierungen Kommentare zählen nach
wp_count_comments
Haken.
- Verhindern Sie den Zugriff auf Administratorbildschirme, die eingeschränkt werden sollten.
Das Folgende ist eine modifizierte Version basierend auf 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)
Bekanntes Problem: Sticky Posts, die nicht dem Benutzer gehören, werden gezählt. behoben durch Entfernen der Ansicht mit klebrigen Pfosten.