En iyi yol
BURADA TÜM BU CEVAPLAR GÜVENLİK KONULARINA SAHİPTİR.
En iyi yol, özel yetenekler eklemek ve gönderileri vb. Yeteneklerle yönetmektir.
Kolay bir yol
Artem'ın çözümü daha iyi görünüyor çünkü WP yalnızca sayı düzenleme ekranında yayın sayılarını değil, aynı zamanda Gösterge Tablosu widget'ında, Ajax yanıtı vb.
Artem'in çözümüne dayanan daha iyi çözüm için.
- varsayılan yazı sayısı önbelleğini temizle.
neden: wp_count_posts
sonuç daha önce önbelleğe alındığında daha önce önbelleğe alınan yayın sayısını döndürür.
- özel yazı sayımlarının sonucunu önbelleğe al.
neden: önbellek performansı artırır.
- Kancanın 3.
$perm
parametresine wp_count_posts
uyun.
Nedeni: Gönderi sayıları, izin verilen kullanıcının kendi özel gönderilerini içermelidir readable
.
- filtreleri yüksek öncelikli filtreler olarak uygular.
neden: filtreler diğer filtreler tarafından geçersiz kılınabilir.
- yapışkan yazı sayısını kaldırın (veya değiştirin).
neden: yapışkan yazı sayısı diğer yayınları içerir ve ayrı ayrı sayılır WP_Posts_List_Table
.
- Özel Gönderi Türü için uygun yeteneği kullanın
: neden: read_others_posts
yetenek değiştirilebilir.
Ek ayarlamalar yapmak isteyebilirsiniz
post_author
sorgu var değerini ayarlayarak diğer yayınların yorumlarını filtreleyin WP_Comment_Query
.
- tweak yorumları
wp_count_comments
kanca ile sayılır .
- kısıtlanması gereken yönetici ekranlarına erişimi önleyin.
Aşağıdaki wp_post_counts()
WP 4.8 tabanlı değiştirilmiş bir sürümüdür .
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)
Bilinen Sorun: Kullanıcıya ait olmayan yapışkan yayınlar sayılır. yapışkan yazılar görünümü kaldırılarak düzeltildi.