¿Cómo configurar capacidades individuales en una taxonomía? ¿O cómo volver a registrar una taxonomía existente?

2

La taxonomía por defecto, categoría. De forma predeterminada, solo aquellos con la capacidad edit_posts pueden asignar categorías durante la creación / edición posterior.

Tengo un rol con capacidades muy limitadas. Quiero permitir que los usuarios en este rol puedan asignar categorías durante la creación / edición del tipo de publicación personalizada, pero no puedo otorgarles la capacidad edit_posts y no deberían poder editar la taxonomía, solo asignarla.

¿Cómo puedo hacer esto? Establecer 'assign_terms' => 'read' es una opción, pero ¿cómo puedo configurar ese valor sin tener que volver a registrar la taxonomía?

O alternativamente, ¿cómo puedo otorgar a mi rol de bajo nivel permiso para asignar la taxonomía?

    
pregunta sker 29.07.2013 - 16:37

3 respuestas

3

Esto debería funcionar

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,
  ) );
}
    
respondido por el gmazzap 29.07.2013 - 19:45
1

Acabo de encontrar esta pregunta y, aunque podría funcionar, no estaba satisfecho con la solución. Tenía que haber una mejor manera de hacerlo, sin volver a registrar la taxonomía. Y hay una solución mejor, ahora la estoy usando en mi complemento CPT.

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

En este ejemplo, configuro la capacidad assign_terms para el tipo de publicación personalizada cpt_item a la capacidad personalizada edit_cpt_items que permite a cualquier usuario con esta capacidad asignar categorías al CPT.

Espero que esta solución más limpia también funcione para usted.

    
respondido por el 2ndkauboy 05.11.2014 - 15:02
0

También puede filtrar los argumentos de la categoría del núcleo antes de registrar la taxonomía:

<?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 );
    
respondido por el James 10.12.2015 - 15:22

Lea otras preguntas en las etiquetas