Cách tốt nhất
TẤT CẢ CÁC TRẢ LỜI NÀY Ở ĐÂY CÓ Ý TƯỞNG AN NINH.
Cách tốt nhất là thêm các khả năng tùy chỉnh và quản lý bài đăng, v.v. bằng các khả năng.
Một cách dễ dàng
Giải pháp của Artem dường như tốt hơn vì WP không chỉ giới thiệu số bài đăng trên màn hình chỉnh sửa bài mà còn trong tiện ích Bảng điều khiển, phản hồi Ajax, v.v.
Để có giải pháp tốt hơn dựa trên cơ sở của Artem.
- xóa bài đăng mặc định đếm bộ nhớ cache.
tại sao: trước đó wp_count_posts
trả về số lượng bài đăng được lưu trong bộ nhớ cache khi kết quả đã được lưu vào bộ nhớ cache trước đó.
- lưu trữ kết quả của số lượng bài tùy chỉnh.
tại sao: bộ nhớ cache tăng hiệu suất.
- tôn trọng
$perm
tham số thứ 3 của wp_count_posts
hook.
tại sao: số lượng bài đăng nên bao gồm các bài đăng riêng tư của người dùng dựa trên readable
perm.
- áp dụng các bộ lọc như các bộ lọc ưu tiên cao.
tại sao: các bộ lọc có thể bị ghi đè bởi các bộ lọc khác.
- loại bỏ (hoặc sửa đổi) số lượng bài viết dính.
tại sao: số lượng bài viết dính bao gồm các bài đăng của người khác và chúng được tính riêng biệt bởi WP_Posts_List_Table
.
- sử dụng khả năng phù hợp cho Loại bài tùy chỉnh
tại sao: read_others_posts
khả năng có thể được sửa đổi.
Bạn có thể muốn điều chỉnh bổ sung
- lọc bình luận của người khác bằng cách đặt
post_author
truy vấn var thành WP_Comment_Query
.
- tinh chỉnh ý kiến đếm bằng
wp_count_comments
móc.
- ngăn chặn truy cập vào màn hình quản trị nên được hạn chế.
Sau đây là phiên bản sửa đổi dựa trên 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)
Vấn đề đã biết: Các bài đăng dính không thuộc về người dùng được tính. cố định bằng cách loại bỏ các bài viết dính xem.