X

Contenido restringido para usuarios usando shortcodes

En este artículo veremos cómo restringir parte del contenido de tus artículos, sin usar plugins, para que sólo puedan verlo determinados usuarios o grupos de usuarios.

 

1- Generalidades

Usaremos la funcionalidad de shortcodes en WordPress, podemos colocar el código directamente como parte de los archivos del theme, en functions.php, sin embargo es mejor centralizar nuestro código a través de un plugin de Snippets.

 

2- Contenido restringido para usuarios registrados

Para restringir parte del contenido de entradas y que sólo sea accesible para usuarios registrados, puedes usar el siguiente código:


add_shortcode('REGISTRADO','mostrar_contenido_usuario_registrado');

function mostrar_contenido_usuario_registrado($atts, $content = null){
	global $wp;
	$current_url = home_url(add_query_arg(array(),$wp->request));

	if ( ! is_user_logged_in() ){
		return '<div>Regístrate para ver el contenido...<a href="'.wp_login_url($current_url).'" >Ir al Registro</a></div>';
	}
	return $content;
}

 

3- Contenido restringido para usuarios visitantes

En el caso que quieras mostrar sólo parte del contenido para usuarios visitantes, puedes usar el siguiente código:


add_shortcode('VISITANTE','mostrar_contenido_usuario_visitante');

function mostrar_contenido_usuario_visitante($atts, $content = null){
	if ( ! is_user_logged_in() ){
		return $content;
	}
	return '';
}

 

4- Contenido restringido para roles de usuarios

La lógica es la misma que las anteriores, en el caso de usuarios para un determinado rol puedes usar la funciones de WordPress para comprobar qué rol tiene un determinado usuario, tal como se muestra a continuación:


add_shortcode('AUTOR','mostrar_contenido_usuario_autor');

function mostrar_contenido_usuario_autor($atts, $content = null){
	$user = wp_get_current_user();
	if ( in_array( 'author', (array) $user->roles ) ){
		return $content;
	}
	return 'El usuario debe ser autor...';
}

 

5- Uso de los shortcodes

Finalmente, luego que tengas alguno de los códigos anteriores agregados en tu sitio, entonces puedes usar los Shortcode como parte del contenido de tus entradas tal como se muestra a continuación.


[REGISTRADO]
Contenido para usuario registrado
....
[/REGISTRADO]

[VISITANTE]
Contenido para usuario visitante
....
[/VISITANTE]

[AUTOR]
Contenido para usuarios del grupo autores
....
[/AUTOR]

 

Categorías: Plugins
Etiquetas: seguridad

Ver comentarios (23)

  • Gracias por este magnífico post, pero tengo un pequeño problema, después de logearme no me redirige a la página donde esta el shortcode.(se queda en el panel de administración) me gustaria que me devolviera a la página o post.
    He hecho algo mal ?
    Hay que añadir algo más de código?

    • Hola José, gracias por el comentario, efectivamente había que hacer una mejora, ya la he implementado en el código del punto 2, la función wp_login_url() acepta un parámetro opcional que es la url de redirección.
      Saludos.

  • !Magnificó artículo Jhon¡
    Estoy intentando insertar 2 roles con el código (4- Contenido restringido para roles de usuarios
    ) pero no me es posible, me da error el array, algo hago mal. ¿Como podría decir que el contenido sea visible para 2 roles?

  • Hola, supongo que has puesto el primer parámetro com array, prueba hacerlo con un or, es decir por ejemplo:

    in_array( 'author', (array) $user->roles )  || in_array( 'editor', (array) $user->roles ) 
    
  • Muchísimas gracias Jhon, a funcionado perfectamente!!

    Enhorabuena por esos fantásticos tutoriales :)

  • hola buen día.

    me gustaria hacer un area de miembros donde se tengan que registrar al sitio web y a la hora de registrarse solo vea ese contenido mi problema es que son varios usuarios. como puede hacer que el usuario este registrado no vea la otra información. y este oculto de los demas usuarios registrados.

  • buenas noches, yo estoy intentando hacer una web donde tengas que logearte para ver el resto de las paginas, pero no lo he logrado ni con plugins, ni poniendo el resto de las paginas en privado y asignaando roles, me podrias ayudar porfa?

  • Hola. He puesto el código para mostrar contenido por roles de usuario y funciona correctamente. Pero ahora quiero hacer otro shortcode que haga lo mismo con el mismo rol de usuario pero sin mostrar mensaje alguno a los usuarios que no son de dicho rol, lo intenté con el mismo código cambiando el shortcode pero dejando la parte del rol de usuario igual y eliminando la parte de " return 'El usuario debe ser autor...'; " guardo los cambios y sale sin errores pero al activar de nuevo el plugin de funciones sale "el plugin no se ha activado porque ha provocado un error fatal" ¿Alguna idea para solucionarlo?

    • Hola, por lo que comentas lo has realizado bien, prueba retornando un mensaje vacío y verifica, por ejemplo: return;

  • Hola Jhon, que tal?

    Estoy utilizando 2 fragmentos de código de más abajo para restringir contenido para dos roles "Clientes" y "Profesionales" en varias página y funciona perfectamente, aunque ahora tengo la situación que necesito restringir contenido pero para dos roles a la vez, es decir, tienen que poder ver la misma información "clientes" y "profesionales" a la vez.

    El shortcode que utilizo es este: [cliente, profesionales_salud] pero no funciona con el conjunto de dos roles a la vez (por separado; ejemplo ==> [cliente] si que funciona) . ¿Cómo podría implementarlo?

    Gracias por el magnífico tutorial ;)

    Un saludo

    /***********CÓDIGO UTILIZADO PARA CLIENTES*************/
    add_shortcode('cliente','mostrar_contenido_cliente');
    function mostrar_contenido_cliente($atts, $content = null){
    	$user = wp_get_current_user();
    	if ( in_array( 'cliente', (array) $user->roles ) || in_array( 'administrator', (array) $user->roles  ) ){  
    		return $content;
    	}
    	return 'Información exclusiva del Área Profesional';
    }
    
    /***********CÓDIGO UTILIZADO PARA PROFESIONALES*************/
    add_shortcode('profesionales_salud','mostrar_contenido_prof_salud');
    
    function mostrar_contenido_prof_salud($atts, $content = null){
    	$user = wp_get_current_user();
    	if ( in_array( 'prof_salud', (array) $user->roles ) || in_array( 'administrator', (array) $user->roles ) ){  
    		return $content;
    	}
    	return 'Información exclusiva del Área Profesional';
    }
    
  • Hola Jhon,

    Sí, eso ya lo probé, pero no funciona. Muestra el que esta mas cercano al cierre del contenido, en este caso [profesionales_salud].

    La idea seria algo así [cliente, profesionales_salud] contenido [/cliente, profesionales_salud], pero esto no funciona. Alguna idea?

    Gracias por tu ayuda Jhon.