it-swarm.com.de

Wie lege ich individuelle Fähigkeiten für eine Taxonomie fest? Oder wie man eine bestehende Taxonomie neu registriert?

Die Standardtaxonomie, Kategorie. Standardmäßig können nur Benutzer mit der Funktion edit_posts während der Nacherstellung/-bearbeitung Kategorien zuweisen.

Ich habe eine Rolle mit sehr begrenzten Fähigkeiten. Ich möchte Benutzern in dieser Rolle die Möglichkeit geben, Kategorien während der Erstellung/Bearbeitung von benutzerdefinierten Posts zuzuweisen. Ich kann ihnen jedoch nicht die Funktion edit_posts erteilen, und sie sollten die Taxonomie nicht bearbeiten, sondern nur zuweisen können.

Wie kann ich das machen? Das Festlegen von 'assign_terms' => 'read' ist eine Option, aber wie kann ich diesen Wert festlegen, ohne die Taxonomie neu registrieren zu müssen?

Oder wie kann ich meiner untergeordneten Rolle die Berechtigung zum Zuweisen der Taxonomie erteilen?

2
sker

Das sollte funktionieren

add_action( 'init', 'register_category_again', 1 );

function register_category_again() {
  $user = wp_get_current_user();
  if ( $user->roles[0] != 'your_custom_role' ) return;
  global $wp_taxonomies;
  unset( $wp_taxonomies['category'] );
  global $wp_rewrite;
  $rewrite = array(
    'hierarchical' => true,
    'slug' => get_option('category_base') ? get_option('category_base') : 'category',
    'with_front' => ! get_option('category_base') || $wp_rewrite->using_index_permalinks(),
    'ep_mask' => EP_CATEGORIES,
  );
  register_taxonomy( 'category', 'post', array(
    'hierarchical' => true,
    'query_var' => 'category_name',
    'rewrite' => $rewrite,
    'public' => true,
    'capabilities' => array(
      'manage_terms'=> 'manage_categories',
      'edit_terms'=> 'manage_categories',
      'delete_terms'=> 'manage_categories',
      'assign_terms' => 'read'
    ),
    'show_ui' => true,
    'show_admin_column' => true,
    '_builtin' => true,
  ) );
}
3
gmazzap

Ich habe gerade diese Frage gefunden und obwohl es funktionieren könnte, war ich mit der Lösung nicht zufrieden. Es musste einen besseren Weg geben, ohne die Taxonomie erneut zu registrieren. Und es gibt eine bessere Lösung, die ich jetzt in meinem CPT-Plugin verwende.

public function wpse_108219_set_taxonomy_caps( $taxonomy, $object_type, $args ) {
    global $wp_taxonomies;

    if ( 'category' == $taxonomy && 'cpt_item' == $object_type ) {
        $wp_taxonomies[ $taxonomy ]->cap->assign_terms = 'edit_cpt_items';
    }

}

add_filter( 'registered_taxonomy', 'wpse_108219_set_taxonomy_caps' ), 10, 3 );

In diesem Beispiel habe ich die Funktion assign_terms für den benutzerdefinierten Beitragstyp cpt_item auf die benutzerdefinierte Funktion edit_cpt_items festgelegt, mit der jeder Benutzer mit dieser Funktion dem CPT Kategorien zuweisen kann.

Ich hoffe, dass diese sauberere Lösung auch für Sie funktioniert.

1
2ndkauboy

Sie können die Kategorieargs des Kerns auch filtern, bevor die Taxonomie registriert wird:

<?php
/*
 * Set the capabilities for the category taxonomy before it's registered.
 *
 * @param array  $args        Array of arguments for registering a taxonomy.
 * @param array  $object_type Array of names of object types for the taxonomy.
 * @param string $taxonomy    Taxonomy key.
 */
function wpse_108219_register_taxonomy_args( $args, $taxonomy, $object_type ) {

    if ( 'category' === $taxonomy ) {

        $args['capabilities'] = array(
            'manage_terms' => 'manage_categories',
            'edit_terms'   => 'manage_categories',
            'delete_terms' => 'manage_categories',
            'assign_terms' => 'read',
        );

    }

    return $args;
}

add_filter( 'register_taxonomy_args', 'wpse_108219_register_taxonomy_args', 10, 3 );
0
James