web-dev-qa-db-ja.com

作者がWordPressで作成したカテゴリにのみみ投稿できるようにする

私は、割り当てられたWordPressロール(私の場合は作者)を持つユーザーが新しいカテゴリーを作成し、自動的にそれらのカテゴリーまたはデフォルトの「未分類」にのみ投稿できるように制限できるようにする方法を探しています。

基本的に、私はユーザーが新しい「ストーリー」または「シリーズ」を追加できるストーリー構築ツールを作成しています(私は「投稿」および「カテゴリ」ラベルの名前を変更しました)ので、新しい「シリーズ」を作成できる必要があります。追加できるのは彼らだけです。

投稿を特定のカテゴリ内に制限するプラグインを数多く試しましたが、それらすべてに管理者が権限を設定する必要があり、カテゴリの作成時に自動的に権限を割り当てる必要があります。

(それが関連している場合、私はBuddyPressを使用していません、そして可能ならば私はマルチサイトに行きたくないでしょう)。

ありがとうございます。

1
Mandie

この小さなプラグインは、自分のカテゴリと投稿だけをユーザーロール 'author'に示しています。それであなたはあなた自身のポストタイプと分類法のためにそれを編集することができます。

/*
Plugin Name: Show own categories
Description: This plugin shows the user role 'author' only its own categories & posts
Version:     0.1
Author:      Soren Wrede
License:     GPL2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

class SW_Category_Restriction{
    private $user_cats = NULL;

    public function __construct(){
        //Save author ID for category
        add_action( 'create_category', array( &$this, 'save_category_author' ) );
        //Set manage_categories cap for 'Author'
        add_action( 'admin_init', array( &$this, 'add_author_cap_categories' ) );
        //Remove manage_categories  capfor 'Author'
        register_deactivation_hook( __FILE__, array( &$this, 'remove_author_cap_categories' ) );
        //Filter categorys in new-post, edit-post, edit-categories
        add_action( 'admin_print_scripts-post-new.php', array( &$this, 'filter_post_page' ) );
        add_action( 'admin_print_scripts-post.php', array( &$this, 'filter_post_page' ) );
        add_action( 'admin_print_scripts-edit-tags.php', array( &$this, 'filter_post_page' ) );
        //just show own posts
        global $pagenow;
        if ( $pagenow == 'edit.php' )
            add_filter( 'pre_get_posts', array( &$this, 'filter_edit_page' ) );
    }

    public function save_category_author( $term_id ) {
        $user_id = get_current_user_id();
        add_term_meta( $term_id, 'author', $user_id );
    }

    public function get_user_cats( $user_id ) {
        $args = [
            'hide_empty' => false,
            'meta_query' => [
                [
                    'key' => 'author',
                    'value' => $user_id,
                ]
            ]
        ];
        $terms = get_terms( 'category', $args );
        $ids = '-1,';
        foreach ($terms as $term ) {
            $ids .= $term->term_id . ',';
        }
        $ids = substr($ids, 0, -1);
        $this->user_cats = $ids;
    }

    public function add_author_cap_categories() {
        $role = get_role( 'author' );
        $role->add_cap( 'manage_categories' );
    }

    public function remove_author_cap_categories() {
        $role = get_role( 'author' );
        $role->remove_cap( 'manage_categories' );
    }

    public function exclusions( $exclusions ){
        $exclusions .= " AND ( t.term_id IN ( $this->user_cats ) OR tt.taxonomy NOT IN ( 'category' ) )";
        return $exclusions;
    }

    public function filter_post_page() {
        //check post-type 
        $screen = get_current_screen();
        if ( $screen->post_type != 'post' )
            return;

        //just Author and lower
        if ( current_user_can('delete_others_posts') )
            return;

        $user_id = get_current_user_id();
        $this->get_user_cats( $user_id );

        if ( empty( $this->user_cats ) )
            return;

        add_filter( 'list_terms_exclusions', array( &$this, 'exclusions' ) );
    }

    public function filter_edit_page( $query ) {
        if ( current_user_can('delete_others_posts') )
            return;     
        $query->set( 'author', get_current_user_id() );

        return $query;
    }

}

new SW_Category_Restriction();
1
Sören Wrede