Ẩn bài đăng của người dùng khác trong bảng quản trị


9

Tôi dự định điều hành một trang web nhiều tác giả, tôi không muốn các bài đăng từ các tác giả khác được hiển thị trên /wp-admin/edit.phptrang.

Tôi quản lý giải quyết vấn đề này bằng các mã từ chủ đề này . Mã này là như thế này:

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

Các mã hoạt động tuyệt vời, nó ẩn các bài viết từ các tác giả khác sẽ được hiển thị ở đây. Nhưng tôi tìm thấy một vấn đề khác - menu ở đầu trang không thay đổi số lượng bài đăng liên quan của tác giả, nó hiển thị số lượng bài đăng trong trang web của tôi.

Thực đơn tôi muốn nói là như thế này:

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

Làm thế nào để thay đổi số trong ()để phản ánh số chỉ liên quan đến tác giả?


Tôi chỉ nghĩ lớn vì tôi có / đang xem xét làm điều tương tự. Trang web của tôi là một trang web bóng chày với khoảng 10 tác giả. Tôi tiếp tục quay lại xem có nên giấu dự thảo của các tác giả khác khỏi tác giả hiện đang đăng nhập hay không. Một mặt, tôi nghĩ họ không cần biết các bài báo của các tác giả khác cho đến khi họ xuất bản. Mặt khác, tôi không muốn 2 tác giả xuất bản cùng lúc 2 bài báo.
Travis Pflanz

Cuối cùng tôi đã tìm thấy một giải pháp cho vấn đề của mình ... wordpress.org/support/topic/, điều này có thể giúp
dev-jim

Câu trả lời:


11

Đây là những gì tôi sử dụng:

// 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;
}

Nguồn


1
Tôi đang hỏi hai câu hỏi này với tư cách là một người mới học wordpress: (1) Tại sao không sử dụng nhiều mảng hơn và ít hơn elseifở đó? (2) Và tại sao sử dụng bản dịch __()trên toàn bộ hrefthay vì chỉ trên Allví dụ?
cregox 7/10/2015

3

Giải pháp ngắn hơn dựa trên câu trả lời https://wordpress.stackexchange.com/a/49200/83038 .

LƯU Ý: Có sẵn kể từ WordPress 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

Cách tốt nhất

TẤT CẢ CÁC TRẢ LỜI NÀY Ở ĐÂY CÓ Ý TƯỞNG AN NINH.

Cách tốt nhất là thêm các khả năng tùy chỉnh và quản lý bài đăng, v.v. bằng các khả năng.


Một cách dễ dàng

Giải pháp của Artem dường như tốt hơn vì WP không chỉ giới thiệu số bài đăng trên màn hình chỉnh sửa bài mà còn trong tiện ích Bảng điều khiển, phản hồi Ajax, v.v.

Để có giải pháp tốt hơn dựa trên cơ sở của Artem.

  1. xóa bài đăng mặc định đếm bộ nhớ cache.
    tại sao: trước đó wp_count_poststrả về số lượng bài đăng được lưu trong bộ nhớ cache khi kết quả đã được lưu vào bộ nhớ cache trước đó.
  2. lưu trữ kết quả của số lượng bài tùy chỉnh.
    tại sao: bộ nhớ cache tăng hiệu suất.
  3. tôn trọng $permtham số thứ 3 của wp_count_postshook.
    tại sao: số lượng bài đăng nên bao gồm các bài đăng riêng tư của người dùng dựa trên readableperm.
  4. áp dụng các bộ lọc như các bộ lọc ưu tiên cao.
    tại sao: các bộ lọc có thể bị ghi đè bởi các bộ lọc khác.
  5. loại bỏ (hoặc sửa đổi) số lượng bài viết dính.
    tại sao: số lượng bài viết dính bao gồm các bài đăng của người khác và chúng được tính riêng biệt bởi WP_Posts_List_Table.
  6. sử dụng khả năng phù hợp cho Loại bài tùy chỉnh
    tại sao: read_others_postskhả năng có thể được sửa đổi.

Bạn có thể muốn điều chỉnh bổ sung

  • lọc bình luận của người khác bằng cách đặt post_authortruy vấn var thành WP_Comment_Query.
  • tinh chỉnh ý kiến ​​đếm bằng wp_count_commentsmóc.
  • ngăn chặn truy cập vào màn hình quản trị nên được hạn chế.

Sau đây là phiên bản sửa đổi dựa trên 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)

Vấn đề đã biết: Các bài đăng dính không thuộc về người dùng được tính. cố định bằng cách loại bỏ các bài viết dính xem.


Cảm ơn, điều này là hoàn hảo cho những gì tôi đang sử dụng và làm. Chỉ cần thay đổi tất cả 'bài' thành tên khả năng tùy chỉnh của tôi.
Shawn Rebelo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.