web-dev-qa-db-fra.com

current_user_can () retourne FALSE mais le débogage dit TRUE

CONTEXTE

J'ai créé un plugin incontournable dans lequel je conserve des fonctions générales. Comme register_post_type ().

Ici, j'ai créé plusieurs types de publication personnalisés. Avec l’aide de plusieurs très bons messages, j’ai réussi à maîtriser Capability for Custom Post Types (je pense).

////////////////
//
// 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');

PROBLÈME Avant de modifier un message personnalisé 'pms', je recherche current_user_can ('edit_pms')

1) Le rôle par défaut 'éditeur' renvoie VRAI 2) Le rôle personnalisé 'employé' (ci-dessus) renvoie FAUX

Utilisez $ GLOBALS ['wp_post_types'] pour déboguer la capacité sur le type de publication personnalisé 'pms' et get_userdata () pour déboguer la capacité pour un utilisateur doté du rôle employé. Ils ont tous deux les bonnes capacités.

QUESTION Toute idée (2) ci-dessus retourne-t-elle FALSE?

SOURCES

https://codex.wordpress.org/Function_Reference/register_post_typehttp://justintadlock.com/archives/ 2010/07/10/meta -bility-for-custom-post-types

1
Coloumbo

La fonction register_post_type() prend un nom de type de publication comme argument pour map_meta_cap, où la valeur par défaut est post. Jetez un coup d'œil aux éléments internes de get_post_type_capabilities() pour en savoir plus. Cela devrait vous aider à comprendre comment cela est censé être:

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;
}

Un meilleur moyen de déboguer est le hook suivant:

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

Utilisez-le comme ceci (il fonctionne exactement après l'enregistrement):

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 );

Remplacez your_cpt_name par votre nom actuel que vous avez utilisé comme 1er argument lors de l'enregistrement.

N'oubliez pas non plus que dans la plupart des cas d'utilisation, il est absolument inutile de vérifier les fonctionnalités personnalisées. Celles-ci sont beaucoup plus difficiles à maintenir que cela devrait être. Je préfère vérifier par rapport au type de publication et à une fonctionnalité par défaut.

1
kaiser