Si tienes una tienda online con WooCommerce y deseas tener una visión clara de tus ganancias según los diferentes tipos de pago utilizados por tus clientes, ¡este es tu código! Aquí te dejo dos funciones shortcode que te permitirán obtener gráficas y tablas detalladas para analizar tus ventas.
Gráfica por tipo de pago
Con esta función, podrás generar una gráfica atractiva que muestra las ganancias totales por cada tipo de pago en un año específico o en un rango de años. Las características clave de este shortcode son:
- Puedes especificar el año para el que deseas obtener los datos, o dejarlo vacío para mostrar las ganancias totales de todos los años disponibles.
- Las ganancias se ordenarán de mayor a menor, para que puedas identificar fácilmente qué tipo de pago genera mayores ingresos.
- Las gráficas se representarán con colores progresivos, lo que facilitará la comparación visual entre los diferentes tipos de pago.
Ejemplo:
Tabla de ganancias por tipo de pago
Esta función te permitirá obtener una tabla detallada con las ganancias y ventas para cada tipo de pago, organizadas por meses de un año determinado. Sus características clave son:
- Puedes especificar el año para el cual deseas obtener las ganancias y ventas, o se utilizará el año actual por defecto.
- La tabla mostrará claramente las ganancias totales y el número de ventas para cada tipo de pago y mes específico.
- Además, se ocultarán automáticamente las categorías de pago que no tienen ventas, asegurando que la tabla sea limpia y relevante.
Ejemplo:
Ejemplo visual de los 2 shorcodes
Ambas funciones son compatibles con WooCommerce y te brindarán una visión integral de tus ingresos según los diferentes métodos de pago. Además, puedes personalizar el estilo de las gráficas y tablas para que se adapten perfectamente al diseño de tu sitio web.
Si pones ambos shortcodes uno debajo del otro te muestra este diseño:
Shorcodes para mostrar las gráficas de las ganancias en WooCommerce
Gráficas de ganancias:
function obtener_grafica_por_tipo_pago($atts) { if (class_exists('WooCommerce')) { $atts = shortcode_atts(array( 'ano' => '', // Por defecto, año vacío si no se especifica el atributo 'ano' ), $atts); $ano = intval($atts['ano']); global $wpdb; // Obtiene las formas de pago disponibles $formas_pago_disponibles = array_keys(WC()->payment_gateways->payment_gateways()); $prefix = $wpdb->prefix; $query = "SELECT pm.meta_value as forma_pago, COUNT(o.ID) as total_compras, SUM(pm2.meta_value) as total_ventas FROM {$prefix}posts as o INNER JOIN {$prefix}postmeta as pm ON o.ID = pm.post_id INNER JOIN {$prefix}postmeta as pm2 ON o.ID = pm2.post_id WHERE o.post_type = 'shop_order' AND o.post_status IN ('wc-completed', 'wc-processing')"; // Si se especifica un año, se agrega la condición para ese año if ($ano) { $query .= " AND YEAR(o.post_date) = {$ano}"; $ano_titulo = $ano; } else { $ano_inicial = $wpdb->get_var("SELECT MIN(YEAR(post_date)) FROM {$prefix}posts WHERE post_type = 'shop_order'"); $ano_final = date('Y'); $ano_titulo = $ano_inicial . ' hasta ' . $ano_final; } $query .= " AND pm.meta_key = '_payment_method' AND pm2.meta_key = '_order_total' GROUP BY pm.meta_value ORDER BY total_ventas DESC"; // Ordenar por porcentaje de mayor a menor $results = $wpdb->get_results($query); if (count($results) > 0) { $total_ventas_anio = array_sum(array_column($results, 'total_ventas')); $ganancias_totales = wc_price($total_ventas_anio); $tabla = '<h2>' . $ano_titulo . ' (' . $ganancias_totales . ')</h2>'; $tabla .= ' <style>.graficatipoanual {background: #f6f6f6;padding: 40px 40px 80px 40px;border-radius: 20px;margin-bottom: -40px;}</style> <div class="graficatipoanual">'; // Contenedor con clase graficatipoanual // Colores progresivos de verde oscuro a verde claro $color_base = array(0, 100, 0); $num_resultados = count($results); foreach ($results as $index => $result) { $forma_pago = $result->forma_pago; $total_ventas = floatval($result->total_ventas); $porcentaje = round(($total_ventas / $total_ventas_anio) * 100, 1); $importe_total = wc_price($total_ventas); // Asignar nombres específicos a los tipos de pago switch ($forma_pago) { case 'redsys': $forma_pago = 'Redsys'; break; case 'pepper_gateway': $forma_pago = 'Pepper'; break; case 'bizum': $forma_pago = 'Bizum'; break; case 'stripe_applepay': $forma_pago = 'Applepay'; break; case 'stripe_payment_request': $forma_pago = 'Stripe'; break; default: // Si no es ninguno de los tipos específicos, dejar el nombre tal cual $forma_pago = ucfirst($forma_pago); } // Si el porcentaje y las ganancias son iguales a cero, no incluir en la tabla if ($porcentaje == 0.0 && $total_ventas == 0.0) { continue; } $color = sprintf('#%02X%02X%02X', $color_base[0], $color_base[1], $color_base[2]); $tabla .= "<div style='width:100%'> <div style='width: 30%;display: inline-block;vertical-align: top;text-align: right;font-size: 14px;'>{$forma_pago} ({$porcentaje}%) ({$importe_total})</div> <div style='width:60%;margin-bottom: 2px;display: inline-block;'> <div style='width:{$porcentaje}%;background:{$color};height:30px;vertical-align: middle;'></div> </div> </div> "; // Incrementar progresivamente el verde claro para el siguiente resultado $incremento = 100 / ($num_resultados - 1); $color_base[1] += $incremento; } $tabla .= '</div>'; // Cierre del contenedor return $tabla; } else { // Si se especifica un año, mostrar el mensaje para ese año en particular if ($ano) { return 'No se encontraron ventas para el año ' . $ano . '.'; } else { // Si no se especifica un año, mostrar el mensaje para el rango de años $ano_inicial = $wpdb->get_var("SELECT MIN(YEAR(post_date)) FROM {$prefix}posts WHERE post_type = 'shop_order'"); $ano_final = date('Y'); $tabla = '<h2>' . $ano_inicial . ' hasta ' . $ano_final . ' - Ganancias ' . $ganancias_totales . '</h2>'; $tabla .= ' <style>.graficatipoanual {background: #f6f6f6;padding: 40px;border-radius: 20px;margin-bottom: 40px;}</style> <div class="graficatipoanual">'; // Contenedor con clase graficatipoanual $mensaje = 'No se encontraron ventas para el rango de años ' . $ano_inicial . ' - ' . $ano_final . '.'; return $tabla . $mensaje . '</div>'; } } } else { return 'WooCommerce no está activado'; } } add_shortcode('grafica_por_tipo_pago', 'obtener_grafica_por_tipo_pago');
Tabla de ganancias:
function obtener_ganancias_por_tipo_pago($atts) { if (class_exists('WooCommerce')) { $atts = shortcode_atts(array( 'ano' => date('Y'), // Por defecto, el año actual si no se especifica el atributo 'ano' ), $atts); $ano = intval($atts['ano']); global $wpdb; // Asignar nombres específicos a los tipos de pago $nombres_tipos_pago = array( 'redsys' => 'Redsys', 'pepper_gateway' => 'Pepper', 'bizum' => 'Bizum', 'stripe_applepay' => 'Applepay', 'stripe_payment_request' => 'Stripe', ); // Nombres de los meses en español $nombres_meses_espanol = array( 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' ); // Obtiene las formas de pago disponibles $formas_pago_disponibles = array_keys(WC()->payment_gateways->payment_gateways()); $prefix = $wpdb->prefix; $query = "SELECT MONTH(o.post_date) as mes, pm.meta_value as forma_pago, SUM(pm2.meta_value) as total_ventas, COUNT(DISTINCT o.ID) as numero_ventas FROM {$prefix}posts as o INNER JOIN {$prefix}postmeta as pm ON o.ID = pm.post_id INNER JOIN {$prefix}postmeta as pm2 ON o.ID = pm2.post_id WHERE o.post_type = 'shop_order' AND o.post_status IN ('wc-completed', 'wc-processing') AND pm.meta_key = '_payment_method' AND pm2.meta_key = '_order_total' AND YEAR(o.post_date) = {$ano} GROUP BY mes, pm.meta_value"; $results = $wpdb->get_results($query); if (count($results) > 0) { $ganancias_por_mes = array(); $formas_pago_utilizadas = array(); // Almacenar las formas de pago utilizadas para filtrar las columnas de la tabla $total_ventas_anio = 0; foreach ($results as $result) { $mes = $nombres_meses_espanol[intval($result->mes) - 1]; $forma_pago = $result->forma_pago; $total_ventas = floatval($result->total_ventas); $numero_ventas = intval($result->numero_ventas); // Almacenar las formas de pago utilizadas $formas_pago_utilizadas[$forma_pago] = true; // Almacenar los datos en el arreglo por mes y tipo de pago if (!isset($ganancias_por_mes[$mes])) { $ganancias_por_mes[$mes] = array(); } $ganancias_por_mes[$mes][$forma_pago] = array( 'total' => $total_ventas, 'ventas' => $numero_ventas, ); $total_ventas_anio += $total_ventas; } // Tabla de ganancias por tipo de pago por mes $tabla_ganancias = ' <style>.graficatipoanual2 {background: #ffffff;padding: 40px;border-radius: 20px;margin-bottom: 40px;box-shadow: 0 0 10px #00000024;}</style> <div class="graficatipoanual2">'; // Contenedor con clase graficatipoanual $tabla_ganancias .= '<h3>GANANCIAS Y VENTAS ' . $ano . '</h3>'; $tabla_ganancias .= '<table style="background-color: #fff; border-collapse: collapse; width: 100%;">'; $tabla_ganancias .= '<tr><th>Mes</th>'; // Filtrar las columnas para mostrar solo las formas de pago utilizadas $formas_pago_mostradas = array(); foreach ($formas_pago_disponibles as $forma_pago) { if (isset($formas_pago_utilizadas[$forma_pago])) { $nombre_tipo_pago = isset($nombres_tipos_pago[$forma_pago]) ? $nombres_tipos_pago[$forma_pago] : ucfirst($forma_pago); $tabla_ganancias .= '<th style="border: 1px solid #dddddd; padding: 8px;">' . $nombre_tipo_pago . '</th>'; $formas_pago_mostradas[] = $forma_pago; } } $tabla_ganancias .= '<th style="border: 1px solid #dddddd; padding: 8px;">Total</th></tr>'; foreach ($ganancias_por_mes as $mes => $ganancias) { $tabla_ganancias .= "<tr><td style='border: 1px solid #dddddd; padding: 8px;'>{$mes}</td>"; $total_mes = 0; $ventas_mes = 0; foreach ($formas_pago_mostradas as $forma_pago) { $ganancia = isset($ganancias[$forma_pago]) ? wc_price($ganancias[$forma_pago]['total']) . " <small>({$ganancias[$forma_pago]['ventas']} ventas)</small>" : '-'; $tabla_ganancias .= "<td style='border: 1px solid #dddddd; padding: 8px;font-size:12px'>{$ganancia}</td>"; $total_mes += isset($ganancias[$forma_pago]) ? $ganancias[$forma_pago]['total'] : 0; $ventas_mes += isset($ganancias[$forma_pago]) ? $ganancias[$forma_pago]['ventas'] : 0; } $tabla_ganancias .= "<td style='border: 1px solid #dddddd; padding: 8px;font-size:12px'>" . wc_price($total_mes) . " <small>({$ventas_mes} ventas)</small></td></tr>"; } $tabla_ganancias .= '</table></div>'; return $tabla_ganancias; } else { return 'No se encontraron ventas para el año ' . $ano . '.'; } } else { return 'WooCommerce no está activado'; } } add_shortcode('tabla_ganancias_por_tipo', 'obtener_ganancias_por_tipo_pago');