सबसे अच्छा तरीका
सभी एंज़र्स ने यहां सुरक्षा कॉन्फ्रेंस की हैं।
सर्वोत्तम तरीका क्षमताओं द्वारा कस्टम क्षमताओं और प्रबंध पदों आदि को जोड़ना है।
एक आसान तरीका
आर्टेम का समाधान बेहतर प्रतीत होता है क्योंकि WP केवल पोस्ट एडिट स्क्रीन पर पोस्ट काउंट्स को संदर्भित नहीं करता है, बल्कि डैशबोर्ड विजेट, अजाक्स प्रतिक्रिया आदि के भीतर भी होता है।
आर्टेम के एक पर आधारित बेहतर समाधान के लिए।
- डिफ़ॉल्ट पोस्ट कैश को साफ़ करता है।
क्यों: wp_count_posts
इससे पहले कैश्ड पोस्ट काउंट्स को वापस कर देता है जब परिणाम पहले कैश किया गया हो।
- कस्टम पोस्ट मायने रखता है के परिणाम कैश।
क्यों: कैश प्रदर्शन को बढ़ाता है।
- हुक के तीसरे
$perm
पैरामीटर का सम्मान करें wp_count_posts
।
क्यों: पोस्ट काउंट में readable
परमिट के आधार पर उपयोगकर्ता के अपने निजी पोस्ट शामिल होने चाहिए ।
- उच्च प्राथमिकता वाले फ़िल्टर के रूप में फ़िल्टर लागू करें।
क्यों: फ़िल्टर अन्य फ़िल्टर द्वारा ओवरराइड किया जा सकता है।
- चिपचिपा पदों को हटाने (या संशोधित) की गिनती।
क्यों: चिपचिपे पदों की गिनती में अन्य पद शामिल हैं और वे अलग से गिने जाते हैं WP_Posts_List_Table
।
- कस्टम पोस्ट प्रकार के लिए उचित क्षमता का उपयोग
क्यों करें: read_others_posts
क्षमता को संशोधित किया जा सकता है।
आप अतिरिक्त tweaks के लिए चाहते हो सकता है
- अन्य लोगों की टिप्पणियों को
post_author
क्वेरी संस्करण सेट करके फ़िल्टर करें 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)
ज्ञात समस्या: स्टिकी पोस्ट जो उपयोगकर्ता से संबंधित नहीं हैं, गिने जाते हैं। चिपचिपा पदों दृश्य को हटाने के द्वारा तय की।