Adicionar função que restringe o usuário a postar em categoria específica

4

Estou tentando criar uma função que restrinja a capacidade de postar em uma categoria específica, ocultando a outra da caixa de seleção.

Eu não quero usar plugins. Eu estou procurando um trecho para colocar em functions.php. Eu verifiquei todas as perguntas / posts sobre isso e nenhuma solução funcionou.

Acho que este é o ponto de partida ...

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

Você pode me ajudar?

    
por MultiformeIngegno 08.12.2014 / 23:53

2 respostas

-1

Você pode usar o gancho get_terms para localizar todas as categorias e restringir o acesso a elas por ID ou slug, se o usuário atual não for um administrador ou, neste caso específico, se o usuário não tiver a função atribuída por você.

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

Créditos do código vão para: wptricks . Acabei de me lembrar que li sobre isso há algum tempo.

Edição posterior:

Você pode tentar passar um papel para a função current_user_can() , mas não é garantido que funcione corretamente, em vez disso, você pode usar a função abaixo para verificar as funções do usuário.

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

E, como observação, é uma boa ideia incluir sua função add_role na ativação do tema / plug-in.

    
por George Grigorita 28.12.2014 / 00:57
-1

Crie um arquivo de modelo chamado not_allowed_user.php e adicione o código abaixo em 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';
}

Eu sei que você não quer usar o plugin, mas se você quiser usar o plugin, então este é o melhor plugin: Restringir Categorias

    
por jay.jivani 21.12.2014 / 11:31