Añadir gráficas y tablas de ganancias de Woocommerce por tipo de pago

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:

tipo pago

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:

grafica tipo pago

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:

tipo pago

grafica tipo pago

grafica y tabla ganancias woocommerce

 

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');

 

¡Más Snippets, Más Opciones!

Al compartir, motivamos a más desarrolladores a contribuir. Ayúdanos a hacer de este directorio un punto de referencia en snippets.

Facebook
Twitter
LinkedIn
Telegram
WhatsApp

¿Cómo implementar este snippet en la web?

Tienes 2 opciones, una de ellas es mediante plugin y la otra pegando el código en tu web.

1. Añadir snippet con plugin

code-snippets

Code Snippets

Por Code Snippets Pro

  1. Descarga el plugin o búscalo en el repositorio de plugins de Wordpress e instálalo en tu web.
  2. En el menú lateral del Escritorio verás un nuevo enlace (Fragmetos de código). Ves a Fragmentos de código > Añadir nuevo.
  3. Se abrirá una página con un título, bloque de código, descripción y etiquetas, rellena el título con el que quieras guardarlo, ejemplo: Añadir Google Analytics.
  4. En la parte código verás que está activo PHP, ahí pega el código del snippet
  5. La descripción y las etiquetas solo son para tu información y para que luego encuentres más fácil los snippets.
  6. Publicar y activar el snippet.

2. Añadir snippet en el functions.php

Diseño web con WordPress

Accede al archivo functions.php de tu tema o tema hijo, pega el snippet y guarda el archivo.

Lo encontrarás en Apariencia > Editor de archivos de tema, pinchas sobre el enlace  functions.php y pegas el código al final del archivo.

Relacionados: