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

Beware: This post was published 7 years ago and its content may be outdated.

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.

	// 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

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