Ulzurrun de Asanza i Sàez

Artículos sólo para usuarios registrados en WordPress (Mejorado)

Ayer modifiqué un poco el script de AyudaWordPress, pero se quedó medio cojo: los artículos salían en el Feed y en el loop de WordPress, así que realmente no cumplía del todo su objetivo. Sin embargo lo he actualizado y he solventado ambas carencias, ahora funciona perfectamente. Y el uso es idéntico: se crea un artículo y se le añade el campo personalizado “login” con el valor “1” para que se oculte.

El código se debe añadir en el archivo functions.php del theme.

[php]
// Nuestra funcion para forzar el inicio de sesion
function forzar_login()
{

if (is_single())
{

global $post; // Obtenemos la informacion respecto al articulo actual

if (get_post_meta($post->ID, ‘login’, true) == ‘1’) // Comprobamos el valor del campo personalizado login
{
// Para ver este articulo tiene que estar registrado
if (!is_user_logged_in()) // Comprobamos si el usuario ha iniciado sesion
{
// No ha iniciado sesion, redirigimos
auth_redirect();
}
else
{
// Ha iniciado sesion, luego puede ver el articulo
}
}
else
{
// Puede ver este articulo tranquilamente porque no esta bloqueado
}

}
else
{
global $wp_query; // Obtenemos la consulta
$wp_query->query_vars[‘meta_key’] = ‘login’; // Modificamos la nueva consulta para buscar articulos con proteccion

$posts_a_excluir = array(); // En esta matriz almacenamos los articulos a ocultar

while ($wp_query->have_posts()) : $wp_query->the_post();
if (get_post_meta($wp_query->post->ID, ‘login’, true) == ‘1’) // Comprobamos el valor del campo personalizado login
{
// El articulo es solo para registrados, lo guardamos
$posts_a_excluir[] = $wp_query->post->ID;
}
endwhile;

$wp_query->query_vars[‘meta_key’] = ”; // Limpiamos modificaciones

if (!is_user_logged_in()) $wp_query->query_vars[‘post__not_in’] = $posts_a_excluir; // Excluimos los articulos que se deben ocultar, solo si no ha iniciado sesion
$wp_query->query($wp_query->query_vars); // Repetimos la consulta
return;
}
}
add_action(‘wp’, ‘forzar_login’); // Añadimos la funcion a la accion
[/php]

Como antes, el archivo listo para ser usado como plugin lo podéis descargar aquí.


11 replies on “Artículos sólo para usuarios registrados en WordPress (Mejorado)

  1. Puede ser de útil a alguien, aunque para querer que se registren usuarios en WordPress tendrían que tener algún tipo de añadido más que no sólo ver posts, porque no creo que el administrador gane nada con eso. :)

    1. Hombre, no sé que utilidad le darán los administradores, yo desde luego no le he dado ninguna: todos los artículos de Sumolari.com están abiertos a cualquiera.

      Lo que sí es cierto es que es una función que no costaría mucho de añadir, a mí me ha costado 50 líneas, y seguro que los desarrolladores de WordPress lo pueden reducir a 10, y que les puede ser de utilidad a algunos, supongo.

  2. saludos! interesante. busco esto para una página que pediré registro, pero no para post sinó que para PAGINA. lo hay amigo? de ante mano saludos!

    1. No lo he probado, pero creo que si en la línea 5 cambiases el código por:

      [php]
      if (is_singular())
      [/php]

      Aunque no estoy del todo seguro de que funcione. Pruébalo en un servidor de pruebas antes de ponerlo en un sitio activo.

  3. Tengo un problema, al activarlo se deja de visualizar las paginas del Blog, a alguien le pasa lo mismo.

    Saludos !!!

    1. Pues la verdad es que no sé a qué se debe. ¿Puedes ver las páginas cuando has iniciado sesión? ¿Tienen esas páginas el campo personalizado "login" establecido en 1?

  4. El plugin trabaja bien pero una vez activado las páginas, (no Entradas) dejan de verse.
    La verdad no se porque pasa y me interesa muchisimo usarlo porque es el mas sencillo y simple que he encontrado.
    Ojala puedas ayudarme.

    Gracias

    1. ¿Pero dejan de verlas todos los usuarios o sólo los que no han iniciado sesión?

      No sé hasta que punto valdrá, pero prueba con esta versión modificada del código:

      [php]
      // Nuestra funcion para forzar el inicio de sesion
      function forzar_login()
      {

      if (is_single())
      {

      global $post; // Obtenemos la informacion respecto al articulo actual

      if (get_post_meta($post->ID, 'login', true) == '1') // Comprobamos el valor del campo personalizado login
      {
      // Para ver este articulo tiene que estar registrado
      if (!is_user_logged_in()) // Comprobamos si el usuario ha iniciado sesion
      {
      // No ha iniciado sesion, redirigimos
      auth_redirect();
      }
      else
      {
      // Ha iniciado sesion, luego puede ver el articulo
      }
      }
      else
      {
      // Puede ver este articulo tranquilamente porque no esta bloqueado
      }

      }
      elseif (!is_page())
      {
      global $wp_query; // Obtenemos la consulta
      $wp_query->query_vars['meta_key'] = 'login'; // Modificamos la nueva consulta para buscar articulos con proteccion

      $posts_a_excluir = array(); // En esta matriz almacenamos los articulos a ocultar

      while ($wp_query->have_posts()) : $wp_query->the_post();
      if (get_post_meta($wp_query->post->ID, 'login', true) == '1') // Comprobamos el valor del campo personalizado login
      {
      // El articulo es solo para registrados, lo guardamos
      $posts_a_excluir[] = $wp_query->post->ID;
      }
      endwhile;

      $wp_query->query_vars['meta_key'] = ''; // Limpiamos modificaciones

      if (!is_user_logged_in()) $wp_query->query_vars['post__not_in'] = $posts_a_excluir; // Excluimos los articulos que se deben ocultar, solo si no ha iniciado sesion
      $wp_query->query($wp_query->query_vars); // Repetimos la consulta
      return;
      }
      }
      add_action('wp', 'forzar_login'); // Añadimos la funcion a la accion
      [/php]

  5. A mi me pasa lo contrario que a juamarti; con las entradas todo está perfecto pero en las páginas me desaparece el contenido. Esto me pasa con ambos casos de usuarios(con inicio y sin inicio de sesión) Ojalá me puedas ayudar.

  6. Últimamente he estado buscando algo similar a lo que ofrecía este script pero para bloquear toda la web entera, no sólo ciertos artículos.

    El plugin se llama WordPress Access Control y la verdad es que funciona perfectamente.

    Este script es de hace más de un año y está desactualizado, así que yo le daría una oportunidad a este plugin.

  7. Mil gracias por la info!!! me has quitado un dolor de cabeza ;)

Leave a Reply

Your email address will not be published.

Required fields are marked *

Your avatar