// Restringir acceso al dashboard por usuario function verificar_acceso_dashboard() { if (is_page('mi-cuenta')) { if (!is_user_logged_in()) { wp_redirect(wp_login_url()); exit; } } } add_action('template_redirect', 'verificar_acceso_dashboard'); @media (max-width: 480px) { .cliente-nombre { font-size: 20px; } .saldo-cantidad { font-size: 24px; } .dashboard-card { padding: 15px; } } // Procesar solicitud de trámites function procesar_solicitud_tramites() { if (isset($_POST['solicitar_tramite']) && isset($_POST['tramite_nonce'])) { // Verificar nonce de seguridad if (!wp_verify_nonce($_POST['tramite_nonce'], 'solicitar_tramite')) { wp_die('Error de seguridad'); } $cliente_id = intval($_POST['cliente_id']); $tramites_solicitados = isset($_POST['tramites']) ? $_POST['tramites'] : array(); if (empty($tramites_solicitados)) { add_action('admin_notices', function() { echo '

Por favor selecciona al menos un trámite.

'; }); return; } // Obtener trámites actuales $tramites_actuales = get_post_meta($cliente_id, 'tramites_activos', true); if (!is_array($tramites_actuales)) { $tramites_actuales = array(); } // Nombres de trámites $nombres_tramites = array( 'aclaracion_saldo' => 'Aclaración de saldo', 'actualizar_rfc' => 'Actualizar RFC', 'cambio_domicilio' => 'Cambio de domicilio', 'portabilidad' => 'Portabilidad línea fija', 'visita_tecnica' => 'Visita técnica', 'autoinstalacion' => 'Autoinstalación de equipo' ); // Agregar nuevos trámites foreach ($tramites_solicitados as $tramite) { $tramites_actuales[] = array( 'tipo' => $tramite, 'fecha_solicitud' => date('d/m/Y'), 'estado' => 'pendiente', 'notas' => 'Solicitud realizada desde el portal del cliente' ); } // Guardar trámites actualizados update_post_meta($cliente_id, 'tramites_activos', $tramites_actuales); // Enviar notificación por email al administrador enviar_notificacion_tramite($cliente_id, $tramites_solicitados); // Mensaje de éxito add_action('wp_footer', function() { echo ''; }); } } add_action('init', 'procesar_solicitud_tramites'); // Enviar notificación por email function enviar_notificacion_tramite($cliente_id, $tramites) { $cliente_nombre = get_the_title($cliente_id); $numero_cuenta = get_post_meta($cliente_id, 'numero_cuenta', true); $admin_email = get_option('admin_email'); $nombres_tramites = array( 'aclaracion_saldo' => 'Aclaración de saldo', 'actualizar_rfc' => 'Actualizar RFC', 'cambio_domicilio' => 'Cambio de domicilio', 'portabilidad' => 'Portabilidad línea fija', 'visita_tecnica' => 'Visita técnica', 'autoinstalacion' => 'Autoinstalación de equipo' ); $lista_tramites = ''; foreach ($tramites as $tramite) { $lista_tramites .= '- ' . $nombres_tramites[$tramite] . "\n"; } $asunto = 'Nueva solicitud de trámite - ' . $cliente_nombre; $mensaje = "Se ha recibido una nueva solicitud de trámite:\n\n"; $mensaje .= "Cliente: {$cliente_nombre}\n"; $mensaje .= "Cuenta: {$numero_cuenta}\n"; $mensaje .= "Fecha: " . date('d/m/Y H:i') . "\n\n"; $mensaje .= "Trámites solicitados:\n{$lista_tramites}\n\n"; $mensaje .= "Ver detalles en: " . admin_url('post.php?post=' . $cliente_id . '&action=edit'); wp_mail($admin_email, $asunto, $mensaje); } // Agregar metabox para gestión rápida de trámites en el admin function agregar_metabox_tramites_rapidos() { add_meta_box( 'tramites_rapidos', '🛠️ Gestión Rápida de Trámites', 'mostrar_metabox_tramites', 'cliente', 'side', 'high' ); } add_action('add_meta_boxes', 'agregar_metabox_tramites_rapidos'); function mostrar_metabox_tramites($post) { $tramites = get_post_meta($post->ID, 'tramites_activos', true); if (empty($tramites) || !is_array($tramites)) { echo '

No hay trámites activos

'; return; } echo '
'; echo ''; foreach ($tramites as $index => $tramite) { $estado_class = 'estado-' . $tramite['estado']; echo '
'; echo '' . esc_html($tramite['tipo']) . '
'; echo 'Fecha: ' . esc_html($tramite['fecha_solicitud']) . '
'; echo '' . esc_html(ucfirst($tramite['estado'])) . ''; echo '
'; } echo '
'; } // Widget para estadísticas en el dashboard de WordPress function agregar_widget_estadisticas_clientes() { wp_add_dashboard_widget( 'estadisticas_clientes', '📊 Estadísticas de Clientes', 'mostrar_widget_estadisticas' ); } add_action('wp_dashboard_setup', 'agregar_widget_estadisticas_clientes'); function mostrar_widget_estadisticas() { $total_clientes = wp_count_posts('cliente')->publish; // Contar trámites pendientes $args = array( 'post_type' => 'cliente', 'posts_per_page' => -1 ); $clientes = get_posts($args); $tramites_pendientes = 0; $tramites_totales = 0; $saldo_total = 0; foreach ($clientes as $cliente) { $tramites = get_post_meta($cliente->ID, 'tramites_activos', true); if (is_array($tramites)) { foreach ($tramites as $tramite) { $tramites_totales++; if ($tramite['estado'] === 'pendiente') { $tramites_pendientes++; } } } $saldo = get_post_meta($cliente->ID, 'saldo_disponible', true); $saldo_total += floatval($saldo); } echo '
'; echo '
'; echo '
' . $total_clientes . '
'; echo '
Clientes Totales
'; echo '
'; echo '
'; echo '
' . $tramites_pendientes . '
'; echo '
Trámites Pendientes
'; echo '
'; echo '
'; echo '
' . $tramites_totales . '
'; echo '
Trámites Totales
'; echo '
'; echo '
'; echo '
$' . number_format($saldo_total, 2) . '
'; echo '
Saldo Total
'; echo '
'; echo '
'; echo '
'; echo 'Ver Todos los Clientes'; echo '
'; } // Exportar clientes a CSV function agregar_boton_exportar_csv() { $screen = get_current_screen(); if ($screen->post_type === 'cliente') { echo '📥 Exportar a CSV'; } } add_action('admin_notices', 'agregar_boton_exportar_csv'); function exportar_clientes_csv() { if (!current_user_can('manage_options')) { wp_die('No tienes permisos para esta acción'); } $args = array( 'post_type' => 'cliente', 'posts_per_page' => -1 ); $clientes = get_posts($args); header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=clientes_' . date('Y-m-d') . '.csv'); $output = fopen('php://output', 'w'); // Encabezados fputcsv($output, array( 'Nombre', 'Número de Cuenta', 'Saldo Disponible', 'Paquete', 'Servicios', 'Teléfono', 'Email', 'RFC' )); // Datos foreach ($clientes as $cliente) { $numero_cuenta = get_post_meta($cliente->ID, 'numero_cuenta', true); $saldo = get_post_meta($cliente->ID, 'saldo_disponible', true); $paquete = get_post_meta($cliente->ID, 'paquete_contratado', true); $contacto = get_post_meta($cliente->ID, 'datos_contacto', true); $fiscal = get_post_meta($cliente->ID, 'datos_fiscales', true); $servicios = get_the_terms($cliente->ID, 'servicio'); $servicios_str = ''; if ($servicios && !is_wp_error($servicios)) { $servicios_str = implode(', ', wp_list_pluck($servicios, 'name')); } fputcsv($output, array( $cliente->post_title, $numero_cuenta, $saldo, $paquete, $servicios_str, isset($contacto['telefono']) ? $contacto['telefono'] : '', isset($contacto['email']) ? $contacto['email'] : '', isset($fiscal['rfc']) ? $fiscal['rfc'] : '' )); } fclose($output); exit; } add_action('wp_ajax_exportar_clientes_csv', 'exportar_clientes_csv'); // Búsqueda de clientes por número de cuenta en el admin function buscar_por_numero_cuenta($query) { if (!is_admin() || !$query->is_main_query()) { return; } if ($query->get('post_type') !== 'cliente') { return; } $search_term = $query->get('s'); if (empty($search_term)) { return; } // Buscar por número de cuenta $meta_query = array( 'relation' => 'OR', array( 'key' => 'numero_cuenta', 'value' => $search_term, 'compare' => 'LIKE' ) ); $query->set('meta_query', $meta_query); $query->set('s', ''); // Limpiar búsqueda de título para que solo busque en meta } add_action('pre_get_posts', 'buscar_por_numero_cuenta'); ?> Sample Page – Top Of The World

Sample Page

This is an example page. It’s different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:

Hi there! I’m a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin’ caught in the rain.)

…or something like this:

The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.

As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!

Scroll al inicio