WordPress: разрешить пользовательской роли редактировать ТОЛЬКО пользовательский тип сообщения (не обычные сообщения)

#php #wordpress

#php #wordpress

Вопрос:

Я застрял на том, что, вероятно, действительно простая проблема. У меня есть CPT, зарегистрированный с использованием следующего кода для определения специальных возможностей:

 $args = [
        "label" => "Tracts",
        "description" => "",
        "public" => true,
        "publicly_queryable" => true,
        "show_ui" => true,
        "show_in_nav_menus" => true,
        "map_meta_cap" => true,
        "rewrite" => [ "slug" => "tract", "with_front" => true ],
        "query_var" => true,
        "supports" => [ "title", "editor", "thumbnail", "excerpt" ],
        'capabilities' => array(
            'edit_posts' => 'edit_tracts',
            'edit_others_posts' => 'edit_others_tracts', 
            'delete_posts' => 'delete_tracts',
            'publish_posts' => 'publish_tracts', 
        )
    ];

    register_post_type( "tract", $args );

 

Затем я регистрирую новую роль. Эта роль должна иметь возможность просматривать и редактировать только этот пользовательский тип записи. Я не могу позволить им видеть обычные сообщения.

 add_role('land_editor', 'Land Editor', array(
    'read' => true,
    'edit_tracts' => true,
    'edit_others_tracts' => true, 
    'delete_tracts' => true,
    'publish_tracts' => true,
));
 

С помощью этого кода моя роль может делать все, что мне нужно (они могут просматривать CPT, редактировать его и т. Д.) КРОМЕ добавления нового сообщения в пользовательский тип сообщения. Всякий раз, когда я нажимаю «добавить новое», я попадаю на страницу «извините, у вас нет разрешения на доступ к этой странице». Однако, когда я добавляю ‘edit_posts’ в массив возможностей новой роли, я могу внезапно добавлять новые сообщения пользовательского типа сообщения. Однако это также позволяет пользователю просматривать и добавлять новые из всех других типов сообщений, поэтому я не могу сделать это так. Есть понимание того, почему edit_tracts не позволяет мне добавлять новые разделы?

Ответ №1:

 function add_custom_caps() {
    
   $roles = get_role('land_editor');
    foreach($roles as $the_role) {
        $role = get_role($the_role);
        $role->add_cap( 'read' );
        $role->add_cap( 'read_tract');
        $role->add_cap( 'read_private_tract' );
        $role->add_cap( 'edit_tract' );
        $role->add_cap( 'edit_others_tract' ); 
        $role->add_cap( 'edit_published_tract' );
        $role->add_cap( 'publish_tract' );
        $role->add_cap( 'delete_others_tract' ); 
        $role->add_cap( 'delete_private_tract' );
        $role->add_cap( 'delete_published_tract' );
    }
}
add_action('admin_init', 'add_custom_caps', 5 );