web-dev-qa-db-ja.com

current_user_can()はFALSEを返しますが、デバッグはTRUEを言います

バックグラウンド

私は私が一般的な機能を保持する必要があるプラグインを作成しました。 register_post_type()と同じです。

ここで私はいくつかのカスタム投稿タイプを作成しました。いくつかの非常に良い投稿の助けを借りて、私はカスタム投稿タイプの機能を把握することができました(私は思う)。

////////////////
//
// Create Custom Post Types
//
////////////////

add_action( 'init', 'create_post_type' );

    function create_post_type() {
    register_post_type( 'pms',
        array(
          'labels' => array(
            'name' => __( 'Personal Mission Statements' ),
            'singular_name' => __( 'Personal Mission Statement' )
          ),
          'public' => true,
          'has_archive' => true,
          'menu_position' => 2,
          'menu_icon' => 'dashicons-heart',
          'capability_type' => array('pms','pmss'),
          'map_meta_cap' => true,
          'supports'           => array( 'title', 'editor', 'author' )

        )
      );
      flush_rewrite_rules();
}

////////////////
//
// Create Custom Roles
//
////////////////


/////////
//Add new roles
////////

//Can't create new post and only edit their own
$capabilities_employee = array (
    'edit_others_pages' => true,
    'edit_others_posts' => true,
    'edit_pages' => true,
    'edit_posts' => true,
    'edit_private_posts' => true,
    'edit_published_posts' => true,
    'list_users' => true,
    'manage_categories' => true,
    'publish_posts' => true,
    'read' => true,
    'upload_files' => true,
    'manage_categories' => true,
    );

//Create additional Roles

function add_roles () {
    add_role( 'employee', 'Employee', $capabilities_employee );
}

add_action( 'admin_init', 'add_roles');

////////
//Specify Capabilities Custom Post Types
////////


//Add capabilities to the other Post Types (need added).
//The remove a capabilities it is NOT enough to remove the line, you need to add remove_cap()

function add_theme_caps() {

    // gets the candidate role
    $employees = get_role( 'employee' );

    $employees->add_cap( 'read' );

    $employees->add_cap( 'edit_pms' ); 
    $employees->add_cap( 'read_pms' ); 
    $employees->add_cap( 'edit_pmss' );
    $employees->add_cap( 'publish_pmss' ); 
    $employees->add_cap( 'edit_published_pmss' );
}
add_action( 'admin_init', 'add_theme_caps');

問題カスタム投稿 'pms'を編集する前にcurrent_user_can( 'edit_pms')をチェックします

1)デフォルトロール 'editor'はTRUEを返します2)カスタムロール 'employee'(上記)はFALSEを返します

'pms'カスタム投稿タイプの機能をデバッグするには$ GLOBALS ['wp_post_types']を、従業員ロールを持つユーザーの機能をデバッグするにはget_userdata()を使用します。どちらも適切な機能を備えています。

質問(2)のFALSEを返します。

ソース

https://codex.wordpress.org/Function_Reference/register_post_typehttp://justintadlock.com/archives/ 2010/07/10 /カスタム投稿タイプのメタ機能

1
Coloumbo

register_post_type() 関数はmap_meta_capの引数としてポストタイプ名を取ります。デフォルトはpostです。詳しい洞察のためにget_post_type_capabilities()の内部を見てください。それは、それがどういう意味であるのかを理解するのに役立ちます。

function get_post_type_capabilities( $args ) {
    if ( ! is_array( $args->capability_type ) )
        $args->capability_type = array( $args->capability_type, $args->capability_type . 's' );

    // Singular base for meta capabilities, plural base for primitive capabilities.
    list( $singular_base, $plural_base ) = $args->capability_type;

    $default_capabilities = array(
        // Meta capabilities
        'edit_post'          => 'edit_'         . $singular_base,
        'read_post'          => 'read_'         . $singular_base,
        'delete_post'        => 'delete_'       . $singular_base,
        // Primitive capabilities used outside of map_meta_cap():
        'edit_posts'         => 'edit_'         . $plural_base,
        'edit_others_posts'  => 'edit_others_'  . $plural_base,
        'publish_posts'      => 'publish_'      . $plural_base,
        'read_private_posts' => 'read_private_' . $plural_base,
    );

    // Primitive capabilities used within map_meta_cap():
    if ( $args->map_meta_cap ) {
        $default_capabilities_for_mapping = array(
            'read'                   => 'read',
            'delete_posts'           => 'delete_'           . $plural_base,
            'delete_private_posts'   => 'delete_private_'   . $plural_base,
            'delete_published_posts' => 'delete_published_' . $plural_base,
            'delete_others_posts'    => 'delete_others_'    . $plural_base,
            'edit_private_posts'     => 'edit_private_'     . $plural_base,
            'edit_published_posts'   => 'edit_published_'   . $plural_base,
        );
        $default_capabilities = array_merge( $default_capabilities, $default_capabilities_for_mapping );
    }

    $capabilities = array_merge( $default_capabilities, $args->capabilities );

    // Post creation capability simply maps to edit_posts by default:
    if ( ! isset( $capabilities['create_posts'] ) )
        $capabilities['create_posts'] = $capabilities['edit_posts'];

    // Remember meta capabilities for future reference.
    if ( $args->map_meta_cap )
        _post_type_meta_capabilities( $capabilities );

    return (object) $capabilities;
}

それをデバッグするより良い方法は次のフックです。

do_action( 'registered_post_type', $post_type, $args );

これを使用してください(登録後に正確に実行されます)。

add_action( 'registered_post_type', function( $cpt, $args )
{
    $cpt === 'your_cpt_name' && var_dump(
        $args->capability_type,
        $args->cap // result of get_post_type_capabilities()
    );
}, 10, 2 );

your_cpt_nameを登録時に最初の引数として使用した実際の名前に置き換えます。

また、ほとんどのユースケースでは、カスタム機能をチェックする必要はまったくありません。それらはそれがあるべきことを維持するのがはるかに困難です。代わりに、投稿タイプとデフォルトの機能をチェックすることをお勧めします。

1
kaiser