First commit, plugin works!
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
<?php
|
||||
/**
|
||||
* Plugin Name: WordPress Activity Stats
|
||||
* Description: Wtyczka do śledzenia statystyk sportowych (Rower, Bieganie, itp.).
|
||||
* Version: 1.0
|
||||
* Author: Jacek Fefliński
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
// --- 1. INSTALACJA BAZY DANYCH (AKTYWACJA) ---
|
||||
register_activation_hook( __FILE__, 'mystat_activate' );
|
||||
|
||||
function mystat_activate() {
|
||||
global $wpdb;
|
||||
$charset_collate = $wpdb->get_charset_collate();
|
||||
|
||||
$table_categories = $wpdb->prefix . 'mystat_categories';
|
||||
$table_activities = $wpdb->prefix . 'mystat_activities';
|
||||
|
||||
// SQL dla Kategorii
|
||||
$sql_cat = "CREATE TABLE $table_categories (
|
||||
id mediumint(9) NOT NULL AUTO_INCREMENT,
|
||||
name varchar(50) NOT NULL,
|
||||
icon varchar(50) NOT NULL,
|
||||
color varchar(20) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
) $charset_collate;";
|
||||
|
||||
// SQL dla Aktywności
|
||||
$sql_act = "CREATE TABLE $table_activities (
|
||||
id bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
category_id mediumint(9) NOT NULL,
|
||||
date date NOT NULL,
|
||||
distance decimal(10,2) DEFAULT 0.00,
|
||||
duration time DEFAULT '00:00:00',
|
||||
calories int(11) DEFAULT 0,
|
||||
comment text,
|
||||
PRIMARY KEY (id)
|
||||
) $charset_collate;";
|
||||
|
||||
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
|
||||
dbDelta( $sql_cat );
|
||||
dbDelta( $sql_act );
|
||||
|
||||
// Dodanie domyślnych kategorii, jeśli tabela jest pusta
|
||||
if ( $wpdb->get_var( "SELECT COUNT(*) FROM $table_categories" ) == 0 ) {
|
||||
$wpdb->insert( $table_categories, array( 'name' => 'Rower', 'icon' => 'dashicons-buddicons-groups', 'color' => '#3498db' ) );
|
||||
$wpdb->insert( $table_categories, array( 'name' => 'Bieganie', 'icon' => 'dashicons-businessman', 'color' => '#e74c3c' ) );
|
||||
}
|
||||
}
|
||||
|
||||
// --- 2. MENU ADMINA I DASHBOARD ---
|
||||
add_action( 'admin_menu', 'mystat_add_admin_menu' );
|
||||
|
||||
function mystat_add_admin_menu() {
|
||||
add_menu_page( 'Moje Statystyki', 'Statystyki', 'manage_options', 'moje-statystyki', 'mystat_dashboard_page', 'dashicons-chart-line', 6 );
|
||||
}
|
||||
|
||||
function mystat_dashboard_page() {
|
||||
echo '<div class="wrap"><h1>Moje Statystyki Sportowe</h1>';
|
||||
mystat_render_history_table();
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
function mystat_render_history_table() {
|
||||
global $wpdb;
|
||||
|
||||
// Definicje nazw tabel (z uwzględnieniem prefixu WP, jeśli był użyty przy tworzeniu)
|
||||
// Zakładam, że tabele nazywają się dokładnie tak jak w dokumentacji, ale dobrą praktyką jest $wpdb->prefix
|
||||
// Jeśli tabele są "sztywne" (bez prefixu wp_), usuń $wpdb->prefix.
|
||||
$table_activities = $wpdb->prefix . 'mystat_activities';
|
||||
$table_categories = $wpdb->prefix . 'mystat_categories';
|
||||
|
||||
// --- 1. OBSŁUGA USUWANIA (DELETE) ---
|
||||
if ( isset( $_GET['action'], $_GET['id'], $_GET['_wpnonce'] ) && $_GET['action'] === 'mystat_delete' ) {
|
||||
$activity_id = intval( $_GET['id'] );
|
||||
|
||||
// Weryfikacja bezpieczeństwa (Nonce)
|
||||
if ( wp_verify_nonce( $_GET['_wpnonce'], 'mystat_delete_' . $activity_id ) ) {
|
||||
$result = $wpdb->delete(
|
||||
$table_activities,
|
||||
array( 'id' => $activity_id ),
|
||||
array( '%d' )
|
||||
);
|
||||
|
||||
if ( $result ) {
|
||||
echo '<div class="notice notice-success is-dismissible"><p>Aktywność została usunięta.</p></div>';
|
||||
} else {
|
||||
echo '<div class="notice notice-error is-dismissible"><p>Wystąpił błąd podczas usuwania.</p></div>';
|
||||
}
|
||||
} else {
|
||||
echo '<div class="notice notice-error is-dismissible"><p>Błąd weryfikacji bezpieczeństwa (Nonce).</p></div>';
|
||||
}
|
||||
}
|
||||
|
||||
// --- 2. POBIERANIE DANYCH (SELECT) ---
|
||||
// Pobieramy ostatnie 10 wpisów, łącząc z tabelą kategorii, aby mieć nazwę i ikonę
|
||||
$sql = "
|
||||
SELECT a.*, c.name as category_name, c.icon, c.color
|
||||
FROM $table_activities a
|
||||
LEFT JOIN $table_categories c ON a.category_id = c.id
|
||||
ORDER BY a.date DESC, a.id DESC
|
||||
LIMIT 10
|
||||
";
|
||||
|
||||
$activities = $wpdb->get_results( $sql );
|
||||
|
||||
// --- 3. WIDOK TABELI (HTML) ---
|
||||
?>
|
||||
<div class="wrap">
|
||||
<h2>Ostatnie Aktywności</h2>
|
||||
|
||||
<table class="wp-list-table widefat fixed striped table-view-list">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" style="width: 50px;">Ikona</th>
|
||||
<th scope="col">Data</th>
|
||||
<th scope="col">Kategoria</th>
|
||||
<th scope="col">Dystans (km)</th>
|
||||
<th scope="col">Czas</th>
|
||||
<th scope="col">Kcal</th>
|
||||
<th scope="col">Komentarz</th>
|
||||
<th scope="col" style="width: 80px;">Akcja</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if ( ! empty( $activities ) ) : ?>
|
||||
<?php foreach ( $activities as $row ) : ?>
|
||||
<?php
|
||||
// Generowanie URL do usuwania z Nonce
|
||||
$delete_url = add_query_arg( array(
|
||||
'page' => $_REQUEST['page'], // Zachowaj obecną stronę admina
|
||||
'action' => 'mystat_delete',
|
||||
'id' => $row->id,
|
||||
'_wpnonce' => wp_create_nonce( 'mystat_delete_' . $row->id )
|
||||
), admin_url( 'admin.php' ) );
|
||||
?>
|
||||
<tr>
|
||||
<td>
|
||||
<?php if ( ! empty( $row->icon ) ) : ?>
|
||||
<span class="dashicons <?php echo esc_attr( $row->icon ); ?>" style="color: <?php echo esc_attr( $row->color ); ?>;"></span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td><?php echo esc_html( $row->date ); ?></td>
|
||||
<td><strong><?php echo esc_html( $row->category_name ); ?></strong></td>
|
||||
<td><?php echo number_format( $row->distance, 2, ',', ' ' ); ?></td>
|
||||
<td><?php echo esc_html( $row->duration ); ?></td>
|
||||
<td><?php echo esc_html( $row->calories ); ?></td>
|
||||
<td><?php echo esc_html( wp_trim_words( $row->comment, 5 ) ); ?></td>
|
||||
<td>
|
||||
<a href="<?php echo esc_url( $delete_url ); ?>"
|
||||
class="button button-small button-link-delete"
|
||||
onclick="return confirm('Czy na pewno chcesz usunąć ten wpis?');">
|
||||
Usuń
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php else : ?>
|
||||
<tr>
|
||||
<td colspan="8">Brak zarejestrowanych aktywności. Dodaj pierwszy trening powyżej!</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user