Advertisement
oscarviedma

Añadir pestaña personalizada mi cuenta + gestión de contenido único desde dashboard - OV

Nov 22nd, 2024 (edited)
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 13.21 KB | None | 0 0
  1. // Permitir iframes en el contenido (útil para videos incrustados)
  2. add_filter('wp_kses_allowed_html', 'allow_iframes_filter', 10, 2);
  3. function allow_iframes_filter($allowed, $context) {
  4.     if ($context === 'post') {
  5.         $allowed['iframe'] = array(
  6.             'src'             => true,
  7.             'width'           => true,
  8.             'height'          => true,
  9.             'frameborder'     => true,
  10.             'allowfullscreen' => true,
  11.         );
  12.     }
  13.     return $allowed;
  14. }
  15.  
  16. // PARTE 1: PESTAÑA EN MI CUENTA
  17. // Añadir la pestaña personalizada en Mi Cuenta
  18. add_filter('woocommerce_account_menu_items', 'add_custom_content_tab');
  19. function add_custom_content_tab($menu_items) {
  20.     // Obtener roles permitidos
  21.     $allowed_roles = get_option('custom_content_allowed_roles', array('customer'));
  22.    
  23.     // Obtener nombre y slug configurados
  24.     $tab_name = get_option('custom_content_tab_name', 'Contenido Personalizado');
  25.     $tab_slug = get_option('custom_content_tab_slug', 'custom-content');
  26.    
  27.     // Verificar si el usuario actual tiene un rol permitido
  28.     $user = wp_get_current_user();
  29.     $user_roles = (array)$user->roles;
  30.    
  31.     // Crear un nuevo array para reordenar los items
  32.     $new_menu_items = array();
  33.    
  34.     // Insertar después del dashboard
  35.     foreach ($menu_items as $key => $label) {
  36.         $new_menu_items[$key] = $label;
  37.        
  38.         if ($key === 'downloads' && array_intersect($user_roles, $allowed_roles)) { // Cambiar orden de pestaña, ejemplo: dashboard, orders, downloads, etc.
  39.             $new_menu_items[$tab_slug] = $tab_name;
  40.         }
  41.     }
  42.    
  43.     return $new_menu_items;
  44. }
  45.  
  46. // Registrar el endpoint para la pestaña
  47. add_action('init', 'custom_content_add_endpoint');
  48. function custom_content_add_endpoint() {
  49.     $tab_slug = get_option('custom_content_tab_slug', 'custom-content');
  50.     add_rewrite_endpoint($tab_slug, EP_ROOT | EP_PAGES);
  51. }
  52.  
  53. // Registrar el hook dinámico para el contenido
  54. add_action('init', 'register_custom_content_hook');
  55. function register_custom_content_hook() {
  56.     $tab_slug = get_option('custom_content_tab_slug', 'custom-content');
  57.     add_action('woocommerce_account_' . $tab_slug . '_endpoint', 'custom_content_tab_content');
  58. }
  59.  
  60. // Añadir el contenido de la pestaña
  61. function custom_content_tab_content() {
  62.     // Verificar si el usuario tiene permiso para ver el contenido
  63.     $allowed_roles = get_option('custom_content_allowed_roles', array('customer'));
  64.     $user = wp_get_current_user();
  65.     $user_roles = (array)$user->roles;
  66.    
  67.     // Si el usuario no tiene un rol permitido, mostrar mensaje de error
  68.     if (!array_intersect($user_roles, $allowed_roles)) {
  69.         ?>
  70.         <div class="woocommerce-message woocommerce-message--error woocommerce-Message woocommerce-Message--error">
  71.             <p>No tienes permiso para acceder a este contenido.</p>
  72.         </div>
  73.         <?php
  74.         return;
  75.     }
  76.    
  77.     $user_id = get_current_user_id();
  78.     $custom_content = get_user_meta($user_id, 'custom_content', true);
  79.    
  80.     ?>
  81.     <div class="woocommerce-custom-content">
  82.         <h2><?php echo esc_html(get_option('custom_content_tab_name', 'Contenido Personalizado')); ?></h2>
  83.        
  84.         <?php if (!empty($custom_content)) : ?>
  85.             <div class="custom-text">
  86.                 <?php echo wpautop($custom_content); ?>
  87.             </div>
  88.         <?php else: ?>
  89.             <p>Aún no tienes contenido personalizado asignado.</p>
  90.         <?php endif; ?>
  91.     </div>
  92.     <?php
  93. }
  94.  
  95. // PARTE 2: PANEL DE ADMINISTRACIÓN
  96. // Añadir menú principal y submenú de configuración
  97. add_action('admin_menu', 'custom_content_admin_menu');
  98. function custom_content_admin_menu() {
  99.     add_menu_page(
  100.         'Gestionar Contenido de Usuarios',
  101.         'Contenido de Usuarios',
  102.         'manage_options',
  103.         'user-custom-content',
  104.         'render_custom_content_admin_page',
  105.         'dashicons-admin-users',
  106.         30
  107.     );
  108.    
  109.     // Añadir submenú de configuración
  110.     add_submenu_page(
  111.         'user-custom-content',
  112.         'Configuración',
  113.         'Configuración',
  114.         'manage_options',
  115.         'user-custom-content-settings',
  116.         'render_custom_content_settings'
  117.     );
  118. }
  119.  
  120. // Registrar los ajustes
  121. add_action('admin_init', 'register_custom_content_settings');
  122. function register_custom_content_settings() {
  123.     register_setting('custom_content_settings', 'custom_content_allowed_roles');
  124.     register_setting('custom_content_settings', 'custom_content_tab_name');
  125.     register_setting('custom_content_settings', 'custom_content_tab_slug');
  126. }
  127.  
  128. // Renderizar página de configuración
  129. function render_custom_content_settings() {
  130.     $wp_roles = wp_roles();
  131.     $all_roles = $wp_roles->roles;
  132.     $allowed_roles = get_option('custom_content_allowed_roles', array('customer'));
  133.    
  134.     // Obtener valores guardados o usar valores por defecto
  135.     $tab_name = get_option('custom_content_tab_name', 'Contenido Personalizado');
  136.     $tab_slug = get_option('custom_content_tab_slug', 'custom-content');
  137.     ?>
  138.     <div class="wrap">
  139.         <h1>Configuración de Contenido Personalizado</h1>
  140.        
  141.         <form method="post" action="options.php">
  142.             <?php settings_fields('custom_content_settings'); ?>
  143.            
  144.             <table class="form-table">
  145.                 <tr>
  146.                     <th scope="row">Nombre de la pestaña</th>
  147.                     <td>
  148.                         <input type="text"
  149.                                name="custom_content_tab_name"
  150.                                value="<?php echo esc_attr($tab_name); ?>"
  151.                                class="regular-text"
  152.                                required>
  153.                         <p class="description">
  154.                             Este es el nombre que verán los usuarios en su menú de Mi Cuenta.
  155.                         </p>
  156.                     </td>
  157.                 </tr>
  158.                
  159.                 <tr>
  160.                     <th scope="row">Slug de la pestaña</th>
  161.                     <td>
  162.                         <input type="text"
  163.                                name="custom_content_tab_slug"
  164.                                value="<?php echo esc_attr($tab_slug); ?>"
  165.                                class="regular-text"
  166.                                pattern="[a-z0-9-]+"
  167.                                required>
  168.                         <p class="description">
  169.                             El slug debe contener solo letras minúsculas, números y guiones.
  170.                             Ejemplo: mi-contenido, contenido-personal
  171.                         </p>
  172.                     </td>
  173.                 </tr>
  174.                
  175.                 <tr>
  176.                     <th scope="row">Roles permitidos</th>
  177.                     <td>
  178.                         <?php foreach ($all_roles as $role_id => $role) :
  179.                             $role_name = translate_user_role($role['name']);
  180.                             $checked = in_array($role_id, (array)$allowed_roles);
  181.                         ?>
  182.                             <label style="display: block; margin-bottom: 5px;">
  183.                                 <input type="checkbox"
  184.                                        name="custom_content_allowed_roles[]"
  185.                                        value="<?php echo esc_attr($role_id); ?>"
  186.                                        <?php checked($checked); ?>>
  187.                                 <?php echo esc_html($role_name); ?>
  188.                             </label>
  189.                         <?php endforeach; ?>
  190.                         <p class="description">
  191.                             Selecciona los roles de usuario que podrán tener contenido personalizado.
  192.                         </p>
  193.                     </td>
  194.                 </tr>
  195.             </table>
  196.            
  197.             <?php submit_button('Guardar cambios'); ?>
  198.         </form>
  199.        
  200.         <script>
  201.         jQuery(document).ready(function($) {
  202.             // Validar el slug antes de enviar el formulario
  203.             $('form').on('submit', function(e) {
  204.                 var slug = $('input[name="custom_content_tab_slug"]').val();
  205.                 if(!/^[a-z0-9-]+$/.test(slug)) {
  206.                     alert('El slug solo puede contener letras minúsculas, números y guiones.');
  207.                     e.preventDefault();
  208.                     return false;
  209.                 }
  210.             });
  211.            
  212.             // Convertir automáticamente el slug a formato válido mientras se escribe
  213.             $('input[name="custom_content_tab_slug"]').on('input', function() {
  214.                 var slug = $(this).val();
  215.                 slug = slug.toLowerCase()
  216.                          .replace(/\s+/g, '-')       // Espacios a guiones
  217.                          .replace(/[^a-z0-9-]/g, '') // Remover caracteres inválidos
  218.                          .replace(/-+/g, '-');       // Remover guiones múltiples
  219.                 $(this).val(slug);
  220.             });
  221.         });
  222.         </script>
  223.     </div>
  224.     <?php
  225. }
  226.  
  227. // Renderizar la página principal de administración
  228. function render_custom_content_admin_page() {
  229.     // Procesar el formulario cuando se envía
  230.     if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_user_content'])) {
  231.         $user_id = intval($_POST['user_id']);
  232.        
  233.         // Guardar texto
  234.         if (isset($_POST['custom_text'])) {
  235.             update_user_meta($user_id, 'custom_content', wp_kses_post($_POST['custom_text']));
  236.         }
  237.        
  238.         echo '<div class="notice notice-success"><p>Contenido actualizado con éxito.</p></div>';
  239.     }
  240.    
  241.     // Obtener roles permitidos
  242.     $allowed_roles = get_option('custom_content_allowed_roles', array('customer'));
  243.    
  244.     // Obtener usuarios que tienen alguno de los roles permitidos
  245.     $users = array();
  246.     foreach (get_users() as $user) {
  247.         $user_roles = (array)$user->roles;
  248.         if (array_intersect($user_roles, $allowed_roles)) {
  249.             $users[] = $user;
  250.         }
  251.     }
  252.    
  253.     // Ordenar usuarios por nombre
  254.     usort($users, function($a, $b) {
  255.         return strcasecmp($a->display_name, $b->display_name);
  256.     });
  257.    
  258.     // Obtener el usuario seleccionado
  259.     $selected_user_id = isset($_GET['user_id']) ? intval($_GET['user_id']) : 0;
  260.     ?>
  261.     <div class="wrap">
  262.         <h1>Gestionar Contenido de Usuarios</h1>
  263.        
  264.         <div class="notice notice-info">
  265.             <p>
  266.                 ¿Necesitas gestionar qué roles pueden tener contenido personalizado?
  267.                 <a href="<?php echo admin_url('admin.php?page=user-custom-content-settings'); ?>">
  268.                     Ir a la configuración
  269.                 </a>
  270.             </p>
  271.         </div>
  272.        
  273.         <!-- Selector de usuario -->
  274.         <form method="get">
  275.             <input type="hidden" name="page" value="user-custom-content">
  276.             <select name="user_id" onchange="this.form.submit()" style="min-width: 300px;">
  277.                 <option value="">Seleccionar usuario...</option>
  278.                 <?php foreach ($users as $user) :
  279.                     $roles = array_map(function($role) {
  280.                         $wp_roles = wp_roles();
  281.                         return isset($wp_roles->role_names[$role]) ?
  282.                                translate_user_role($wp_roles->role_names[$role]) :
  283.                                $role;
  284.                     }, $user->roles);
  285.                 ?>
  286.                     <option value="<?php echo $user->ID; ?>" <?php selected($selected_user_id, $user->ID); ?>>
  287.                         <?php echo esc_html($user->display_name) . ' (' . $user->user_email . ') - ' . implode(', ', $roles); ?>
  288.                     </option>
  289.                 <?php endforeach; ?>
  290.             </select>
  291.         </form>
  292.        
  293.         <?php if ($selected_user_id) :
  294.             $custom_content = get_user_meta($selected_user_id, 'custom_content', true);
  295.         ?>
  296.             <form method="post" class="user-content-form">
  297.                 <input type="hidden" name="user_id" value="<?php echo $selected_user_id; ?>">
  298.                
  299.                 <!-- Editor de texto completo -->
  300.                 <h3>Contenido personalizado</h3>
  301.                 <?php
  302.                 wp_editor($custom_content, 'custom_text', array(
  303.                     'media_buttons' => true,
  304.                     'textarea_rows' => 20,
  305.                     'teeny' => false,
  306.                     'tinymce' => array(
  307.                         'height' => 500,
  308.                         'plugins' => 'paste,lists,link,image,media,fullscreen,wordpress',  // Removido wordcount
  309.                         'toolbar1' => 'formatselect,bold,italic,underline,strikethrough,bullist,numlist,blockquote,hr,alignleft,aligncenter,alignright,link,unlink,wp_more,spellchecker,fullscreen,wp_adv',
  310.                         'toolbar2' => 'styleselect,forecolor,pastetext,removeformat,charmap,outdent,indent,undo,redo,wp_help'
  311.                     )
  312.                 ));
  313.                 ?>
  314.                
  315.                 <p class="submit">
  316.                     <input type="submit" name="save_user_content" class="button button-primary" value="Guardar cambios">
  317.                 </p>
  318.             </form>
  319.            
  320.             <style>
  321.             .user-content-form {
  322.                 margin-top: 20px;
  323.                 max-width: 1200px;
  324.             }
  325.             </style>
  326.         <?php endif; ?>
  327.     </div>
  328.     <?php
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement