current_user_can () gibt FALSE zurück, aber Debugging sagt TRUE

HINTERGRUND

Ich habe ein Must-Use-Plugin erstellt, in dem ich allgemeine functionen behalte. Wie register_post_type ().

Hier habe ich mehrere benutzerdefinierte Post-Typen erstellt. Mit Hilfe einiger wirklich guter Beiträge habe ich es geschafft, die Fähigkeit für benutzerdefinierte Beitragstypen in den Griff zu bekommen (glaube ich).

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

PROBLEM Vor der Bearbeitung eines benutzerdefinierten Posts ‘pms’ suche ich nach current_user_can (‘edit_pms’)

1) Standardrolle ‘editor’ liefert TRUE 2) Benutzerdefinierte Rolle ’employee’ (oben) gibt FALSE zurück

Verwenden Sie $ GLOBALS [‘wp_post_types’], um die Debugfunktion für den benutzerdefinierten Posttyp ‘pms’ und get_userdata () für die Debugfunktion eines Benutzers mit der Mitarbeiterrolle zu testen. Sie kommen beide mit den richtigen Fähigkeiten heraus.

FRAGE Eine Idee wie oben (2) gibt FALSE zurück?

Quellen

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

Solutions Collecting From Web of "current_user_can () gibt FALSE zurück, aber Debugging sagt TRUE"

Die function register_post_type() verwendet einen Post-Typ-Namen als Argument für map_meta_cap , wobei der Standardwert post . get_post_type_capabilities() Sie einen Blick auf die Interna von get_post_type_capabilities() für erweiterte Einblicke. Das sollte dir helfen zu verstehen, wie es sein soll:

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

Eine bessere Möglichkeit zum Debuggen ist der folgende Hook:

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

Verwenden Sie es so (es läuft genau nach der Registrierung):

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

Ersetzen Sie your_cpt_name durch Ihren tatsächlichen Namen, den Sie während der Registrierung als 1. your_cpt_name verwendet haben.

Bedenken Sie auch, dass es für die meisten Anwendungsfälle völlig überflüssig ist, die benutzerdefinierten functionen zu überprüfen. Das ist viel schwieriger zu behaupten, dass es sein sollte. Ich bevorzuge es, stattdessen den Post-Typ und eine Standardfunktion zu überprüfen.