web-dev-qa-db-ja.com

ユーザーの役割でカスタム投稿タイプの表示を制限する

カスタム投稿タイプを作成し、カスタムユーザーロールをいくつか作成し、特定のロールに基づいて投稿タイプの表示を制限できるようにしたいと思います。

これを制限する簡単な方法はありますか?

2
Brob

すべての役割に機能があります。

これが私たちの努力への単純な貢献者です:(彼はただ書いて編集します)

add_role('contributor', 'Contributor', array(
    'read' => true,
    'edit_posts' => true,
    'delete_posts' => false,
));

今、彼は新しい機能を持っています(彼は他の人々の投稿を編集できます)

function add_capability()
{
    $role = get_role('contributor');
    $role->add_cap('edit_others_posts');
}
add_action('admin_init', 'add_capability');

今度は私達の新しいポストタイプのための彼の新しい機能を追加します。まず投稿タイプを作成しましょう:

function create_myposttype()
{
    register_post_type(
        'myposttype',
        array(
            'public' => true,
            'capability_type' => 'myposttype',
            'capabilities' => array(
                'publish_posts' => 'publish_myposttypes',
                'edit_posts' => 'edit_myposttypes',
                'edit_others_posts' => 'edit_others_myposttypes',
                'read_private_posts' => 'read_private_myposttypes',
                'edit_post' => 'edit_myposttype',
                'delete_post' => 'delete_myposttype',
                'read_post' => 'read_myposttype',
            ),
        )
    );
}
add_action('init', 'create_myposttype');

投稿タイプは作成されますが、投稿者には権限がありません。彼にジュースをあげましょう。

function add_capability()
{
    $role = get_role('contributor');
    $role->add_cap('read_myposttype');
    $role->add_cap('edit_myposttypes');
    $role->add_cap('delete_myposttype', false); // to be sure
}
add_action('admin_init', 'add_capability');

Read_postおよびread_ *機能は、その割り当てられた役割を持つユーザーがその現在の領域を表示およびアクセスできないことを保証します。彼はその一般的なWordpressのエラーを取得します:

このページにアクセスするための十分な権限がありません

そして私たちの作者(そのデフォルトの役割)が myposttype postsを見ることができないようにしましょう:

function remove_author_capability()
{
    $role = get_role('author');
    $role->add_cap('read_myposttype', false);
}
add_action('admin_init', 'remove_author_capability');

クリーンアップを忘れないでください。

function add_roles_on_activation() // add roles on activation
{
    add_role('contributor', 'Contributor', array(
        'read' => true,
        'edit_posts' => true,
        'delete_posts' => false,
    ));
}
register_activation_hook(__FILE__, 'add_roles_on_activation');

function add_roles_removal()  // we clean up after ourselves
{
    remove_role('contributor');
}
register_deactivatin_hook(__FILE__, 'add_roles_removal');

メニューからアイテムを削除したいだけの場合は(URLからアクセスできるようにする)、次のようになります。

アドミンバーから(その上のホバリング小メニュー):

function my_edit_adminbar($wp_admin_bar)
{
    if(current_user_can('read_myposttype'))
        $wp_admin_bar->remove_node('new-myposttype');
}
add_action('admin_bar_menu', 'my_edit_adminbar');

メニューから:

function my_edit_menu()
{
    if(current_user_can('read_myposttype'))
    {
        $slug = 'edit.php?post_type=myposttype';
        remove_menu_page($slug);
    }
}
add_action('admin_menu', 'my_edit_menu');
3
aifrim

まず第一に、これが現在のユーザーロールを取得する方法です。

<?php 

// Get the current user id
$user_id = get_current_user_id(); 

// Get the user data based on this id
// returned in an arryay
$user_data = new WP_User( $user_id );


// We could echo out the first role item 
// in the array like this...   
echo $user->roles[0];


// Or we could print the full
// array like this 
print_r($user->roles);

?> 

これで上記のデータを使用して、テンプレート内に単純なif文を作成できます。これはあなたが何を達成しようとしているかによって異なりますが...

<?php 

$user_roll = $user->roles[0];
if($user_roll =="administrator") {

    // Code here will only be run if current
    // user is an admin
}
?> 

あなたはそれの粋を得ます;)

0
Edd Smith

それでは、コードは表示されません。そのため、カスタム投稿タイプを自分で作成したのか、それともプラグインを使用したのかはわかりません。私はあなたがfunctions.phpでカスタム投稿タイプを作成したと仮定します。そこには、ユーザーに特定の機能があるかどうかを確認するためのifステートメントを含めることができます。

<?php current_user_can( $capability, $args ); ?>

あなたが何らかのコードを投稿することができればそれは本当に助けになるでしょう、それで私はこれを行う方法についての具体的な例を挙げることができます。

http://codex.wordpress.org/Function_Reference/current_user_can

0
gdaniel