Cómo restringir una página [sin plugin]

8 jul 2012, 20:01:59
Vistas: 13.5K
Votos: 4

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.

3
Comentarios

-1 – Eso es territorio exclusivo de plugins.

fuxia fuxia
8 jul 2012 21:17:47

¿Por qué no quieres usar un plugin?

Sisir Sisir
8 jul 2012 21:20:18

Encontré un buen recurso para hacerlo: https://www.scratchcode.io/how-to-restrict-pages-or-posts-access-without-login-into-wordpress

Mayank Dudakiya Mayank Dudakiya
20 dic 2020 12:05:15
Todas las respuestas a la pregunta 3
7

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]
8 jul 2012 20:32:34
Comentarios

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.

chrisguitarguy chrisguitarguy
9 jul 2012 15:43:33

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

chrisguitarguy chrisguitarguy
9 jul 2012 16:55:20

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

Juan Lie Juan Lie
9 jul 2012 17:10:24

Estás conectado. Probablemente ese sea el problema.

chrisguitarguy chrisguitarguy
9 jul 2012 18:17:02

@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

Juan Lie Juan Lie
10 jul 2012 16:41:39

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

chrisguitarguy chrisguitarguy
10 jul 2012 17:18:18

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?

pulla pulla
1 jul 2016 13:28:17
Mostrar los 2 comentarios restantes
0

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

8 jul 2012 20:08:45
0

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

    }
}
1 oct 2019 15:49:14