Agregar rol que restringe al usuario para publicar en una categoría específica

4

Estoy intentando crear un rol que restringe la capacidad de publicar en una categoría específica, ocultando el otro de la casilla de verificación.

No quiero usar complementos. Estoy buscando un fragmento para poner en funciones.php. Revisé todas las preguntas / publicaciones de blog acerca de esto y ninguna solución funcionó.

Creo que este es el punto de partida ...

   <?php
    $result = add_role( 'category_restricted', 'Restricted to specific cat', array(
        'read' => true,
        'edit_posts' => true,
        'delete_posts' => false,
    ));

¿Puedes ayudarme?

    
pregunta MultiformeIngegno 08.12.2014 - 23:53

2 respuestas

-1

Puede usar el enlace get_terms para buscar todas las categorías y restringir el acceso a ellas por ID o por slug, si el usuario actual no es un administrador, o en este caso específico si el usuario no tiene el rol asignado por tú.

add_filter('get_terms', 'restrict_categories');
function restrict_categories($categories) { 
    $onPostPage = (strpos($_SERVER['PHP_SELF'], 'post.php') || strpos($_SERVER['PHP_SELF'], 'post-new.php')); // check if we are in the new/edit post page
    // if (is_admin() && $onPostPage && !current_user_can('level_10')) { // check for user capabilities - level_10 is admin
    if (is_admin() && $onPostPage && themename_check_user_role( 'category_restricted' )) { // check for user role
        $size = count($categories);
        for ($i = 0; $i < $size; $i++) {            
//          if ($categories[$i]->slug != 'category_slug')
            if ($categories[$i]->term_id != '1') // then restrict the categories by ID
                 unset($categories[$i]);
        }
    }

    return $categories;
}

Los créditos para el código van a: wptricks . Acabo de recordar que leí sobre esto hace un tiempo.

Edición posterior:

Puede intentar pasar un rol a la función current_user_can() , pero no se garantiza que funcione correctamente, en su lugar, puede usar la siguiente función para verificar los roles de los usuarios.

/**
 * Checks if a particular user has a role. 
 * Returns true if a match was found.
 *
 * @param string $role Role name.
 * @param int $user_id (Optional) The ID of a user. Defaults to the current user.
 * @return bool
 */
function themename_check_user_role( $role, $user_id = null ) {

    if ( is_numeric( $user_id ) )
    $user = get_userdata( $user_id );
    else
        $user = wp_get_current_user();

    if ( empty( $user ) )
    return false;

    return in_array( $role, (array) $user->roles );
}

// example use for the current user
if ( themename_check_user_role( 'customer' )
    _e( "You've got access!", 'themename' );
else
    _e( "Sorry, you don't have access!", 'themename' );

Y como nota al margen, es una buena idea incluir su función add_role en la activación del tema / complemento.

    
respondido por el George Grigorita 28.12.2014 - 00:57
-1

Cree un archivo de plantilla llamado not_allowed_user.php y luego agregue el siguiente código en function.php

add_filter('template_include', 'restrict_by_category');

function check_user() {
  $user = wp_get_current_user();
  if ( ! $user->ID || in_array('subscriber', $user->roles) ) {
    // user is not logged or is a subscriber
    return false;
  }
  return true;
}

function restrict_by_category( $template ) {
  if ( ! is_main_query() ) return $template; // only affect main query.
  $allow = true;
  $private_categories = array('cat_1', 'cat_2', 'cat_3'); // categories subscribers cannot see
  if ( is_single() ) {
    $cats = wp_get_object_terms( get_queried_object()->ID, 'category', array('fields' => 'slugs') ); // get the categories associated to the required post
    if ( array_intersect( $private_categories, $cats ) ) {
      // post has a reserved category, let's check user
      $allow = check_user();
    }
  } elseif ( is_tax('category', $private_categories) ) {
    // the archive for one of private categories is required, let's check user
    $allow = check_user();
  }
  // if allowed include the required template, otherwise include the 'not-allowed' one
  return $allow ? $template : get_template_directory() . '/not_allowed_user.php';
}

Sé que no desea utilizar el complemento, pero en caso de que desee utilizar el complemento, este es el mejor complemento: Restringir Categorías

    
respondido por el jay.jivani 21.12.2014 - 11:31

Lea otras preguntas en las etiquetas