Funktionen und benutzerdefinierte Beitragstypen
4 Antworten
- Stimmen
-
- 2013-07-30
Nacheinem kurzen Chatmit Magicroundabout ,der aufeine nützliche Ressource von Justin Tadlock ,it Es stellt sich heraus,dass Funktionenfürbenutzerdefinierte Beitragstypennur vorhanden sind,wenn Sie der Rolle add_cap verwenden,z. B.für denfolgendenbenutzerdefinierten Beitragstyp:
add_action( 'init', 'register_cpt_gallery' ); function register_cpt_gallery() { $labels = array( 'name' => __( 'Galleries', 'gallery' ), 'singular_name' => __( 'Gallery', 'gallery' ), 'add_new' => __( 'Add New', 'gallery' ), 'add_new_item' => __( 'Add New Gallery', 'gallery' ), 'edit_item' => __( 'Edit Gallery', 'gallery' ), 'new_item' => __( 'New Gallery', 'gallery' ), 'view_item' => __( 'View Gallery', 'gallery' ), 'search_items' => __( 'Search Galleries', 'gallery' ), 'not_found' => __( 'No galleries found', 'gallery' ), 'not_found_in_trash' => __( 'No galleries found in Trash', 'gallery' ), 'parent_item_colon' => __( 'Parent Gallery:', 'gallery' ), 'menu_name' => __( 'Galleries', 'gallery' ), ); $args = array( 'labels' => $labels, 'hierarchical' => true, 'description' => 'Image galleries for teachers classes', 'supports' => array( 'title', 'editor', 'author'), 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png', 'show_in_nav_menus' => true, 'publicly_queryable' => true, 'exclude_from_search' => false, 'has_archive' => true, 'query_var' => true, 'can_export' => true, 'rewrite' => true, 'capabilities' => array( 'edit_post' => 'edit_gallery', 'edit_posts' => 'edit_galleries', 'edit_others_posts' => 'edit_other_galleries', 'publish_posts' => 'publish_galleries', 'read_post' => 'read_gallery', 'read_private_posts' => 'read_private_galleries', 'delete_post' => 'delete_gallery' ), // as pointed out by iEmanuele, adding map_meta_cap will map the meta correctly 'map_meta_cap' => true ); register_post_type( 'gallery', $args ); }
Die zusätzlichen Funktionen sollteneiner Rolle hinzugefügt werden,damit die Berechtigungentatsächlichim Backendfunktionieren,einschließlich des Administrators - zum Beispiel:
function add_theme_caps() { // gets the administrator role $admins = get_role( 'administrator' ); $admins->add_cap( 'edit_gallery' ); $admins->add_cap( 'edit_galleries' ); $admins->add_cap( 'edit_other_galleries' ); $admins->add_cap( 'publish_galleries' ); $admins->add_cap( 'read_gallery' ); $admins->add_cap( 'read_private_galleries' ); $admins->add_cap( 'delete_gallery' ); } add_action( 'admin_init', 'add_theme_caps');
Ich hoffe,dass diesfür anderenützlichist.
Zusätzlicherwartet die Übersetzungsfunktion
_x()
,dass das zweite Argumentstring $context
ist,waseine kurze Beschreibungist,und das dritte Argumentstring $domain
. Wenn Sie keine Beschreibung angeben,verwenden Sie stattdessen die Übersetzungsfunktion__()
,die als zweites Argument diestring $domain
enthält.After a quick chat with Magicroundabout who pointed out a useful resource from Justin Tadlock, it turns out that capabilities for custom post types don't actually exist unless you use add_cap to the role, for example for the following custom post type:
add_action( 'init', 'register_cpt_gallery' ); function register_cpt_gallery() { $labels = array( 'name' => __( 'Galleries', 'gallery' ), 'singular_name' => __( 'Gallery', 'gallery' ), 'add_new' => __( 'Add New', 'gallery' ), 'add_new_item' => __( 'Add New Gallery', 'gallery' ), 'edit_item' => __( 'Edit Gallery', 'gallery' ), 'new_item' => __( 'New Gallery', 'gallery' ), 'view_item' => __( 'View Gallery', 'gallery' ), 'search_items' => __( 'Search Galleries', 'gallery' ), 'not_found' => __( 'No galleries found', 'gallery' ), 'not_found_in_trash' => __( 'No galleries found in Trash', 'gallery' ), 'parent_item_colon' => __( 'Parent Gallery:', 'gallery' ), 'menu_name' => __( 'Galleries', 'gallery' ), ); $args = array( 'labels' => $labels, 'hierarchical' => true, 'description' => 'Image galleries for teachers classes', 'supports' => array( 'title', 'editor', 'author'), 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png', 'show_in_nav_menus' => true, 'publicly_queryable' => true, 'exclude_from_search' => false, 'has_archive' => true, 'query_var' => true, 'can_export' => true, 'rewrite' => true, 'capabilities' => array( 'edit_post' => 'edit_gallery', 'edit_posts' => 'edit_galleries', 'edit_others_posts' => 'edit_other_galleries', 'publish_posts' => 'publish_galleries', 'read_post' => 'read_gallery', 'read_private_posts' => 'read_private_galleries', 'delete_post' => 'delete_gallery' ), // as pointed out by iEmanuele, adding map_meta_cap will map the meta correctly 'map_meta_cap' => true ); register_post_type( 'gallery', $args ); }
The additional capabilities should be added to a role for the permissions to actually work in the backend, including the 'administrator' - for example:
function add_theme_caps() { // gets the administrator role $admins = get_role( 'administrator' ); $admins->add_cap( 'edit_gallery' ); $admins->add_cap( 'edit_galleries' ); $admins->add_cap( 'edit_other_galleries' ); $admins->add_cap( 'publish_galleries' ); $admins->add_cap( 'read_gallery' ); $admins->add_cap( 'read_private_galleries' ); $admins->add_cap( 'delete_gallery' ); } add_action( 'admin_init', 'add_theme_caps');
I hope this is useful to others.
Additionally, the
_x()
translation function expects the second argument to bestring $context
, which is a short description, and the third to bestring $domain
. When not providing a description, use the__()
translation function instead which has thestring $domain
as the second argument.-
`add_theme_caps ()` solltenureinmal aufgerufen werden,nichtjedes Mal,wenneine Administrationsseitegeladen wird.Esistbesser,`switch_theme` als Hookfür die Theme-Aktivierung oder` register_activation_hook`bei der Plugin-Aktivierung zu verwenden.`add_theme_caps()` should be called one time only, not everytime an admin page is loaded. It would be better to use `switch_theme` as hook for theme activation or `register_activation_hook` on plugin activation.
- 14
- 2015-04-13
- d79
-
Nett!Ich verwendegerne wp cli,um die Funktionen hinzuzufügen,wennes sich umeine vollständigbenutzerdefinierte/eindeutige Site handelt,daes sich umeine Aktion handelt,dienureinmal ausgeführt werdenmuss.Nice! I like to use wp cli to add the capabilities if it's a completely custom/unique site since it's an action that only needs to happen once.
- 0
- 2017-12-01
- squarecandy
-
-
- 2013-07-30
IMHO ordnen Sieniemals Ihreeigenen Fähigkeiten zu. Stellen Sie sicher,dass Sie dazu das Map Meta Cap Plugin verwenden. http://codex.wordpress.org/Function_Reference/map_meta_cap
Ich habetagelang versucht,meine benutzerdefinierten Kappenmanuellmit Code zuzuordnen. Installieren Sieeinfach dieses Plugin,ordnen Sie Ihre Kappen zu und deaktivieren Siees,sobaldesfunktioniert. Wenn Siebenutzerdefinierte Rollenerstellen,benötigen Sie das Plugin Mitglieder .
Die Art und Weise,wieichteste,um sicherzustellen,dassmeine Rolle über diese Funktionen verfügt (manchmal schwören Sie,dass Sie diestun,abernicht wirklich),erstellteine Debugging-Seitemit:
if( !function_exists( 'current_user_has_role' ) ){ function current_user_has_role( $role ){ $current_user = new WP_User( wp_get_current_user()->ID ); $user_roles = $current_user->roles; $is_or_not = in_array( $role, $user_roles ); return $is_or_not; } }
Dies zeigt Ihnen,über welche Funktionen Sietatsächlich verfügen.
IMHO you never map your own capabilities. Make sure to use map meta cap plugin to do so. http://codex.wordpress.org/Function_Reference/map_meta_cap
I spent days trying to map my custom caps manually with code. Just install that plugin, map your caps and deactivate once working. If creating custom roles you WILL need Members plugin.
The way I test to MAKE sure my role has those capabilites (sometimes you swear you do but don't actually) make a debugging page with:
if( !function_exists( 'current_user_has_role' ) ){ function current_user_has_role( $role ){ $current_user = new WP_User( wp_get_current_user()->ID ); $user_roles = $current_user->roles; $is_or_not = in_array( $role, $user_roles ); return $is_or_not; } }
This will show you which capabilities you do in fact have.
-
- 2019-04-20
Fürbenutzerdefinierte Beitragstypenempfehleich NICHT die Verwendung von hook:
add_action( 'registered_post_type', 'your_func', 10, 2 );
stattdessen schlageich vor:
add_filter( 'register_post_type_args', 'your_func', 10, 2 ); function your_func( $args, $name ) { if ( $name == "your_custom_post_name" ) ... }
For Custom Post Types, I DON'T suggest using hook:
add_action( 'registered_post_type', 'your_func', 10, 2 );
instead I suggest using:
add_filter( 'register_post_type_args', 'your_func', 10, 2 ); function your_func( $args, $name ) { if ( $name == "your_custom_post_name" ) ... }
-
Der Vorschlagistgut,abererbeantwortet die Fragenicht.the suggestion is a good one, but it does not answer the question.
- 0
- 2019-11-11
- Aurovrata
Ich habeeinen benutzerdefinierten Beitragstyp,denich aufbestimmte Rollenbeschränkenmöchte. Ich habejedochbereits Inhaltemit dembenutzerdefinierten Beitragstyp hinzugefügt undmuss siejetzteinschränken. Der Fähigkeitstyp war 'post'
Wasistin Ordnung,da der Inhaltim Backend angezeigt wird,sobaldich Funktionen hinzufüge,verschwindet der Inhalt aus dem Backend?
Ich habe versucht,den Fähigkeitstyp so anzupassen,dassermehrere Definitionenenthält,ummeine eigenen zuerstellen,aber sobaldich Fähigkeitstypenentferne oder ändere,ister weg!
vollständiger Code:
Ich habe dies auchmit einem völligneuenbenutzerdefinierten Beitragstypgetestet. Unabhängig vom Funktionstyptritt dasgleiche Problem auf,z. B. selbst wennichesentferne undmein benutzerdefiniertes hinzufüge: