Jalan terbaik
SEMUA JAWABAN INI MEMILIKI MASALAH KEAMANAN.
Cara terbaik adalah menambahkan kemampuan kustom dan mengelola pos dll dengan kemampuan.
Cara yang mudah
Solusi Artem tampaknya lebih baik karena WP tidak merujuk jumlah posting hanya pada layar post edit tetapi juga dalam widget Dashboard, respons Ajax dll.
Untuk solusi yang lebih baik berdasarkan Artem's.
- hapus cache jumlah posting default.
mengapa: wp_count_posts
sebelumnya mengembalikan jumlah cache yang dihitung ketika hasilnya telah di-cache sebelumnya.
- cache hasil hitungan pos kustom.
mengapa: cache meningkatkan kinerja.
- hargai
$perm
parameter ke-3 wp_count_posts
hook.
mengapa: jumlah posting harus mencakup posting pribadi pengguna sendiri berdasarkan readable
perm.
- terapkan filter sebagai filter prioritas tinggi.
mengapa: filter mungkin ditimpa oleh filter lain.
- menghapus (atau memodifikasi) jumlah posting yang lengket.
mengapa: posting sticky menghitung termasuk posting lain dan mereka dihitung secara terpisah oleh WP_Posts_List_Table
.
- gunakan kemampuan yang tepat untuk Jenis Posting Kustom
mengapa: read_others_posts
kemampuan dapat dimodifikasi.
Anda mungkin ingin menambahkan tweak
- filter komentar posting orang lain dengan menyetel
post_author
kueri var ke WP_Comment_Query
.
- komentar tweak dihitung dengan
wp_count_comments
kait.
- mencegah akses ke layar admin yang seharusnya dibatasi.
Berikut ini adalah versi yang dimodifikasi berdasarkan 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)
Masalah yang Diketahui: Posting tempel yang bukan milik pengguna dihitung. diperbaiki dengan menghapus tampilan posting yang lengket.