Cómo restringir una página [sin plugin]
Cómo restringir una página en WordPress. Por ejemplo: un usuario [sin iniciar sesión] puede ver 5 juegos de la lista. [ejemplo.com/juegos/] y después de hacer clic en 'ver más', el usuario debe registrarse/iniciar sesión y después de eso, el usuario puede acceder a la lista completa de 100 juegos. [ejemplo.com/juegos/]
¿Alguien sabe cómo hacer esto sin plugins? Gracias.

Puedes hacer esto fácilmente con un shortcode. Engánchate a init
y añade el shortcode en tu función enganchada.
<?php
add_action('init', 'wpse57819_add_shortcode');
/**
* Añade el shortcode
*
* @uses add_shortcode
* @return null
*/
function wpse57819_add_shortcode()
{
add_shortcode('restricted', 'wpse57819_shortcode_cb');
}
Luego, en tu función de callback, puedes verificar si el usuario ha iniciado sesión. Si es así, muéstrale el contenido. Si no, muéstrale un mensaje de inicio de sesión. Puedes hacer literalmente lo que quieras aquí: verificar capacidades del usuario para mostrarles el contenido (diferentes "niveles de membresía"), mostrarles un formulario de inicio de sesión completo. Un ejemplo simple:
<?php
/**
* Función de callback para el shortcode. Verifica si un usuario ha iniciado sesión. Si es así,
* muestra el contenido. Si no, muestra un enlace al formulario de inicio de sesión.
*
* @return string
*/
function wpse57819_shortcode_cb($args, $content=null)
{
// si el usuario ha iniciado sesión, simplemente muéstrale el contenido. También podrías verificar
// roles y capacidades aquí si lo deseas
if(is_user_logged_in())
return $content;
// Si llegamos aquí, no han iniciado sesión, muéstrales un mensaje
$defaults = array(
// mensaje mostrado a usuarios no logueados
'msg' => __('Debes iniciar sesión para ver este contenido.', 'wpse57819'),
// enlace a la página de inicio de sesión
'link' => site_url('wp-login.php'),
// texto del enlace de inicio de sesión
'anchor' => __('Iniciar sesión.', 'wpse57819')
);
$args = wp_parse_args($args, $defaults);
$msg = sprintf(
'<aside class="login-warning">%s <a href="%s">%s</a></aside>',
esc_html($args['msg']),
esc_url($args['link']),
esc_html($args['anchor'])
);
return $msg;
}
Como un plugin.
Uso
En algún lugar de tus páginas/entradas:
[restricted]
Contenido solo para miembros aquí
[/restricted]

Puedes colocar el código anterior en tu archivo functions.php (sin las etiquetas de apertura <?php
). Ejemplo de uso añadido a la respuesta.

No está en código php, el [restricted]
es un shortcode: http://codex.wordpress.org/Shortcode_API

@Davis: Lo siento, pero no funciona en mi sintaxis. [restricted] <a href="sample.com">Sample</a> [/restricted] ¿Qué está mal? gracias

@Davis: Lo siento, pero ¿se podría poner este código en cualquier archivo php que no sea en una publicación? En mi caso no funcionó
<?
php code
[restricted]
php code
[/restricted]
php code
?>
Gracias

Si quieres hacerlo directamente en un archivo php, simplemente usa el condicional is_user_logged_in
directamente.

Tengo una página con shortcodes. Solo muestra los nombres de los shortcodes... Lo hice así [restricted] [my-shortcode] [/restricted]. pero solo muestra "[my-shortcodes]" como texto. no el shortcode real. Así que lo cambié a..." return do_shortcode($content);" y ahora se muestra bien. ¿Estoy haciéndolo correctamente? ¿Cuál es la diferencia?

Puede ser útil un shortcode personalizado Mira este plugin http://wordpress.org/extend/plugins/restrictedarea Está obsoleto pero puedes usar el código para tu propósito

Primero necesitas agregar un meta box personalizado que te permita marcar la publicación como oculta.
Para más detalles haz clic en el enlace original de esta fuente
Modifiqué esta función para cumplir con tus necesidades
add_action( 'pre_get_posts', 'yourtextdomain_pre_get_posts_hidden', 9999 );
function yourtextdomain_pre_get_posts_hidden( $query )
{
// Verifica si es en el frontend y la consulta principal.
if( ! is_admin() && $query->is_main_query() )
{
if( ! is_user_logged_in() )
{
// Para las publicaciones que queremos excluir.
$exclude = array();
// Localiza nuestras publicaciones marcadas como ocultas.
$hidden = get_posts(array(
'post_type' => 'post',
'meta_query' => array(
array(
'key' => 'meta-box-checkbox',
'value' => 'true',
'compare' => '==',
),
)
));
// Crea un arreglo de publicaciones ocultas.
foreach($hidden as $hide)
{
$exclude[] = $hide->ID;
}
// Excluye las publicaciones ocultas.
$query->set('post__not_in', $exclude);
}
}
}
