web-dev-qa-db-ja.com

編集者が保留中の投稿を編集できるようにしますが、下書きは編集できません

私は編集者 機能 を持つ多くのユーザーを持っていますが、投稿投稿を進めるのに役立ちます。これが私のこの役割の現在の設定です。

Editor Capabilities

ご覧のとおり、edit_postsedit_others_postsは許可されていますが、edit_published_postsはできません。つまり、ステータスが{Draft}とPendingの投稿を編集できます。

今、私はそれらを のみ 保留中の投稿を編集できるように制限したいと思います。そのため、ドラフト投稿に触れることはできません( ただし 投稿の作成者である場合)。残念ながら、edit_pending_posts... ありますのような機能はありません。

どうやってこれを解決できますか?

8

これは実際には難しいことではありません。新しい機能を追加するには、WP_Roles->add_cap()を呼び出します。データベースに保存されるため、これは1回だけ実行する必要があります。そのため、プラグインアクティベーションフックを使用します。

他の読者への注意:以下のコードはすべて プラグイン地域 です。

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

今、私たちはすべての呼び出しをフィルタリングする必要があります…

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

これはWordPressがユーザーが投稿を編集できるかどうかを確認する方法だからです。内部的には、これは他の作者の投稿用のedit_others_posts機能にマッピングされます。

そのため、user_has_cap機能を使用したい場合は、edit_pending_postsをフィルター処理し、新しいedit_post機能を調べる必要があります。

これも一種の編集であるため、私もdelete_postを含めました。

複雑に聞こえますが、本当に簡単です。

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;
}
4
fuxia