Najlepszym sposobem
WSZYSTKIE TE ODPOWIEDZI MAJĄ OBECNE BEZPIECZEŃSTWA.
Najlepszym sposobem jest dodawanie niestandardowych funkcji i zarządzanie postami itp. Według możliwości.
Łatwy sposób
Rozwiązanie Artem wydaje się być lepsze, ponieważ WP nie odsyła liczby postów tylko na ekranie edycji postów, ale również w widżecie Dashboard, odpowiedzi Ajax itp.
Dla lepszego rozwiązania opartego na Artem.
- wyczyść domyślną pamięć podręczną zliczania postów.
dlaczego: wp_count_posts
wcześniej zwraca licznik postu w pamięci podręcznej, gdy wynik był wcześniej buforowany.
- buforuj wynik liczenia niestandardowych postów.
dlaczego: pamięć podręczna zwiększa wydajność.
- przestrzegać trzeciego
$perm
parametru wp_count_posts
haka.
dlaczego: liczba wpisów powinna obejmować prywatne posty użytkownika na podstawie readable
perm.
- zastosuj filtry jako filtry o wysokim priorytecie.
dlaczego: filtry mogą zostać zastąpione przez inne filtry.
- usuń (lub zmodyfikuj) liczbę lepkich wpisów.
dlaczego: liczba przyklejonych postów obejmuje posty innych i są one osobno liczone przez WP_Posts_List_Table
.
- użyj odpowiedniej możliwości dla niestandardowego typu postu,
dlaczego: read_others_posts
możliwość można zmodyfikować.
Możesz chcieć dodatkowych poprawek
- filtruj komentarze innych postów, ustawiając
post_author
var var na WP_Comment_Query
.
- poprawki są liczone według
wp_count_comments
haka.
- uniemożliwić dostęp do ekranów administratora, które powinny być ograniczone.
Poniżej znajduje się zmodyfikowana wersja oparta na 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)
Znany problem: liczone są przyklejone posty, które nie należą do użytkownika. naprawione przez usunięcie widoku lepkich postów.