Cho phép các biên tập viên chỉnh sửa các bài đăng đang chờ xử lý nhưng không phải các bài viết nháp


8

Tôi có một số lượng lớn người dùng có Khả năng chỉnh sửa giúp vượt qua bài đăng. Đây là thiết lập hiện tại của tôi cho vai trò này:

Khả năng biên tập

Như bạn có thể thấy, họ được phép edit_postsedit_others_postsnhưng họ không thể edit_published_posts. Điều này có nghĩa là họ có thể chỉnh sửa các bài đăng ở trạng thái Dự thảoĐang chờ xử lý .

Bây giờ, tôi muốn hạn chế chúng chỉ có thể chỉnh sửa các bài đăng đang chờ xử lý. Vì vậy, họ sẽ không có khả năng chạm vào các bài viết nháp ( trừ khi họ là tác giả của bài đăng). Thật không may, không có khả năng như edit_pending_posts... nên có .

Tôi giải quyết điều này như thế nào?

Câu trả lời:


4

Điều này thực sự không khó. Để thêm một khả năng mới, hãy gọi WP_Roles->add_cap(). Bạn phải làm điều này chỉ một lần, bởi vì nó sẽ được lưu trữ trong cơ sở dữ liệu. Vì vậy, chúng tôi sử dụng một móc kích hoạt plugin.

Lưu ý cho những người đọc khác: Tất cả các mã sau đây là lãnh thổ plugin .

register_activation_hook( __FILE__, 'epp_add_cap' );

/**
 * Add new capability to "editor" role.
 *
 * @wp-hook "activate_" . __FILE__
 * @return  void
 */
function epp_add_cap()
{
    global $wp_roles;

    if ( ! isset( $wp_roles ) )
        $wp_roles = new WP_Roles;

    $wp_roles->add_cap( 'editor', 'edit_pending_posts' );
}

Bây giờ chúng tôi phải lọc tất cả các cuộc gọi cho Giáo dục

current_user_can( $post_type_object->cap->edit_post, $post->ID );

Vì đó là cách WordPress kiểm tra nếu người dùng có thể chỉnh sửa bài đăng. Trong nội bộ, điều này sẽ được ánh xạ đến edit_others_postskhả năng cho các bài viết của tác giả khác.

Vì vậy, chúng tôi phải lọc user_has_capvà xem xét edit_pending_postskhả năng mới của chúng tôi khi một số người muốn sử dụng edit_postkhả năng này.

Tôi cũng đã bao gồm delete_post, bởi vì đây cũng là một loại chỉnh sửa.

Nghe có vẻ phức tạp, nhưng nó thực sự đơn giản:

add_filter( 'user_has_cap', 'epp_filter_cap', 10, 3 );

/**
 * Allow editing others pending posts only with "edit_pending_posts" capability.
 * Administrators can still edit those posts.
 *
 * @wp-hook user_has_cap
 * @param   array $allcaps All the capabilities of the user
 * @param   array $caps    [0] Required capability ('edit_others_posts')
 * @param   array $args    [0] Requested capability
 *                         [1] User ID
 *                         [2] Post ID
 * @return  array
 */
function epp_filter_cap( $allcaps, $caps, $args )
{
    // Not our capability
    if ( ( 'edit_post' !== $args[0] && 'delete_post' !== $args[0] )
        or empty ( $allcaps['edit_pending_posts'] )
    )
        return $allcaps;

    $post = get_post( $args[2] );


    // Let users edit their own posts
    if ( (int) $args[1] === (int) $post->post_author
        and in_array(
            $post->post_status,
            array ( 'draft', 'pending', 'auto-draft' )
        )
    )
    {
        $allcaps[ $caps[0] ] = TRUE;
    }
    elseif ( 'pending' !== $post->post_status )
    { // Not our post status
        $allcaps[ $caps[0] ] = FALSE;
    }

    return $allcaps;
}

Tôi đã thực hiện các bài kiểm tra và chạy vào một vài vấn đề. Thứ nhất, tôi đã edit_postsvà tiếp edit_others_poststục với cái mới edit_pending_posts. Tôi đã cố gắng tiếp edit_pending_poststục mà không có hai người kia và menu bài đăng không xuất hiện. Khi kiểm tra điều này, tôi thấy rằng tôi có thể thêm một bài đăng mới, nhưng không thể lưu bản nháp ( You are not allowed to edit this postthông báo). Bạn đã thử nghiệm để lưu bài viết của riêng bạn trong vai trò này? Chỉnh sửa bài viết đang chờ xử lý là tốt.
Christine Cooper

@ChristineCooper Điều này xảy ra vì $post->post_authorđược truyền dưới dạng chuỗi , nhưng $args[1]dưới dạng số nguyên. Đôi khi. WordPress ngu ngốc! Tôi đã sửa nó bằng cách đúc cả hai số nguyên. Và tôi cho phép các biên tập viên chỉnh sửa các bài đăng được xuất bản của riêng họ. Nếu bạn không muốn điều đó, hãy xóa returndòng trong khối sau // Let users edit their own posts.
fuxia

Hiểu rồi! Một vấn đề vẫn còn. Tôi đã kiểm tra mã cập nhật của bạn và nó hoạt động tốt! Tuy nhiên tôi không muốn cho phép các biên tập viên chỉnh sửa các bài đăng đã xuất bản của họ vì vậy tôi đã xóa return $allcaps;dòng đó và vấn đề cấp phép tương tự xuất hiện cùng với việc lưu bản nháp. Tại sao?
Christine Cooper

Hừm, làm việc cho tôi. Cài đặt khả năng của tôi
fuxia

Chỉ cần xác nhận, bạn đã tham khảo để loại bỏ dòng trở lại dưới $allcaps[ $caps[0] ] = TRUE;? Thật kỳ lạ khi tôi gặp phải điều này, nó không có ý nghĩa về mặt logic rằng nó không hoạt động với tôi nếu nó phù hợp với bạn, đây là thiết lập của tôi: i.imgur.com/X3bv9rH.png
Christine Cooper
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.