Limitando o número de usuários

3

Eu queria saber se existe uma maneira de realmente limitar a quantidade de usuários que podem se registrar em um site do Wordpress?

Como exemplo, estou querendo criar um site pequeno que contenha informações para um cliente, onde eles podem ter no máximo (por exemplo) 50 usuários. A ideia é que você precise efetuar login para visualizar o site e apenas uma quantidade definida de usuários possa ser criada. Talvez alguém saiba de um plugin que possa fazer isso?

    
por Craig Jones 14.08.2013 / 14:51

3 respostas

4

Como você pode ver na Referência de opção do WordPress , há uma opção chamada users_can_register . Você pode - por padrão - configurá-lo em suas configurações de sites (de rede).

  • 1 = > Sim
  • 0 = > Não

Como de costume: há um filtro para interceptar isso de um plug-in.

"option_{$option_name}"

Para que você possa anexar um retorno de chamada a esse filtro e verificar a quantidade de usuários com um WP_User_Query para o get_current_blog_id() .

<?php

namespace WPSE;
/** Plugin Name: WPSE (#110036) Limit Total Users per page */
defined( 'ABSPATH' ) or exit;

\add_filter( 'option_users_can_register', 'limit_total_users' );
function limit_total_users( $option )
{
    // Nothing to do here
    if ( 0 === $option )
        return $option;

    static $users = null;
    $limit = 50;

    if ( null === $users )
    {
        $users_query = new \WP_User_Query( array(
            'blog_id' => get_current_blog_id()
        ) );
        $users = $users_query->get_total();
    }

    // Abort if we're above the limit
    if ( $limit > $users )
        return 0;

    return $option;
}

O bom deste mini plugin é que ele não faz uma consulta adicional se o registro já estiver desativado.

    
por kaiser 14.08.2013 / 15:32
3

Piggybacking off resposta do Kaiser:

add_filter( 'option_users_can_register', 'limit_total_users' );
function limit_total_users( $option )
{
    // Registration turned off manually. Nothing to do here.
    if ( 0 === $option )
        return $option;

    $user_count = count_users();

    // Abort if we're above the limit
    if ( $user_count['total_users'] > 50 ) {
        return 0;
    } 

    // The threshold wasn't reached yet.
    return $option;
}

Um pouco interessante de informações sobre essa função count_users() é que ela retorna um array com uma contagem para cada função. Talvez você queira identificar qual função está limitando ou simplesmente adicionar / subtrair para explicar a diferença, por exemplo, no número de administradores, pois talvez você não queira se contar no total.

    
por GhostToast 14.08.2013 / 15:47
2

Esta solução difere das outras em que o trabalho principal é feito no registro do usuário. Depois que um usuário se registra, o total de usuários é contado e a opção users_can_register é atualizada, se necessário. Essa parece ser a melhor maneira de minimizar o tempo de processamento do front-end. Uma função relacionada conectada a pre_option_users_can_register impede que os administradores do blog trapacem, alternando a opção em "Configurações gerais" e obtendo assim um usuário extra. Tecnicamente, apenas essa função é necessária, mas expliquei as razões para a outra função.

function count_reg_users_wpse_110036() {
  global $wpdb;
  $users = $wpdb->get_var("SELECT COUNT(ID) FROM {$wpdb->users}");
  return $users;
}

function limit_users_wpse_110036() {
  $count = apply_filters('limit_user_count',4);
  $users = count_reg_users_wpse_110036();
  if ($users >= $count) {
    update_option('users_can_register',0);
  }
}
add_action('user_register','limit_users_wpse_110036');

function limit_user_option_wpse_110036($option) {
  remove_filter('pre_option_users_can_register','limit_user_option_wpse_110036');
  $reg = get_option('users_can_register');
  if (0 === $reg) {
    return 0;
  }
  $count = apply_filters('limit_user_count',4);
  $users = count_reg_users_wpse_110036();
  if ($users >= $count) {
    update_option('users_can_register',0);
    return 0;
  } else {
    return $option;
  }
}
add_filter('pre_option_users_can_register','limit_user_option_wpse_110036');
    
por s_ha_dum 14.08.2013 / 16:09

Tags