প্রশাসকের প্যানেলে অন্য ব্যবহারকারীর পোস্টগুলি লুকান


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');

কোডগুলি দুর্দান্ত কাজ করে, এখানে অন্য লেখকের পোস্টগুলি এখানে দেখানো হবে hide তবে আমি আরও একটি সমস্যা খুঁজে পাই - পৃষ্ঠার শীর্ষে থাকা মেনুটি লেখকের দ্বারা সম্পর্কিত পোস্টের সংখ্যা পরিবর্তন করে না, এটি আমার সাইটের সমস্ত পোস্টের সংখ্যা দেখায়।

আমি যে মেনুটি বলতে চাইছি তা হ'ল:

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

()শুধুমাত্র লেখকের সাথে সম্পর্কিত নম্বর প্রতিফলিত করতে কীভাবে নম্বর পরিবর্তন করবেন ?


আমি কেবল উচ্চস্বরে চিন্তা করছি কারণ আমার একই জিনিসটি করার / করার বিষয়ে বিবেচনা করছি। আমার ওয়েবসাইটটি প্রায় 10 জন লেখক নিয়ে একটি বেসবল ওয়েবসাইট। আমি বর্তমানে লগ ইন করা লেখক থেকে অন্য লেখকের খসড়াগুলি লুকিয়ে রাখব কিনা তা আমি বার বার এগিয়ে চলেছি। একদিকে, আমি মনে করি তাদের প্রকাশের আগ পর্যন্ত তাদের অন্যান্য লেখকের নিবন্ধগুলি জানা দরকার নেই। অন্যদিকে, আমি চাই না যে 2 জন লেখক একই সময়ে 2 প্রায় একই ধরণের নিবন্ধ প্রকাশ করুন।
ট্র্যাভিস প্লাফ্লানজ

অবশেষে আমি আমার সমস্যার সমাধান পেয়েছি ... wordpress.org/support/topic/… এটি সাহায্য করতে পারে
দেব-জিম

উত্তর:


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সেখানে আরও বেশি অ্যারে ব্যবহার করা হচ্ছে না? (2) আর কেনই বা অনুবাদ ব্যবহার __()পুরো ওভার hrefবরং শুধু Allউদাহরণস্বরূপ?
ক্রেগক্স

3

উত্তরের https://wordpress.stackexchange.com/a/49200/83038 ভিত্তিতে সংক্ষিপ্ত সমাধান ।

দ্রষ্টব্য: ওয়ার্ডপ্রেস ৩.০.০ থেকে উপলব্ধ।

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

সেরা উপায়

এই সমস্ত উত্তর এখানে সুরক্ষা সংযোগ রয়েছে।

সর্বোত্তম উপায় হ'ল ক্ষমতা দ্বারা কাস্টম ক্ষমতা এবং পোস্ট পরিচালনা ইত্যাদি।


একটি সহজ উপায়

আর্টেমের সমাধানটি আরও ভাল বলে মনে হচ্ছে কারণ ডাব্লুপি কেবল পোস্ট সম্পাদনা স্ক্রিনে নয় তবে ড্যাশবোর্ড উইজেট, অ্যাজাক্স প্রতিক্রিয়া ইত্যাদির মধ্যে পোস্ট গণনা উল্লেখ করে doesn't

আর্টেমের এর ভিত্তিতে আরও ভাল সমাধানের জন্য।

  1. ডিফল্ট পোস্ট গণনা ক্যাশে সাফ করুন।
    কেন: wp_count_postsফলাফল আগে যখন ক্যাশে হয় তখন আগে ক্যাশেড পোস্ট গণনা প্রদান করে।
  2. কাস্টম পোস্ট গণনার ফলাফল ক্যাশে।
    কেন: ক্যাশে কর্মক্ষমতা বাড়ায়।
  3. হুক 3 য় $permপ্যারামিটার সম্মান wp_count_posts
    কেন: পোস্ট readableগণিতে পারম ভিত্তিতে ব্যবহারকারীর নিজস্ব ব্যক্তিগত পোস্ট অন্তর্ভুক্ত করা উচিত ।
  4. উচ্চ অগ্রাধিকার ফিল্টার হিসাবে ফিল্টার প্রয়োগ করুন।
    কেন: ফিল্টারগুলি অন্য ফিল্টারগুলির দ্বারা ওভাররাইড করা হতে পারে।
  5. স্টিকি পোস্ট গণনা অপসারণ (বা সংশোধন)।
    কেন: স্টিকি পোস্ট গণনাতে অন্যান্য পোস্ট অন্তর্ভুক্ত থাকে এবং সেগুলি পৃথকভাবে গণনা করা হয় WP_Posts_List_Table
  6. কাস্টম পোস্ট প্রকারের জন্য উপযুক্ত দক্ষতা ব্যবহার করুন
    কেন: read_others_postsক্ষমতাটি সংশোধন করা যেতে পারে।

আপনি অতিরিক্ত টুইট করতে চাইতে পারেন

  • post_authorক্যোয়ারী ভেরিতে সেট করে অন্যের পোস্টের মন্তব্যগুলিকে ফিল্টার করুন WP_Comment_Query
  • wp_count_commentsহুক দ্বারা মন্তব্য গণনা tweaks ।
  • অ্যাডমিন স্ক্রিনগুলিতে অ্যাক্সেস আটকাতে হবে যা সীমাবদ্ধ করা উচিত।

নিম্নলিখিতটি wp_post_counts()ডাব্লুপি 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)

জ্ঞাত সমস্যা: স্টিকি পোস্টগুলি যা ব্যবহারকারীর নয় belong স্টিকি পোস্ট ভিউ মুছে ফিক্সড।


ধন্যবাদ, আমি যা ব্যবহার করছি এবং যা করছি তার জন্য এটি উপযুক্ত ছিল। স্রেফ আমার সমস্ত কাস্টম সামর্থ্যের নাম 'পোস্ট' পরিবর্তন করেছে।
শন রেবেলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.