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


8

私には、投稿の提出を支援するエディター機能を持つユーザーが多数います。これはこの役割の私の現在の設定です:

エディター機能

ご覧のとおり、許可されていますが許可されedit_postsedit_others_postsいませんedit_published_posts。つまり、下書きおよび保留中のステータスの投稿を編集できます。

ここで、保留中の投稿のみを編集できるように制限したいと思います。そのため、(投稿の作成者でない限り)投稿の下書きを操作することはできません。残念なことにedit_pending_posts...のような機能はありません

どうすれば解決できますか?

回答:


4

これは実際には難しくありません。新しい機能を追加するには、を呼び出します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;
}

私はテストを行い、いくつかの問題に遭遇しました。まず、私が持っていたedit_postsし、edit_others_posts新しいと上edit_pending_postsedit_pending_posts他の2 つなしで着てみたところ、投稿メニューが表示されませんでした。これをテストしたところ、新しい投稿を追加することはできましたが、下書きを保存できませんでした(You are not allowed to edit this post通知)。この役割で自分の投稿を保存するためにテストしましたか?保留中の投稿の編集は問題ありません。
クリスティンクーパー

@ChristineCooperこれ$post->post_authorは、が文字列として渡されたが$args[1]整数として渡されたために発生しました。時々。バカワードプレス!両方を整数にキャストして修正しました。そして私は編集者が自分の公開された投稿を編集することを許可しました。それが不要な場合returnは、ブロックの後にある行を削除してください// Let users edit their own posts
fuxia

とった!1つの問題が残っています。私はあなたの更新されたコードをテストし、それはうまくいきました!ただし、私は編集者に公開された投稿の編集を許可したくないので、そのreturn $allcaps;行を削除しました。下書きを保存すると、同じ権限の問題が発生します。どうして?
クリスティンクーパー

うーん、私のために働きます。私の機能設定
fuxia

確認のために、あなたは$allcaps[ $caps[0] ] = TRUE;?:非常に奇妙な私はこれを経験していますので、それはそれは、ここに私のセットアップ、それはあなたのためにする場合は私のためではない仕事であるべきで、論理的にという意味がありませんi.imgur.com/X3bv9rH.png
クリスティン・クーパー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.