วิธีที่ดีที่สุด
คำตอบทั้งหมดที่นี่มีความกังวล
วิธีที่ดีที่สุดคือการเพิ่มความสามารถที่กำหนดเองและจัดการโพสต์ ฯลฯ ตามความสามารถ
วิธีง่ายๆ
โซลูชันของ Artem น่าจะดีกว่าเพราะ WP ไม่ได้อ้างถึงจำนวนการโพสต์เฉพาะในหน้าจอแก้ไขโพสต์ แต่ยังอยู่ในวิดเจ็ตแดชบอร์ดการตอบสนองอาแจ็กซ์ ฯลฯ
เพื่อการแก้ปัญหาที่ดีขึ้นโดยอ้างอิงจาก Artem
- ล้างโพสต์เริ่มต้นนับแคช
ทำไม: wp_count_posts
ก่อนหน้านี้ส่งคืนโพสต์ที่แคชไว้นับเมื่อผลลัพธ์ถูกแคชไว้ก่อนหน้า
- แคชผลลัพธ์ของการนับโพสต์ที่กำหนดเอง
ทำไม: แคชเพิ่มประสิทธิภาพ
- เคารพ
$perm
พารามิเตอร์ที่ 3 ของwp_count_posts
เบ็ด
ทำไม: การนับโพสต์ควรมีการโพสต์ส่วนตัวของผู้ใช้ตามใบreadable
อนุญาต
- ใช้ตัวกรองเป็นตัวกรองลำดับความสำคัญสูง
ทำไม: ตัวกรองอาจถูกแทนที่โดยตัวกรองอื่น ๆ
- ลบ (หรือแก้ไข) จำนวนโพสต์เหนียว
เหตุผล: โพสเหนียวนับรวมถึงการโพสต์อื่น ๆ WP_Posts_List_Table
และพวกเขาจะนับและแยกจาก
- ใช้ความสามารถที่เหมาะสมสำหรับ Custom Post Type
ทำไม: read_others_posts
สามารถปรับเปลี่ยนความสามารถได้
คุณอาจต้องการปรับแต่งเพิ่มเติม
- ความคิดเห็นกรองคนอื่นโพสต์โดยการตั้งค่า
post_author
var WP_Comment_Query
แบบสอบถามไปยัง
- ความคิดเห็น tweaks นับโดย
wp_count_comments
เบ็ด
- ป้องกันการเข้าถึงหน้าจอผู้ดูแลระบบที่ควรถูก จำกัด
ต่อไปนี้เป็นเวอร์ชั่นที่แก้ไขตาม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)
ปัญหาที่ทราบ: การนับโพสต์เหนียวที่ไม่ได้เป็นของผู้ใช้จะถูกนับ แก้ไขโดยการลบมุมมองโพสต์เหนียว