Creando una página de perfil privada para usuarios registrados

En este tutorial vamos a desarrollar un sistema automático de creación de páginas personales y privadas para nuestros usuarios (clientes, comerciales, empleados…). Lo que viene siendo una Intranet, donde te logueas y tienes acceso a una página con tus datos y un contenido específico para cada usuario.

¿Cuál es su funcionamiento?

Cada vez que WordPress detecte el registro de un usuario, creará una página nueva en un custom post type llamado perfiles. Además esta página estará relacionada con el usuario utilizando como referencia un campo llamado private_profile_id. Serán páginas totalmente editables por el administrador o usuarios con permisos.

Existen plugins específicos que te ayudan a crear una intranet, pero te animo a hacerla desde cero, experimentar y extender esta pequeña intranet y llevarla a otro nivel. Recuerda una cosa, no todos los plugins se adaptan a las necesidades de los clientes. ¿Te animas a hacerlo?

Comenzamos…

En primer lugar creamos un custom post type llamado Perfiles. Donde iremos organizando todas las páginas privadas de los usuarios.

Quiero destacar algunos argumentos a tener en cuenta como: 'capability_type' => 'page', 'has_archive' => false, y 'show_in_rest' => true.

Además, podemos extender la información de los perfiles añadiendo los campos personalizados que necesitemos. En mi caso siempre uso el plugin advanced custom field para esto. Valora añadir campos interesantes como repeater, imagen, acordeón, archivo, grupo etc.

Añade el siguiente código en un plugin personalizado o en el archivo functions.php del tema en funcionamiento.

Puede ir todo el código en el mismo archivo pero si vas a extender mucho la intranet la mejor idea es dividirlo en distintos archivos.

function create_custom_post_type_perfiles() {
    $labels = array(
        'name'               => 'Perfiles',
        'singular_name'      => 'Perfil',
        'menu_name'          => 'Perfiles',
        'name_admin_bar'     => 'Perfil',
        'add_new'            => 'Añadir Nuevo',
        'add_new_item'       => 'Añadir Nuevo Perfil',
        'new_item'           => 'Nuevo Perfil',
        'edit_item'          => 'Editar Perfil',
        'view_item'          => 'Ver Perfil',
        'all_items'          => 'Todos los Perfiles',
        'search_items'       => 'Buscar Perfiles',
        'parent_item_colon'  => 'Perfil Padre:',
        'not_found'          => 'No se encontraron Perfiles.',
        'not_found_in_trash' => 'No se encontraron Perfiles en la papelera.'
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'show_in_rest'       => true,
        'query_var'          => true,
        'rewrite'            => array('slug' => 'perfil'),
        'capability_type'    => 'page',
        'has_archive'        => false,
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'excerpt'),
        'exclude_from_search'=> true, // Opcional: excluir de las búsquedas
    );

    register_post_type('perfiles', $args);
}
add_action('init', 'create_custom_post_type_perfiles');

¿Qué hace la función principal?

En la función principal utilizamos el hook user_register para activar la lógica de la intranet.

Lo más importante de esta función es que crea una nueva página dentro del custom post type perfiles cada vez que se añade un nuevo registro de usuario en la base de datos, para lo cual utilizamos la función wp_insert_post(). (Aquí te explico algunos datos importantes de esta función).

También vamos a capturar en variables el ID del usuario y el ID del perfil para posteriormente relacionarlos y tener esa conexión que buscamos entre ellos.

Añade el siguiente fragmente después del anterior. (De nuevo, tomate un tiempo para tomar la decisión de dividir el proyecto en distintos archivos).

function create_private_profile_for_user($user_id) {
    // Obtén el usuario por ID
    $user = get_userdata($user_id);
    $username = $user->user_login;
    
    // Datos del nuevo perfil
    $post_data = array(
        'post_title'   => 'Perfil de ' . $username,
        'post_content' => 'Este es el perfil privado de ' . $username,
        'post_status'  => 'private',
        'post_author'  => $user_id,
        'post_type'    => 'perfiles'
    );
    
    // Insertar el perfil en la base de datos
    $post_id = wp_insert_post($post_data);
    
    // Guardar el ID del perfil en los metadatos del usuario
    if ($post_id) {
        update_user_meta($user_id, 'private_profile_id', $post_id);
    }
}
add_action('user_register', 'create_private_profile_for_user');

Plantilla

Es importante crear una plantilla (Template) que en esta caso llamaremos single-perfiles.php (el nombre dependerá de como llames a tu custom post type). Puedes hacer una copia de la plantilla single.php y usarla como referencia.

En la plantilla añadiremos toda la información guardada del usuario (datos del usuario) así como el contenido que pongamos en la página del perfil incluyendo los campos personalizados. Seguidamente pasamos al proceso de maquetación de todo el contenido.

El siguiente snippet te puede ayudar a obtener los metadatos del usuario. Utilízalo dentro de la plantilla. Muestra solo los datos más relevantes de tu intranet.

<?php
// Función para mostrar la información de usuario
if ( is_user_logged_in() ) {
    // Obtiene el ID del usuario actual
    $current_user_id = get_current_user_id();
    
    // Obtiene todos los metadatos del usuario actual
    $all_meta_for_user = get_user_meta( $current_user_id );
    
    // Imprime todos los metadatos del usuario actual
    echo '<pre>';
    print_r( $all_meta_for_user );
    echo '</pre>';
} else {
    echo 'No hay ningún usuario conectado.';
}
?>

* Para obtener los datos de los campos personalizados hechos con advanced custom field, tienes que manejarte bien con la documentación oficial.

¿Necesitas un desarrollo a medida de una Intranet?

Me especializo en desarrollar sitios webs avanzados, programando soluciones personalizadas para proyectos web. Utilizo ACF para crear intranets potentes y que cubren todas las necesidades del cliente. Desarrollo intranets 100% escalables.

¿Qué añadir como extra en los perfiles?

Según la finalidad de la intranet puedes implementar componentes o secciones como:

  • Formulario de contacto con prioridad como un sistema de tickets.
  • Opción de cambiar imagen o modificar algunos datos.
  • Facilita la modificación del contenido con ACF Forms.
  • Mostrar pedidos (Orders) de WooCommerce.
  • Mostrar un listado de posts escritos por el mismo usuario.
  • Encuestas para recopilar datos de tus usuarios.
  • Sección para trabajadores donde descargar las nóminas.
  • Secciones de descarga de PDFs de empresa, manuales

Redirección al perfil

Esta parte puede ser opcional. Utilizando el hook login_redirect podemos enviar a los usuarios cuando se loguean directamente a la página de perfil recién creada.

Añadimos el siguiente código igualmente con los anteriores.

function redirect_to_private_profile($redirect_to, $request, $user) {
    // Verifica que el usuario esté autenticado
    if (isset($user->ID)) {
        // Obtén el ID del perfil privado del usuario
        $private_profile_id = get_user_meta($user->ID, 'private_profile_id', true);
        if ($private_profile_id) {
            $redirect_to = get_permalink($private_profile_id);
        }
    }
    return $redirect_to;
}
add_filter('login_redirect', 'redirect_to_private_profile', 10, 3);

Hacer el perfil privado

Para que las páginas de perfil sean privadas añadimos el siguiente código. Aquí utilizaremos tanto el ID de usuario y el ID de la página de perfil que hemos almacenado en la función principal. Si el usuario no tiene página de perfil hará una redirección a la página home.

function restrict_private_profile_access() {
    if (is_singular('perfiles')) {
        global $post;
        $current_user = wp_get_current_user();
        
        // Verifica si el perfil es privado y si pertenece al usuario actual
        $private_profile_id = get_user_meta($current_user->ID, 'private_profile_id', true);
        if ($private_profile_id && $post->ID == $private_profile_id) {
            // Permitir acceso
            return;
        }
        
        // Si no es el propietario, redirigir a la página de inicio
        wp_redirect(home_url());
        exit;
    }
}
add_action('template_redirect', 'restrict_private_profile_access');

Llegados a este punto la creación automática de páginas de perfil tiene que funcionar. ¡Enhorabuena!

En los siguientes códigos, el primero te van a ayudar a obtener un enlace dinámico para crear un botón de acceso al perfil. De igual forma vamos a usar el metadato guardado con anterioridad en la variable private_profile_id.

El segundo código es un ejemplo para añadir este enlace directamente en el menú que le indiquemos. Es importante que identifiques en que menú quieres que salga el botón e intercambiarlo en este caso por ‘primary‘.

* Estos fragmentos son opcionales, es posible que haya que modificarlos para que se adapten a tu desarrollo.

function get_user_profile_link() {
    // Verifica si el usuario está conectado
    if (is_user_logged_in()) {
        $current_user = wp_get_current_user();
        $private_profile_id = get_user_meta($current_user->ID, 'private_profile_id', true);
        
        if ($private_profile_id) {
            return get_permalink($private_profile_id);
        }
    }
    
    return false;
}
function add_profile_link_to_menu($items, $args) {
    // Especifica el nombre del menú donde quieres agregar el enlace
    if ($args->theme_location == 'primary') { // Cambia 'primary' por tu ubicación de menú
        if (is_user_logged_in()) {
            $profile_link = get_user_profile_link();
            
            if ($profile_link) {
                $items .= '<li class="menu-item"><a href="' . esc_url($profile_link) . '">Mi Perfil</a></li>';
            }
        } else {
            $items .= '<li class="menu-item"><a href="' . wp_login_url() . '">Iniciar Sesión</a></li>';
        }
    }
    
    return $items;
}
add_filter('wp_nav_menu_items', 'add_profile_link_to_menu', 10, 2);

¿Qué más podemos hacer?

  • Haz uso de la nueva API de Interactividad (Interactivity API) para mejorar la experiencia de los usuarios. Por ejemplo: Crea un bloque para capturar el estado de los usuarios, botones de guardar en favoritos o me interesa.
  • Conecta la información de la base datos con algunos campos de forma dinámica utilizando la Block Bindings API para agilizar procesos de introducción de datos.
  • No pierdas de vista este tutorial si estas creando un CRM personalizado. Es posible que necesites comunicarte con tus clientes de alguna manera y esta es una buena forma de hacerlo.
  • Durante la ejecución de la función puedes crear nuevos hooks personalizados para accionar otras funciones. Por ejemplo: Crean un hook que accione una cadena de envío de emails o notificaciones usuarios y administradores. Si estás recogiendo datos importantes desde un formulario te interesa gestionar esa información y almacenarla en otros posts etc.
  • Te cuento algunos tips de user_register en esta página.

Utiliza esta base de intranet para extenderla y adaptarla a las necesidades de tus clientes.

Como hemos visto esto es solo un lienzo en blanco que tienes que dar forma a través de esos campos estáticos o dinámicos. Aprende a extraer datos del mismo usuario para hacer una ficha de perfil bastante detallada.

Si no eres capaz de desarrollar una buena intranet, puedes contratar mis servicios de desarrollo a medida. ¡Te ayudare a escalar tu proyecto!.

Espero haberte ayudado, si tienes alguna duda puedes dejar un comentario y estaré encantado de solucionarlo.

Sobre el autor

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *