This commit is contained in:
2026-01-27 13:16:42 +01:00
parent 78808c6ab0
commit e860847af5
+155
View File
@@ -211,6 +211,15 @@ function mystat_add_admin_menu() {
'mystat-yearly-summary', // Slug podmenu 'mystat-yearly-summary', // Slug podmenu
'mystat_yearly_summary_page'// Funkcja renderująca 'mystat_yearly_summary_page'// Funkcja renderująca
); );
add_submenu_page(
'moje-statystyki', // Slug rodzica
'Infografika', // Tytuł strony
'Infografika', // Tytuł w podmenu
'manage_options', // Wymagane uprawnienia
'mystat-infographic', // Slug podmenu
'mystat_infographic_page' // Funkcja renderująca
);
} }
function mystat_dashboard_page() { function mystat_dashboard_page() {
@@ -591,6 +600,152 @@ function mystat_get_track_from_gpx_url( $gpx_url ) {
return $points; return $points;
} }
function mystat_infographic_page() {
global $wpdb;
$table_activities = $wpdb->prefix . 'mystat_activities';
$table_categories = $wpdb->prefix . 'mystat_categories';
$current_year = isset( $_GET['year'] ) ? intval( $_GET['year'] ) : current_time( 'Y' );
// Pobierz dostępne lata z bazy danych
$available_years = $wpdb->get_col( "SELECT DISTINCT YEAR(date) FROM $table_activities ORDER BY YEAR(date) DESC" );
if ( empty( $available_years ) ) {
$available_years = [current_time('Y')]; // Domyślny rok, jeśli brak danych
}
// --- 1. Statystyki ogólne (wszystkie lata) ---
$overall_stats = $wpdb->get_row("
SELECT
SUM(distance) as total_distance,
SEC_TO_TIME(SUM(TIME_TO_SEC(duration))) as total_duration,
SUM(total_elevation_gain) as total_elevation_gain,
COUNT(id) as total_activities
FROM $table_activities
");
// --- 2. Statystyki dla wybranego roku ---
$yearly_stats = $wpdb->get_row($wpdb->prepare("
SELECT
SUM(distance) as total_distance,
SEC_TO_TIME(SUM(TIME_TO_SEC(duration))) as total_duration,
SUM(total_elevation_gain) as total_elevation_gain,
COUNT(id) as total_activities
FROM $table_activities
WHERE YEAR(date) = %d
", $current_year));
// --- 3. Dane dla wykresu kołowego (dystans per kategoria dla wybranego roku) ---
$category_distance_data = $wpdb->get_results($wpdb->prepare("
SELECT c.name as category_name, c.color, SUM(a.distance) as total_distance
FROM $table_activities a
LEFT JOIN $table_categories c ON a.category_id = c.id
WHERE YEAR(a.date) = %d
GROUP BY c.name, c.color
HAVING SUM(a.distance) > 0
ORDER BY total_distance DESC
", $current_year));
$chart_labels = [];
$chart_data = [];
$chart_colors = [];
foreach ($category_distance_data as $data) {
$chart_labels[] = $data->category_name;
$chart_data[] = round((float)$data->total_distance, 2);
$chart_colors[] = $data->color;
}
// Włączenie skryptów dla Chart.js
wp_enqueue_script('chart-js', 'https://cdn.jsdelivr.net/npm/chart.js', [], null, true);
wp_register_script('mystat-infographic-chart-loader', false);
wp_enqueue_script('mystat-infographic-chart-loader');
wp_add_inline_script('mystat-infographic-chart-loader', '
document.addEventListener("DOMContentLoaded", function() {
const ctx = document.getElementById("mystatCategoryPieChart");
if (!ctx) return;
new Chart(ctx, {
type: "pie",
data: {
labels: ' . json_encode($chart_labels) . ',
datasets: [{
data: ' . json_encode($chart_data) . ',
backgroundColor: ' . json_encode($chart_colors) . ',
hoverOffset: 4
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
position: "right",
},
title: {
display: true,
text: "Dystans wg kategorii w ' . esc_js($current_year) . '"
}
}
}
});
});
');
?>
<div class="wrap">
<h1>Infografika Statystyk Sportowych</h1>
<div class="tablenav top">
<div class="alignleft actions">
<form method="get" style="display: flex; gap: 5px; align-items: center;">
<input type="hidden" name="page" value="mystat-infographic">
<label for="filter-by-year" class="screen-reader-text">Filtruj według roku</label>
<select name="year" id="filter-by-year">
<?php foreach ( $available_years as $year_option ) : ?>
<option value="<?php echo esc_attr( $year_option ); ?>" <?php selected( $current_year, $year_option ); ?>><?php echo esc_html( $year_option ); ?></option>
<?php endforeach; ?>
</select>
<?php submit_button( 'Filtruj', 'secondary', 'filter_action', false ); ?>
</form>
</div>
</div>
<div class="postbox" style="margin-bottom: 20px;">
<div class="postbox-header"><h2 class="hndle">Statystyki Ogólne (wszystkie lata)</h2></div>
<div class="inside mystat-infographic-grid">
<div class="mystat-infographic-card"><h3>Dystans</h3><p><?php echo number_format($overall_stats->total_distance, 2, ',', ' '); ?> km</p></div>
<div class="mystat-infographic-card"><h3>Czas</h3><p><?php echo esc_html($overall_stats->total_duration); ?></p></div>
<div class="mystat-infographic-card"><h3>Wznios</h3><p><?php echo number_format($overall_stats->total_elevation_gain, 0, ',', ' '); ?> m</p></div>
<div class="mystat-infographic-card"><h3>Aktywności</h3><p><?php echo number_format($overall_stats->total_activities, 0, ',', ' '); ?></p></div>
</div>
</div>
<div class="postbox" style="margin-bottom: 20px;">
<div class="postbox-header"><h2 class="hndle">Statystyki dla <?php echo esc_html($current_year); ?></h2></div>
<div class="inside mystat-infographic-grid">
<div class="mystat-infographic-card"><h3>Dystans</h3><p><?php echo number_format($yearly_stats->total_distance, 2, ',', ' '); ?> km</p></div>
<div class="mystat-infographic-card"><h3>Czas</h3><p><?php echo esc_html($yearly_stats->total_duration); ?></p></div>
<div class="mystat-infographic-card"><h3>Wznios</h3><p><?php echo number_format($yearly_stats->total_elevation_gain, 0, ',', ' '); ?> m</p></div>
<div class="mystat-infographic-card"><h3>Aktywności</h3><p><?php echo number_format($yearly_stats->total_activities, 0, ',', ' '); ?></p></div>
</div>
</div>
<div class="postbox" style="margin-bottom: 20px;">
<div class="postbox-header"><h2 class="hndle">Rozkład Dystansu wg Kategorii w <?php echo esc_html($current_year); ?></h2></div>
<div class="inside">
<div style="position: relative; height:40vh; width:100%; max-width: 600px; margin: 0 auto;">
<canvas id="mystatCategoryPieChart"></canvas>
</div>
</div>
</div>
</div>
<style>
.mystat-infographic-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; }
.mystat-infographic-card { background: #fff; border: 1px solid #e0e0e0; border-radius: 5px; padding: 15px; text-align: center; box-shadow: 0 2px 4px rgba(0,0,0,0.05); }
.mystat-infographic-card h3 { margin-top: 0; color: #555; font-size: 1.1em; }
.mystat-infographic-card p { font-size: 1.8em; font-weight: bold; color: #333; margin-bottom: 0; }
</style>
<?php
}
function mystat_edit_activity_page() { function mystat_edit_activity_page() {
global $wpdb; global $wpdb;
$activity_id = isset( $_GET['id'] ) ? intval( $_GET['id'] ) : 0; $activity_id = isset( $_GET['id'] ) ? intval( $_GET['id'] ) : 0;