अन्य उपयोगकर्ताओं के पोस्ट को व्यवस्थापक पैनल में छिपाएं


10

मैंने एक बहु-लेखक साइट चलाने का इरादा किया है, मैं नहीं चाहता कि अन्य लेखकों के पोस्ट /wp-admin/edit.phpपेज में दिखाए जाएं।

मैंने इस समस्या को इस थ्रेड से कोड द्वारा हल किया । कोड इस प्रकार है:

function posts_for_current_author($query) {
    global $pagenow;

    if( 'edit.php' != $pagenow || !$query->is_admin )
        return $query;

    if( !current_user_can( 'manage_options' ) ) {
        global $user_ID;
        $query->set('author', $user_ID );
    }
    return $query;
}
add_filter('pre_get_posts', 'posts_for_current_author');

कोड महान काम करते हैं, यह अन्य लेखकों के पदों को यहां पर दिखाया जाना है। लेकिन मुझे एक और समस्या है - लेखक के द्वारा पृष्ठ के शीर्ष पर स्थित मेनू संबंधित पोस्ट को नहीं बदलता है, यह मेरी साइट के सभी पोस्ट की संख्या दिखाता है।

मेरा मतलब मेनू इस तरह है:

Mine () | All () | Published () | Draft () | Trash ()

()केवल लेखक से संबंधित संख्या को दर्शाने के लिए संख्या में परिवर्तन कैसे करें ?


मैं सिर्फ जोर से सोच रहा हूं क्योंकि मेरे पास एक ही काम करने पर विचार है। मेरी वेबसाइट एक बेसबॉल वेबसाइट है जिसमें लगभग 10 लेखक हैं। मैं आगे-पीछे चलता रहता हूं कि वर्तमान में लॉग इन किए गए अन्य लेखकों के ड्राफ्ट को छिपाया जाए या नहीं। एक तरफ, मुझे लगता है कि उन्हें प्रकाशित होने तक अन्य लेखकों के लेखों को जानने की आवश्यकता नहीं है। दूसरी तरफ, मैं नहीं चाहता कि 2 लेखक एक ही समय में लगभग 2 समान लेख प्रकाशित करें।
ट्रैविस Pflanz

अंत में मुझे अपनी समस्या का हल मिल गया ... wordpress.org/support/topic/… यह मदद कर सकता है
dev-jim

जवाबों:


11

यहाँ मेरा उपयोग है:

// Show only posts and media related to logged in author
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
    global $current_user;
    if( is_admin() && !current_user_can('edit_others_posts') ) {
        $wp_query->set( 'author', $current_user->ID );
        add_filter('views_edit-post', 'fix_post_counts');
        add_filter('views_upload', 'fix_media_counts');
    }
}

// Fix post counts
function fix_post_counts($views) {
    global $current_user, $wp_query;
    unset($views['mine']);
    $types = array(
        array( 'status' =>  NULL ),
        array( 'status' => 'publish' ),
        array( 'status' => 'draft' ),
        array( 'status' => 'pending' ),
        array( 'status' => 'trash' )
    );
    foreach( $types as $type ) {
        $query = array(
            'author'      => $current_user->ID,
            'post_type'   => 'post',
            'post_status' => $type['status']
        );
        $result = new WP_Query($query);
        if( $type['status'] == NULL ):
            $class = ($wp_query->query_vars['post_status'] == NULL) ? ' class="current"' : '';
            $views['all'] = sprintf(__('<a href="%s"'. $class .'>All <span class="count">(%d)</span></a>', 'all'),
                admin_url('edit.php?post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'publish' ):
            $class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : '';
            $views['publish'] = sprintf(__('<a href="%s"'. $class .'>Published <span class="count">(%d)</span></a>', 'publish'),
                admin_url('edit.php?post_status=publish&post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'draft' ):
            $class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : '';
            $views['draft'] = sprintf(__('<a href="%s"'. $class .'>Draft'. ((sizeof($result->posts) > 1) ? "s" : "") .' <span class="count">(%d)</span></a>', 'draft'),
                admin_url('edit.php?post_status=draft&post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'pending' ):
            $class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : '';
            $views['pending'] = sprintf(__('<a href="%s"'. $class .'>Pending <span class="count">(%d)</span></a>', 'pending'),
                admin_url('edit.php?post_status=pending&post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'trash' ):
            $class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : '';
            $views['trash'] = sprintf(__('<a href="%s"'. $class .'>Trash <span class="count">(%d)</span></a>', 'trash'),
                admin_url('edit.php?post_status=trash&post_type=post'),
                $result->found_posts);
        endif;
    }
    return $views;
}

// Fix media counts
function fix_media_counts($views) {
    global $wpdb, $current_user, $post_mime_types, $avail_post_mime_types;
    $views = array();
    $count = $wpdb->get_results( "
        SELECT post_mime_type, COUNT( * ) AS num_posts 
        FROM $wpdb->posts 
        WHERE post_type = 'attachment' 
        AND post_author = $current_user->ID 
        AND post_status != 'trash' 
        GROUP BY post_mime_type
    ", ARRAY_A );
    foreach( $count as $row )
        $_num_posts[$row['post_mime_type']] = $row['num_posts'];
    $_total_posts = array_sum($_num_posts);
    $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );
    if ( !isset( $total_orphans ) )
        $total_orphans = $wpdb->get_var("
            SELECT COUNT( * ) 
            FROM $wpdb->posts 
            WHERE post_type = 'attachment' 
            AND post_author = $current_user->ID 
            AND post_status != 'trash' 
            AND post_parent < 1
        ");
    $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));
    foreach ( $matches as $type => $reals )
        foreach ( $reals as $real )
            $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];
    $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';
    $views['all'] = "<a href='upload.php'$class>" . sprintf( __('All <span class="count">(%s)</span>', 'uploaded files' ), number_format_i18n( $_total_posts )) . '</a>';
    foreach ( $post_mime_types as $mime_type => $label ) {
        $class = '';
        if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )
            continue;
        if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )
            $class = ' class="current"';
        if ( !empty( $num_posts[$mime_type] ) )
            $views[$mime_type] = "<a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), $num_posts[$mime_type] ) . '</a>';
    }
    $views['detached'] = '<a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( __( 'Unattached <span class="count">(%s)</span>', 'detached files' ), $total_orphans ) . '</a>';
    return $views;
}

स्रोत


1
मैं इन दोनों सवालों को एक शब्दकोष नौसिखिया के रूप में पूछ रहा हूं: (1) अधिक सरणियों का उपयोग क्यों नहीं कर रहा है और elseifवहां कम है? (२) और केवल उदाहरण के लिए __()पूरे पर अनुवाद का उपयोग क्यों ? hrefAll
cregox

3

उत्तर https://wordpress.stackexchange.com/a/49200/83038 पर आधारित छोटा समाधान ।

नोट: वर्डप्रेस 3.7.0 के बाद से उपलब्ध है।

function fix_count_orders( $counts, $type ) {
    global $wpdb;

    $query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s";
    $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'];
    }

    return (object) $counts;
}


function query_set_only_author( $wp_query ) {
    global $current_user;

    // Add here post types for which you want to fix counts ('post' added for example).
    $allowed_types = array( 'post' );
    $current_type = get_query_var( 'post_type' ) ? get_query_var( 'post_type' ) : '';

    if( is_admin() && ! current_user_can( 'edit_others_posts' ) && in_array( $current_type, $allowed_types ) ) {
        $wp_query->set( 'author', $current_user->ID );
        add_filter( 'wp_count_posts', 'fix_count_orders' );
    }
}

add_action( 'pre_get_posts', 'query_set_only_author', 10, 2 );

2

सबसे अच्छा तरीका

सभी एंज़र्स ने यहां सुरक्षा कॉन्फ्रेंस की हैं।

सर्वोत्तम तरीका क्षमताओं द्वारा कस्टम क्षमताओं और प्रबंध पदों आदि को जोड़ना है।


एक आसान तरीका

आर्टेम का समाधान बेहतर प्रतीत होता है क्योंकि WP केवल पोस्ट एडिट स्क्रीन पर पोस्ट काउंट्स को संदर्भित नहीं करता है, बल्कि डैशबोर्ड विजेट, अजाक्स प्रतिक्रिया आदि के भीतर भी होता है।

आर्टेम के एक पर आधारित बेहतर समाधान के लिए।

  1. डिफ़ॉल्ट पोस्ट कैश को साफ़ करता है।
    क्यों: wp_count_postsइससे पहले कैश्ड पोस्ट काउंट्स को वापस कर देता है जब परिणाम पहले कैश किया गया हो।
  2. कस्टम पोस्ट मायने रखता है के परिणाम कैश।
    क्यों: कैश प्रदर्शन को बढ़ाता है।
  3. हुक के तीसरे $permपैरामीटर का सम्मान करें wp_count_posts
    क्यों: पोस्ट काउंट में readableपरमिट के आधार पर उपयोगकर्ता के अपने निजी पोस्ट शामिल होने चाहिए ।
  4. उच्च प्राथमिकता वाले फ़िल्टर के रूप में फ़िल्टर लागू करें।
    क्यों: फ़िल्टर अन्य फ़िल्टर द्वारा ओवरराइड किया जा सकता है।
  5. चिपचिपा पदों को हटाने (या संशोधित) की गिनती।
    क्यों: चिपचिपे पदों की गिनती में अन्य पद शामिल हैं और वे अलग से गिने जाते हैं WP_Posts_List_Table
  6. कस्टम पोस्ट प्रकार के लिए उचित क्षमता का उपयोग
    क्यों करें: 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)

ज्ञात समस्या: स्टिकी पोस्ट जो उपयोगकर्ता से संबंधित नहीं हैं, गिने जाते हैं। चिपचिपा पदों दृश्य को हटाने के द्वारा तय की।


धन्यवाद, यह सही है कि मैं क्या उपयोग कर रहा हूं और कर रहा हूं। बस सभी 'पोस्ट' को मेरे कस्टम क्षमता नाम में बदल दिया।
शॉन रेबेलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.