Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Permitir iframes en el contenido (útil para videos incrustados)
- add_filter('wp_kses_allowed_html', 'allow_iframes_filter', 10, 2);
- function allow_iframes_filter($allowed, $context) {
- if ($context === 'post') {
- $allowed['iframe'] = array(
- 'src' => true,
- 'width' => true,
- 'height' => true,
- 'frameborder' => true,
- 'allowfullscreen' => true,
- );
- }
- return $allowed;
- }
- // PARTE 1: PESTAÑA EN MI CUENTA
- // Añadir la pestaña personalizada en Mi Cuenta
- add_filter('woocommerce_account_menu_items', 'add_custom_content_tab');
- function add_custom_content_tab($menu_items) {
- // Obtener roles permitidos
- $allowed_roles = get_option('custom_content_allowed_roles', array('customer'));
- // Obtener nombre y slug configurados
- $tab_name = get_option('custom_content_tab_name', 'Contenido Personalizado');
- $tab_slug = get_option('custom_content_tab_slug', 'custom-content');
- // Verificar si el usuario actual tiene un rol permitido
- $user = wp_get_current_user();
- $user_roles = (array)$user->roles;
- // Crear un nuevo array para reordenar los items
- $new_menu_items = array();
- // Insertar después del dashboard
- foreach ($menu_items as $key => $label) {
- $new_menu_items[$key] = $label;
- if ($key === 'downloads' && array_intersect($user_roles, $allowed_roles)) { // Cambiar orden de pestaña, ejemplo: dashboard, orders, downloads, etc.
- $new_menu_items[$tab_slug] = $tab_name;
- }
- }
- return $new_menu_items;
- }
- // Registrar el endpoint para la pestaña
- add_action('init', 'custom_content_add_endpoint');
- function custom_content_add_endpoint() {
- $tab_slug = get_option('custom_content_tab_slug', 'custom-content');
- add_rewrite_endpoint($tab_slug, EP_ROOT | EP_PAGES);
- }
- // Registrar el hook dinámico para el contenido
- add_action('init', 'register_custom_content_hook');
- function register_custom_content_hook() {
- $tab_slug = get_option('custom_content_tab_slug', 'custom-content');
- add_action('woocommerce_account_' . $tab_slug . '_endpoint', 'custom_content_tab_content');
- }
- // Añadir el contenido de la pestaña
- function custom_content_tab_content() {
- // Verificar si el usuario tiene permiso para ver el contenido
- $allowed_roles = get_option('custom_content_allowed_roles', array('customer'));
- $user = wp_get_current_user();
- $user_roles = (array)$user->roles;
- // Si el usuario no tiene un rol permitido, mostrar mensaje de error
- if (!array_intersect($user_roles, $allowed_roles)) {
- ?>
- <div class="woocommerce-message woocommerce-message--error woocommerce-Message woocommerce-Message--error">
- <p>No tienes permiso para acceder a este contenido.</p>
- </div>
- <?php
- return;
- }
- $user_id = get_current_user_id();
- $custom_content = get_user_meta($user_id, 'custom_content', true);
- ?>
- <div class="woocommerce-custom-content">
- <h2><?php echo esc_html(get_option('custom_content_tab_name', 'Contenido Personalizado')); ?></h2>
- <?php if (!empty($custom_content)) : ?>
- <div class="custom-text">
- <?php echo wpautop($custom_content); ?>
- </div>
- <?php else: ?>
- <p>Aún no tienes contenido personalizado asignado.</p>
- <?php endif; ?>
- </div>
- <?php
- }
- // PARTE 2: PANEL DE ADMINISTRACIÓN
- // Añadir menú principal y submenú de configuración
- add_action('admin_menu', 'custom_content_admin_menu');
- function custom_content_admin_menu() {
- add_menu_page(
- 'Gestionar Contenido de Usuarios',
- 'Contenido de Usuarios',
- 'manage_options',
- 'user-custom-content',
- 'render_custom_content_admin_page',
- 'dashicons-admin-users',
- 30
- );
- // Añadir submenú de configuración
- add_submenu_page(
- 'user-custom-content',
- 'Configuración',
- 'Configuración',
- 'manage_options',
- 'user-custom-content-settings',
- 'render_custom_content_settings'
- );
- }
- // Registrar los ajustes
- add_action('admin_init', 'register_custom_content_settings');
- function register_custom_content_settings() {
- register_setting('custom_content_settings', 'custom_content_allowed_roles');
- register_setting('custom_content_settings', 'custom_content_tab_name');
- register_setting('custom_content_settings', 'custom_content_tab_slug');
- }
- // Renderizar página de configuración
- function render_custom_content_settings() {
- $wp_roles = wp_roles();
- $all_roles = $wp_roles->roles;
- $allowed_roles = get_option('custom_content_allowed_roles', array('customer'));
- // Obtener valores guardados o usar valores por defecto
- $tab_name = get_option('custom_content_tab_name', 'Contenido Personalizado');
- $tab_slug = get_option('custom_content_tab_slug', 'custom-content');
- ?>
- <div class="wrap">
- <h1>Configuración de Contenido Personalizado</h1>
- <form method="post" action="options.php">
- <?php settings_fields('custom_content_settings'); ?>
- <table class="form-table">
- <tr>
- <th scope="row">Nombre de la pestaña</th>
- <td>
- <input type="text"
- name="custom_content_tab_name"
- value="<?php echo esc_attr($tab_name); ?>"
- class="regular-text"
- required>
- <p class="description">
- Este es el nombre que verán los usuarios en su menú de Mi Cuenta.
- </p>
- </td>
- </tr>
- <tr>
- <th scope="row">Slug de la pestaña</th>
- <td>
- <input type="text"
- name="custom_content_tab_slug"
- value="<?php echo esc_attr($tab_slug); ?>"
- class="regular-text"
- pattern="[a-z0-9-]+"
- required>
- <p class="description">
- El slug debe contener solo letras minúsculas, números y guiones.
- Ejemplo: mi-contenido, contenido-personal
- </p>
- </td>
- </tr>
- <tr>
- <th scope="row">Roles permitidos</th>
- <td>
- <?php foreach ($all_roles as $role_id => $role) :
- $role_name = translate_user_role($role['name']);
- $checked = in_array($role_id, (array)$allowed_roles);
- ?>
- <label style="display: block; margin-bottom: 5px;">
- <input type="checkbox"
- name="custom_content_allowed_roles[]"
- value="<?php echo esc_attr($role_id); ?>"
- <?php checked($checked); ?>>
- <?php echo esc_html($role_name); ?>
- </label>
- <?php endforeach; ?>
- <p class="description">
- Selecciona los roles de usuario que podrán tener contenido personalizado.
- </p>
- </td>
- </tr>
- </table>
- <?php submit_button('Guardar cambios'); ?>
- </form>
- <script>
- jQuery(document).ready(function($) {
- // Validar el slug antes de enviar el formulario
- $('form').on('submit', function(e) {
- var slug = $('input[name="custom_content_tab_slug"]').val();
- if(!/^[a-z0-9-]+$/.test(slug)) {
- alert('El slug solo puede contener letras minúsculas, números y guiones.');
- e.preventDefault();
- return false;
- }
- });
- // Convertir automáticamente el slug a formato válido mientras se escribe
- $('input[name="custom_content_tab_slug"]').on('input', function() {
- var slug = $(this).val();
- slug = slug.toLowerCase()
- .replace(/\s+/g, '-') // Espacios a guiones
- .replace(/[^a-z0-9-]/g, '') // Remover caracteres inválidos
- .replace(/-+/g, '-'); // Remover guiones múltiples
- $(this).val(slug);
- });
- });
- </script>
- </div>
- <?php
- }
- // Renderizar la página principal de administración
- function render_custom_content_admin_page() {
- // Procesar el formulario cuando se envía
- if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_user_content'])) {
- $user_id = intval($_POST['user_id']);
- // Guardar texto
- if (isset($_POST['custom_text'])) {
- update_user_meta($user_id, 'custom_content', wp_kses_post($_POST['custom_text']));
- }
- echo '<div class="notice notice-success"><p>Contenido actualizado con éxito.</p></div>';
- }
- // Obtener roles permitidos
- $allowed_roles = get_option('custom_content_allowed_roles', array('customer'));
- // Obtener usuarios que tienen alguno de los roles permitidos
- $users = array();
- foreach (get_users() as $user) {
- $user_roles = (array)$user->roles;
- if (array_intersect($user_roles, $allowed_roles)) {
- $users[] = $user;
- }
- }
- // Ordenar usuarios por nombre
- usort($users, function($a, $b) {
- return strcasecmp($a->display_name, $b->display_name);
- });
- // Obtener el usuario seleccionado
- $selected_user_id = isset($_GET['user_id']) ? intval($_GET['user_id']) : 0;
- ?>
- <div class="wrap">
- <h1>Gestionar Contenido de Usuarios</h1>
- <div class="notice notice-info">
- <p>
- ¿Necesitas gestionar qué roles pueden tener contenido personalizado?
- <a href="<?php echo admin_url('admin.php?page=user-custom-content-settings'); ?>">
- Ir a la configuración
- </a>
- </p>
- </div>
- <!-- Selector de usuario -->
- <form method="get">
- <input type="hidden" name="page" value="user-custom-content">
- <select name="user_id" onchange="this.form.submit()" style="min-width: 300px;">
- <option value="">Seleccionar usuario...</option>
- <?php foreach ($users as $user) :
- $roles = array_map(function($role) {
- $wp_roles = wp_roles();
- return isset($wp_roles->role_names[$role]) ?
- translate_user_role($wp_roles->role_names[$role]) :
- $role;
- }, $user->roles);
- ?>
- <option value="<?php echo $user->ID; ?>" <?php selected($selected_user_id, $user->ID); ?>>
- <?php echo esc_html($user->display_name) . ' (' . $user->user_email . ') - ' . implode(', ', $roles); ?>
- </option>
- <?php endforeach; ?>
- </select>
- </form>
- <?php if ($selected_user_id) :
- $custom_content = get_user_meta($selected_user_id, 'custom_content', true);
- ?>
- <form method="post" class="user-content-form">
- <input type="hidden" name="user_id" value="<?php echo $selected_user_id; ?>">
- <!-- Editor de texto completo -->
- <h3>Contenido personalizado</h3>
- <?php
- wp_editor($custom_content, 'custom_text', array(
- 'media_buttons' => true,
- 'textarea_rows' => 20,
- 'teeny' => false,
- 'tinymce' => array(
- 'height' => 500,
- 'plugins' => 'paste,lists,link,image,media,fullscreen,wordpress', // Removido wordcount
- 'toolbar1' => 'formatselect,bold,italic,underline,strikethrough,bullist,numlist,blockquote,hr,alignleft,aligncenter,alignright,link,unlink,wp_more,spellchecker,fullscreen,wp_adv',
- 'toolbar2' => 'styleselect,forecolor,pastetext,removeformat,charmap,outdent,indent,undo,redo,wp_help'
- )
- ));
- ?>
- <p class="submit">
- <input type="submit" name="save_user_content" class="button button-primary" value="Guardar cambios">
- </p>
- </form>
- <style>
- .user-content-form {
- margin-top: 20px;
- max-width: 1200px;
- }
- </style>
- <?php endif; ?>
- </div>
- <?php
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement