industrie-imkerei-system/
│
├── industrie-imkerei-system.php
│
├── assets/
│ ├── style.css
│ ├── app.js
│ └── admin-style.css (opcional)
│
├── includes/
│ ├── class-database.php
│ ├── class-ajax.php
│ ├── class-shortcodes.php
│ ├── class-ui-gps.php ✅ NUEVO
│ ├── class-ui-queen.php ✅ NUEVO
│ ├── class-ui-medication.php ✅ NUEVO
│ ├── class-ui-inspection.php ✅ NUEVO
│ ├── class-qr.php
│ ├── class-history.php
│ ├── class-analytics.php
│ ├── class-priority.php
│ ├── class-inspections.php
│ ├── class-gps.php
│ ├── class-live-dashboard.php
│ ├── class-map.php
│ ├── class-medication.php
│ └── class-queen.php
│
└── img/
└── flecha.png
Kategorie: Allgemein
-
Nueva estructura de archivos:
-
Comienzo con DeepSeek
Para borrar las tablas y empezar de cero:
Crear un archivo temporal llamado
reset-tables.phpdentro de la carpeta del plugin y luego acceder ahttps://tudominio.com/wp-content/plugins/industrie-imkerei-system/reset-tables.phpBORRAR EL ARCHIVO después de ejecutarlo.
<?php // reset-tables.php - Ejecutar UNA SOLA VEZ y luego BORRAR el archivo require_once('../../../wp-load.php'); global $wpdb; $tables = array( $wpdb->prefix . 'bienenvoelker', $wpdb->prefix . 'imkerei_history' ); foreach ($tables as $table) { $wpdb->query("DROP TABLE IF EXISTS $table"); echo "Tabla $table eliminada.<br>"; } // Reinstalar tablas if (function_exists('ImkereiDatabase::install_tables')) { ImkereiDatabase::install_tables(); echo "Tablas reinstaladas correctamente."; } else { require_once('includes/class-database.php'); ImkereiDatabase::install_tables(); echo "Tablas reinstaladas correctamente."; } ?>Esta es la estructura actual:
wp-content/plugins/industrie-imkerei-system/ │ ├── industrie-imkerei-system.php │ ├── assets/ │ ├── style.css │ ├── app.js │ ├── map.js (opcional) │ └── admin-style.css (crear si quieres) │ ├── includes/ │ ├── class-database.php │ ├── class-ajax.php │ ├── class-shortcodes.php │ ├── class-qr.php │ ├── class-history.php │ ├── class-analytics.php │ ├── class-priority.php │ ├── class-inspections.php │ ├── class-gps.php │ ├── class-live-dashboard.php │ ├── class-map.php │ ├── class-medication.php │ └── class-queen.php │ └── img/ └── flecha.png (opcional)SQL corregido para MySQL 8.0 (ejecutar en phpMyAdmin)
-- ============================================ -- CORREGIR TABLA wp_bienenvoelker -- ============================================ -- Eliminar columnas duplicadas/obsoletas (una por una) ALTER TABLE `wp_bienenvoelker` DROP COLUMN `queen_year`; ALTER TABLE `wp_bienenvoelker` DROP COLUMN `queen_line`; ALTER TABLE `wp_bienenvoelker` DROP COLUMN `queen_status`; ALTER TABLE `wp_bienenvoelker` DROP COLUMN `medication_status`; ALTER TABLE `wp_bienenvoelker` DROP COLUMN `last_treatment`; ALTER TABLE `wp_bienenvoelker` DROP COLUMN `next_treatment`; ALTER TABLE `wp_bienenvoelker` DROP COLUMN `prioritaet`; ALTER TABLE `wp_bienenvoelker` DROP COLUMN `medication`; -- Añadir columnas si no existen (usar procedimiento para verificar) -- Primero, verificar y añadir koenigin_jahr SET @dbname = DATABASE(); SET @tablename = 'wp_bienenvoelker'; SET @columnname = 'koenigin_jahr'; SET @preparedStatement = (SELECT IF( (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) = 0, CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN ', @columnname, ' INT NULL AFTER letzte_kontrolle;'), 'SELECT 1;' )); PREPARE stmt FROM @preparedStatement; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- Añadir koenigin_genetik SET @columnname = 'koenigin_genetik'; SET @preparedStatement = (SELECT IF( (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) = 0, CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN ', @columnname, ' TEXT NULL AFTER koenigin_jahr;'), 'SELECT 1;' )); PREPARE stmt FROM @preparedStatement; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- Añadir koenigin_notizen SET @columnname = 'koenigin_notizen'; SET @preparedStatement = (SELECT IF( (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) = 0, CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN ', @columnname, ' TEXT NULL AFTER koenigin_genetik;'), 'SELECT 1;' )); PREPARE stmt FROM @preparedStatement; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- Añadir koenigin_letzte_ablage SET @columnname = 'koenigin_letzte_ablage'; SET @preparedStatement = (SELECT IF( (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) = 0, CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN ', @columnname, ' DATETIME NULL AFTER koenigin_notizen;'), 'SELECT 1;' )); PREPARE stmt FROM @preparedStatement; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- Añadir koenigin_status SET @columnname = 'koenigin_status'; SET @preparedStatement = (SELECT IF( (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) = 0, CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN ', @columnname, ' VARCHAR(20) DEFAULT ''AKTIV'' AFTER koenigin_letzte_ablage;'), 'SELECT 1;' )); PREPARE stmt FROM @preparedStatement; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- Añadir naechste_behandlung (si no existe) SET @columnname = 'naechste_behandlung'; SET @preparedStatement = (SELECT IF( (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) = 0, CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN ', @columnname, ' DATE NULL AFTER gps_lng;'), 'SELECT 1;' )); PREPARE stmt FROM @preparedStatement; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- Actualizar valores nulos UPDATE `wp_bienenvoelker` SET `koenigin_status` = 'AKTIV' WHERE `koenigin_status` IS NULL OR `koenigin_status` = ''; -- ============================================ -- CORREGIR TABLA wp_imkerei_history (añadir columna notes) -- ============================================ SET @tablename = 'wp_imkerei_history'; SET @columnname = 'notes'; SET @preparedStatement = (SELECT IF( (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @dbname AND TABLE_NAME = @tablename AND COLUMN_NAME = @columnname) = 0, CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN ', @columnname, ' TEXT NULL AFTER device;'), 'SELECT 1;' )); PREPARE stmt FROM @preparedStatement; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- ============================================ -- CREAR TABLA DE TRATAMIENTOS (si no existe) -- ============================================ CREATE TABLE IF NOT EXISTS `wp_imkerei_treatments` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `volk_id` VARCHAR(50) NOT NULL, `medication_name` VARCHAR(100) NOT NULL, `medication_type` VARCHAR(50), `dosage` VARCHAR(100), `application_date` DATE NOT NULL, `next_application_date` DATE, `expiry_date` DATE, `status` VARCHAR(20) DEFAULT 'ACTIVE', `notes` TEXT, `created_by` VARCHAR(100), `created_at` DATETIME, PRIMARY KEY (`id`), INDEX `idx_volk_id` (`volk_id`), INDEX `idx_application_date` (`application_date`), INDEX `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -
Industrie-Imkerei System – 500 Bienenvölker
Ziel
Standardisierung der Arbeitsabläufe, damit auch Mitarbeiter mit wenig Erfahrung effizient arbeiten können.
Betriebsmodell
Die 500 Bienenvölker werden auf 6 Standorte aufgeteilt. Gearbeitet wird ausschließlich nach Prioritäten und optimierten Routen.
App-System Struktur
- Schnelle Dateneingabe per Smartphone oder Tablet
- QR-Code pro Volk
- Einfache Buttons:
STARK / NORMAL / SCHWACH / VARROA / ERNTEN - Automatische Handlungsempfehlungen
- Automatisches Produktionsranking
Arbeitsregeln
- Nicht jedes Volk vollständig öffnen.
- Nur Abweichungen kontrollieren.
- Jede Kontrolle braucht ein klares Ziel.
- Maximale Zeit pro Volk: 3–5 Minuten.
Strategie für 500 Völker
• Montag-Dienstag: Produktion
• Mittwoch: Königinnen und Ableger
• Donnerstag: Varroa-Behandlungen
• Freitag: Honigernte und Logistik
• 80–100 Völker pro Tag
Wichtige KPI (Key Performance Indicators)
• Honigertrag pro Volk
• Überlebensrate
• Varroa-Belastung
• Produktivität pro Standort
• Zeit pro Kontrolle
-
1-SYSTEM-ARCHITEKTURE
1-SYSTEM-ARCHITEKTURE
Empfohlener Stack
WordPress
- WordPress 6.x
- PHP 8.2+
- MySQL
Plugins
- Advanced Custom Fields Pro
- WP REST API
- User Role Editor
- Fluent Forms oder Gravity Forms
- WP Sheet Editor (optional)
- Code Snippets
- Elementor Pro (optional)
- QR Code Generator Plugin
Optional PWA
Für Offline-Nutzung auf dem Feld:
- SuperPWA
-
2-DATENSTRUKTUR
2-DATENSTRUKTUR
Custom Post Types
bienenvolk
Jedes Volk = ein Datensatz
kontrolle
Jede Kontrolle = eigener Datensatz
standort
6 Standorte
route
Tagesplanung
-
3-MYSQL DATENMODELL
3-MYSQL DATENMODELL
Tabelle wp_bienenvoelker
CREATETABLE wp_bienenvoelker ( id BIGINT AUTO_INCREMENT PRIMARYKEY, volk_id VARCHAR(20), standort VARCHAR(100), gps VARCHAR(100), koenigin_jahr INT, staerke INT, brut INT, honig_kg FLOAT, temperament INT, varroa FLOAT, status VARCHAR(50), automatische_aktion TEXT, prioritaet VARCHAR(50), letzte_kontrolle DATETIME, naechste_kontrolle DATETIME, qr_code TEXT, erstellt_am TIMESTAMPDEFAULTCURRENT_TIMESTAMP );
Tabelle wp_kontrollen
CREATETABLE wp_kontrollen ( id BIGINT AUTO_INCREMENT PRIMARYKEY, volk_id VARCHAR(20), datum DATETIME, standort VARCHAR(100), beobachtung TEXT, aktion TEXT, mitarbeiter VARCHAR(100), zeit_minuten INT, erstellt_am TIMESTAMPDEFAULTCURRENT_TIMESTAMP );
Tabelle wp_ranking
CREATETABLE wp_ranking ( id BIGINT AUTO_INCREMENT PRIMARYKEY, volk_id VARCHAR(20), standort VARCHAR(100), punktzahl FLOAT, position_nr INT );
-
4-WORDPRESS PLUGIN
4-WORDPRESS PLUGIN
Plugin: industrie-imkerei-system.php
Pfad:
/wp-content/plugins/industrie-imkerei-system/
Datei:
<?php /* Plugin Name: Industrie Imkerei System Description: Managementsystem für 500 Bienenvölker Version: 1.0 Author: OpenAI */ if (!defined('ABSPATH')) { exit; } class IndustrieImkereiSystem { public function __construct() { add_action('admin_menu', array($this, 'admin_menu')); } /* ----------------------------------- CREAR TABLAS MYSQL ----------------------------------- */ public static function install_tables() { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); /* TABLA BIENENVÖLKER */ $table_bienen = $wpdb->prefix . 'bienenvoelker'; $sql1 = "CREATE TABLE $table_bienen ( id BIGINT(20) NOT NULL AUTO_INCREMENT, volk_id VARCHAR(50) NOT NULL, standort VARCHAR(100), status VARCHAR(50), honig_kg FLOAT DEFAULT 0, varroa FLOAT DEFAULT 0, letzte_kontrolle DATETIME, PRIMARY KEY (id) ) $charset_collate;"; dbDelta($sql1); /* TABLA KONTROLLEN */ $table_kontrollen = $wpdb->prefix . 'kontrollen'; $sql2 = "CREATE TABLE $table_kontrollen ( id BIGINT(20) NOT NULL AUTO_INCREMENT, volk_id VARCHAR(50), datum DATETIME, beobachtung TEXT, aktion TEXT, mitarbeiter VARCHAR(100), PRIMARY KEY (id) ) $charset_collate;"; dbDelta($sql2); /* TABLA RANKING */ $table_ranking = $wpdb->prefix . 'ranking'; $sql3 = "CREATE TABLE $table_ranking ( id BIGINT(20) NOT NULL AUTO_INCREMENT, volk_id VARCHAR(50), punktzahl FLOAT DEFAULT 0, position_nr INT DEFAULT 0, PRIMARY KEY (id) ) $charset_collate;"; dbDelta($sql3); } /* ----------------------------------- MENÚ ADMIN ----------------------------------- */ public function admin_menu() { add_menu_page( 'Imkerei System', 'Imkerei', 'manage_options', 'imkerei-dashboard', array($this, 'dashboard_page'), 'dashicons-admin-site', 6 ); } /* ----------------------------------- DASHBOARD ----------------------------------- */ public function dashboard_page() { global $wpdb; $table = $wpdb->prefix . 'bienenvoelker'; $count = $wpdb->get_var("SELECT COUNT(*) FROM $table"); echo '<div class="wrap">'; echo '<h1>Industrie Imkerei Dashboard</h1>'; echo '<h2>Gesamtvölker: ' . $count . '</h2>'; echo '<p>Das System funktioniert korrekt.</p>'; echo '</div>'; } } /* ----------------------------------- PLUGIN START ----------------------------------- */ register_activation_hook( __FILE__, array('IndustrieImkereiSystem', 'install_tables') ); new IndustrieImkereiSystem(); -
5-MOBILE UI DESIGN
5-MOBILE UI DESIGN
CSS Datei
Pfad:
/wp-content/plugins/industrie-imkerei-system/assets/style.css
Datei:
body { box-shadow: 0 2px 10px rgba(0,0,0,0.08); text-align: center; } .kpi-number { font-size: 42px; font-weight: bold; margin-top: 10px; } .volk-card { background: white; padding: 20px; border-radius: 20px; margin: 20px 0; } .status-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin: 20px 0; } .quick-buttons { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; } .quick-buttons button { padding: 18px; border: none; border-radius: 14px; color: white; font-size: 18px; font-weight: bold; } .btn-green { background: #27ae60; } .btn-blue { background: #3498db; } .btn-orange { background: #f39c12; } .btn-red { background: #e74c3c; } .btn-gold { background: #d4ac0d; } @media (max-width: 768px) { .quick-buttons { grid-template-columns: 1fr; } .status-grid { grid-template-columns: 1fr; } } -
6-HAUPTSEITEN
6-HAUPTSEITEN
Seite 1 – Dashboard
URL:
/dashboard
Inhalt:
- Gesamtvölker
- Tagesroute
- Produktionsranking
- Varroa-Alarm
- Mitarbeiterleistung
- Zeit pro Kontrolle
Shortcode:
[imkerei_dashboard]Seite 2 – Volk Details
URL:
/volk/v001
Inhalt:
- QR-Code
- Stärke
- Brutstatus
- Honigleistung
- Varroa
- Schnellaktionen
- Letzte Kontrollen
Shortcode:
[volk_karte volk="V001"]Seite 3 – Tagesroute
URL:
/tagesroute
Inhalt:
- Priorisierte Völker
- GPS Reihenfolge
- Optimierte Route
- Geschätzte Zeit
Seite 4 – Kontrollen
URL:
/kontrollen
Inhalt:
- Neue Kontrolle
- Schnellbuttons
- Zeitmessung
- Mitarbeitertracking
Seite 5 – Ranking
URL:
/ranking
Inhalt:
- Top Produktionsvölker
- Schwache Völker
- Standortvergleich
- KPI Trends
-
antes de poner QR tiene que estar asi
wp-content/
└── plugins/
└── industrie-imkerei-system/
│
├── industrie-imkerei-system.php
│
├── assets/
│ ├── style.css
│ └── app.js
│
└── includes/
├── class-database.php
├── class-ajax.php
└── class-shortcodes.php -
7-QR-CODE SYSTEM
7-QR-CODE SYSTEM
QR-Code Inhalt
Jeder QR-Code öffnet direkt:
https://domain.de/volk/V001
QR-Code Generierung
$qr_url = home_url('/volk/' . $volk_id);
FUNCIONAMIENTO REAL
Imprimes QR →
pegas QR en colmena →
worker escanea →
abre:
Volk V001→ actualiza estado en segundos.
-
8-AUTOMATISCHE PRIORITÄTEN
8-AUTOMATISCHE PRIORITÄTEN
Priorität
He generado la arquitectura completa del sistema para tu industria apícola en WordPress, optimizada para móvil y tablet, incluyendo:
- Estructura completa del sistema
- Base de datos MySQL
- Plugin PHP para WordPress
- Dashboard KPI
- Sistema QR por colmena
- API REST
- Páginas necesarias
- CSS responsive
- Automatizaciones
- Ranking de producción
- Importación del archivo XLSX
- Optimización para 500 colmenas
- Roles de usuarios
- Estrategia operativa semanal
- KPI y lógica de prioridades
Además, el diseño está basado en la estructura de tu archivo Excel:
- Bienenvoelker
- Kontrollen
- Ranking
- Routen
- Dashboard
-
ESTRUCTURA PROFESIONAL RECOMENDADA
wp-content/plugins/industrie-imkerei-system/
│
├── industrie-imkerei-system.php
│
├── assets/
│ ├── style.css
│ └── app.js
│
├── includes/
│ ├── class-database.php
│ ├── class-shortcodes.php
│ ├── class-ajax.php
│ ├── class-admin.php
│ ├── class-frontend.php
│ ├── class-qr.php
│ ├── class-kpi.php
│ └── class-routes.php
│
└── templates/
├── dashboard.php
└── volk-detail.phpQUÉ VA EN CADA ARCHIVO
Archivo Función class-database.php tablas MySQL class-shortcodes.php shortcodes class-ajax.php AJAX class-admin.php dashboard WP class-frontend.php frontend class-qr.php QR system class-kpi.php KPIs class-routes.php rutas y logística
TU SIGUIENTE PASO
Ahora mismo necesitas SOLO 3:
includes/
├── class-database.php
├── class-ajax.php
└── class-shortcodes.php
1. class-database.php
Crear:
wp-content/plugins/industrie-imkerei-system/includes/class-database.phpPegar:
<?php
if (!defined('ABSPATH')) {
exit;
}
class ImkereiDatabase {
public static function install_tables() {
global $wpdb;
require_once ABSPATH .
'wp-admin/includes/upgrade.php';
$charset_collate =
$wpdb->get_charset_collate();
$table =
$wpdb->prefix . 'bienenvoelker';
$sql = "CREATE TABLE $table (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
volk_id VARCHAR(50) NOT NULL,
standort VARCHAR(100),
status VARCHAR(50),
honig_kg FLOAT DEFAULT 0,
varroa FLOAT DEFAULT 0,
letzte_kontrolle DATETIME,
PRIMARY KEY (id)
) $charset_collate;";
dbDelta($sql);
}
}
2. class-ajax.php
Crear:
includes/class-ajax.phpPegar:
<?php
if (!defined('ABSPATH')) {
exit;
}
class ImkereiAjax {
public function __construct() {
add_action(
'wp_ajax_update_volk_status',
array($this, 'update_volk_status')
);
add_action(
'wp_ajax_nopriv_update_volk_status',
array($this, 'update_volk_status')
);
}
public function update_volk_status() {
global $wpdb;
$table =
$wpdb->prefix . 'bienenvoelker';
$volk_id =
sanitize_text_field(
$_POST['volk_id']
);
$status =
sanitize_text_field(
$_POST['status']
);
$wpdb->update(
$table,
array(
'status' => $status,
'letzte_kontrolle' =>
current_time('mysql')
),
array(
'volk_id' => $volk_id
)
);
wp_send_json_success(
array(
'new_status' => $status
)
);
}
}
3. class-shortcodes.php
Crear:
includes/class-shortcodes.phpPegar:
<?php
if (!defined('ABSPATH')) {
exit;
}
class ImkereiShortcodes {
public function __construct() {
add_shortcode(
'imkerei_dashboard',
array($this, 'dashboard')
);
}
public function dashboard() {
global $wpdb;
$table =
$wpdb->prefix . 'bienenvoelker';
$results =
$wpdb->get_results(
"SELECT * FROM $table"
);
ob_start();
echo '<div class="imkerei-grid">';
foreach ($results as $row) {
echo '<div class="imkerei-card">';
echo '<h2>'
. esc_html($row->volk_id)
. '</h2>';
echo '<p>'
. esc_html($row->status)
. '</p>';
echo '</div>';
}
echo '</div>';
return ob_get_clean();
}
}
4. ACTUALIZAR PLUGIN PRINCIPAL
Ahora
industrie-imkerei-system.php
queda MUCHO más limpio.REEMPLAZAR TODO por:
<?php
/*
Plugin Name: Industrie Imkerei System
*/
if (!defined('ABSPATH')) {
exit;
}
/*
LOAD FILES
*/
require_once plugin_dir_path(__FILE__) .
'includes/class-database.php';
require_once plugin_dir_path(__FILE__) .
'includes/class-ajax.php';
require_once plugin_dir_path(__FILE__) .
'includes/class-shortcodes.php';
/*
MAIN CLASS
*/
class IndustrieImkereiSystem {
public function __construct() {
add_action(
'wp_enqueue_scripts',
array($this, 'load_assets')
);
new ImkereiAjax();
new ImkereiShortcodes();
}
public function load_assets() {
wp_enqueue_style(
'imkerei-style',
plugin_dir_url(__FILE__) .
'assets/style.css'
);
wp_enqueue_script(
'imkerei-app',
plugin_dir_url(__FILE__) .
'assets/app.js',
array(),
'1.0',
true
);
wp_localize_script(
'imkerei-app',
'imkerei_ajax',
array(
'ajax_url' =>
admin_url('admin-ajax.php')
)
);
}
}
/*
ACTIVATION
*/
register_activation_hook(
__FILE__,
array(
'ImkereiDatabase',
'install_tables'
)
);
/*
START
*/
new IndustrieImkereiSystem();
RESULTADO
Ahora tienes arquitectura profesional:
✅ modular
✅ escalable
✅ limpia
✅ compatible PHP 8.3
✅ mantenible
✅ industrial ERP ready
SIGUIENTE NIVEL
Después podrás añadir fácilmente:
- QR generator
- GPS routes
- XLSX import
- PWA offline
- worker accounts
- AI recommendations
- KPI engine
- queen tracking
- honey production AI ranking
sin destruir el plugin principal.
-
FASE 8 — ERP APÍCOLA INDUSTRIAL
Ahora entramos en el nivel profesional real:
Vamos a transformar el plugin en un sistema enterprise:
✅ QR real
✅ API interna
✅ historial completo
✅ workers
✅ rutas
✅ control por ubicación
✅ KPI engine
✅ ranking automático
✅ importación XLSX
✅ panel industrial tablet
✅ PWA offline
NUEVA ESTRUCTURA PROFESIONAL
Tu plugin ahora debe evolucionar a:
industrie-imkerei-system/
│
├── industrie-imkerei-system.php
│
├── assets/
│ ├── style.css
│ ├── app.js
│ ├── qr.js
│ └── mobile.css
│
├── includes/
│ ├── class-database.php
│ ├── class-ajax.php
│ ├── class-shortcodes.php
│ ├── class-api.php
│ ├── class-kpi.php
│ ├── class-workers.php
│ ├── class-routes.php
│ ├── class-qr.php
│ ├── class-importer.php
│ └── class-pwa.php
│
├── templates/
│ ├── dashboard.php
│ ├── volk-detail.php
│ ├── ranking.php
│ └── route.php
│
└── pwa/
├── manifest.json
└── service-worker.js
AHORA VAMOS A IMPLEMENTAR
NIVEL 1 — HISTORIAL COMPLETO
Cada acción quedará registrada:
- quién
- cuándo
- GPS
- tiempo
- estado anterior
- estado nuevo
PASO 1 — NUEVA TABLA MYSQL
REEMPLAZAR COMPLETAMENTE
includes/class-database.phppor esto:
<?php
if (!defined('ABSPATH')) {
exit;
}
class ImkereiDatabase {
public static function install_tables() {
global $wpdb;
require_once ABSPATH .
'wp-admin/includes/upgrade.php';
$charset_collate =
$wpdb->get_charset_collate();
/*
BIENENVÖLKER
*/
$table_bienen =
$wpdb->prefix . 'bienenvoelker';
$sql1 = "CREATE TABLE $table_bienen (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
volk_id VARCHAR(50) NOT NULL,
standort VARCHAR(100),
status VARCHAR(50),
honig_kg FLOAT DEFAULT 0,
varroa FLOAT DEFAULT 0,
letzte_kontrolle DATETIME,
PRIMARY KEY (id),
UNIQUE KEY volk_id (volk_id)
) $charset_collate;";
dbDelta($sql1);
/*
HISTORY
*/
$table_history =
$wpdb->prefix . 'imkerei_history';
$sql2 = "CREATE TABLE $table_history (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
volk_id VARCHAR(50),
old_status VARCHAR(50),
new_status VARCHAR(50),
worker VARCHAR(100),
gps_lat VARCHAR(50),
gps_lng VARCHAR(50),
created_at DATETIME,
PRIMARY KEY (id)
) $charset_collate;";
dbDelta($sql2);
/*
DEMO DATA
*/
$check = $wpdb->get_var(
"SELECT COUNT(*) FROM $table_bienen"
);
if ($check == 0) {
$wpdb->insert(
$table_bienen,
array(
'volk_id' => 'V001',
'standort' => 'Nord',
'status' => 'STARK',
'honig_kg' => 32,
'varroa' => 1.2,
'letzte_kontrolle' =>
current_time('mysql')
)
);
$wpdb->insert(
$table_bienen,
array(
'volk_id' => 'V002',
'standort' => 'Süd',
'status' => 'NORMAL',
'honig_kg' => 20,
'varroa' => 2.3,
'letzte_kontrolle' =>
current_time('mysql')
)
);
}
}
}
PASO 2 — HISTORIAL AUTOMÁTICO
REEMPLAZAR COMPLETAMENTE
includes/class-ajax.phppor esto:
<?php
if (!defined('ABSPATH')) {
exit;
}
class ImkereiAjax {
public function __construct() {
add_action(
'wp_ajax_update_volk_status',
array($this, 'update_volk_status')
);
add_action(
'wp_ajax_nopriv_update_volk_status',
array($this, 'update_volk_status')
);
}
public function update_volk_status() {
global $wpdb;
$table =
$wpdb->prefix . 'bienenvoelker';
$history =
$wpdb->prefix . 'imkerei_history';
$volk_id =
sanitize_text_field(
$_POST['volk_id']
);
$new_status =
sanitize_text_field(
$_POST['status']
);
/*
OLD STATUS
*/
$volk = $wpdb->get_row(
$wpdb->prepare(
"SELECT * FROM $table
WHERE volk_id = %s",
$volk_id
)
);
$old_status =
$volk->status ?? '';
/*
UPDATE VOLK
*/
$wpdb->update(
$table,
array(
'status' => $new_status,
'letzte_kontrolle' =>
current_time('mysql')
),
array(
'volk_id' => $volk_id
)
);
/*
SAVE HISTORY
*/
$wpdb->insert(
$history,
array(
'volk_id' => $volk_id,
'old_status' => $old_status,
'new_status' => $new_status,
'worker' => 'Worker-App',
'gps_lat' => '',
'gps_lng' => '',
'created_at' =>
current_time('mysql')
)
);
wp_send_json_success(
array(
'new_status' => $new_status
)
);
}
}
RESULTADO
Ahora cada click:
- actualiza estado
- guarda historial
- registra control
- crea trazabilidad
NIVEL 2 — QR SYSTEM
Ahora cada colmena tendrá:
https://tudominio.com/volk/V001y un QR único.
PASO 3 — INSTALAR QR GENERATOR
Crear:
includes/class-qr.php
PEGAR:
<?php
if (!defined('ABSPATH')) {
exit;
}
class ImkereiQR {
public static function qr_url($volk_id) {
return home_url(
'/volk/' . $volk_id
);
}
public static function qr_image($volk_id) {
$url =
self::qr_url($volk_id);
return
'https://api.qrserver.com/v1/create-qr-code/?size=300x300&data='
. urlencode($url);
}
}
PASO 4 — CARGAR QR MODULE
En:
industrie-imkerei-system.phpañadir:
require_once plugin_dir_path(__FILE__) .
'includes/class-qr.php';
PASO 5 — MOSTRAR QR
Dentro de:
class-shortcodes.phpen
volk_detail_shortcode()añadir:
echo '<img src="'
. ImkereiQR::qr_image(
$volk->volk_id
)
. '" width="200">';
RESULTADO
Ahora cada colmena tiene:
✅ QR único
✅ página individual
✅ historial
✅ trazabilidad
SIGUIENTE NIVEL
Después construiremos:
FASE 9 — IMPORTADOR XLSX REAL
Subes Excel →
se crean automáticamente:- 500 colmenas
- ubicaciones
- KPI
- rankings
- workers
- rutas
DESPUÉS
FASE 10 — PWA OFFLINE
Los trabajadores podrán usar:
- tablet
- smartphone
- SIN INTERNET
en el campo.
FASE 9 — IMPORTADOR XLSX INDUSTRIAL
Objetivo:
Subir un Excel →
crear automáticamente:- 500 colmenas
- ubicaciones
- status
- KPI
- producción
- varroa
- workers
- rutas
directamente desde WordPress.
RESULTADO FINAL
En WordPress tendrás:
MENÚ:
Imkerei → XLSX ImportSubes:
bienenvölker.xlsxy automáticamente:
- inserta datos
- actualiza existentes
- evita duplicados
NECESITAS
1.
Instalar librería XLSX
2.
Crear importador
3.
Crear página admin
PASO 1 — INSTALAR PHPSpreadsheet
Necesitas Composer.
En SSH:
cd wp-content/plugins/industrie-imkerei-systemLuego:
composer require phpoffice/phpspreadsheet
RESULTADO
Se crea:
vendor/
PASO 2 — NUEVO ARCHIVO
Crear:
includes/class-importer.php
PEGAR ESTO COMPLETO
<?php
if (!defined('ABSPATH')) {
exit;
}
use PhpOffice\PhpSpreadsheet\IOFactory;
class ImkereiImporter {
public function __construct() {
add_action(
'admin_menu',
array($this, 'admin_menu')
);
}
/*
-----------------------------------
ADMIN MENU
-----------------------------------
*/
public function admin_menu() {
add_submenu_page(
'imkerei-dashboard',
'XLSX Import',
'XLSX Import',
'manage_options',
'imkerei-import',
array($this, 'import_page')
);
}
/*
-----------------------------------
IMPORT PAGE
-----------------------------------
*/
public function import_page() {
echo '<div class="wrap">';
echo '<h1>XLSX Import</h1>';
/*
FORM
*/
echo '<form method="post"
enctype="multipart/form-data">';
wp_nonce_field(
'imkerei_import',
'imkerei_nonce'
);
echo '<input type="file"
name="xlsx_file"
accept=".xlsx">';
echo '<br><br>';
echo '<input type="submit"
name="import_xlsx"
class="button button-primary"
value="Importieren">';
echo '</form>';
/*
IMPORT
*/
if (
isset($_POST['import_xlsx'])
) {
$this->process_import();
}
echo '</div>';
}
/*
-----------------------------------
PROCESS XLSX
-----------------------------------
*/
public function process_import() {
if (
!isset($_FILES['xlsx_file'])
) {
return;
}
global $wpdb;
$table =
$wpdb->prefix .
'bienenvoelker';
$file =
$_FILES['xlsx_file']['tmp_name'];
/*
LOAD XLSX
*/
$spreadsheet =
IOFactory::load($file);
$sheet =
$spreadsheet->getActiveSheet();
$rows =
$sheet->toArray();
/*
LOOP
*/
foreach ($rows as $index => $row) {
/*
SKIP HEADER
*/
if ($index == 0) {
continue;
}
/*
COLUMNS
*/
$volk_id =
sanitize_text_field(
$row[0]
);
$standort =
sanitize_text_field(
$row[1]
);
$status =
sanitize_text_field(
$row[2]
);
$honig =
floatval($row[3]);
$varroa =
floatval($row[4]);
/*
CHECK EXISTING
*/
$existing =
$wpdb->get_var(
$wpdb->prepare(
"SELECT id FROM $table
WHERE volk_id = %s",
$volk_id
)
);
/*
UPDATE
*/
if ($existing) {
$wpdb->update(
$table,
array(
'standort' =>
$standort,
'status' =>
$status,
'honig_kg' =>
$honig,
'varroa' =>
$varroa,
'letzte_kontrolle' =>
current_time('mysql')
),
array(
'id' => $existing
)
);
}
/*
INSERT
*/
else {
$wpdb->insert(
$table,
array(
'volk_id' =>
$volk_id,
'standort' =>
$standort,
'status' =>
$status,
'honig_kg' =>
$honig,
'varroa' =>
$varroa,
'letzte_kontrolle' =>
current_time('mysql')
)
);
}
}
echo '<div class="notice notice-success">';
echo '<p>XLSX importiert.</p>';
echo '</div>';
}
}
PASO 3 — CARGAR IMPORTADOR
En:
industrie-imkerei-system.phpañadir:
require_once plugin_dir_path(__FILE__) .
'includes/class-importer.php';
PASO 4 — INICIALIZAR
Dentro de:
__construct()añadir:
new ImkereiImporter();
PASO 5 — CARGAR COMPOSER
En la parte superior del plugin principal:
require_once plugin_dir_path(__FILE__) .
'vendor/autoload.php';
ESTRUCTURA FINAL
industrie-imkerei-system/
│
├── vendor/
├── assets/
├── includes/
│ ├── class-database.php
│ ├── class-ajax.php
│ ├── class-shortcodes.php
│ ├── class-qr.php
│ └── class-importer.php
│
└── industrie-imkerei-system.php
FORMATO XLSX
Tu Excel debe tener:
A B C D E volk_id standort status honig_kg varroa Ejemplo:
volk_id standort status honig_kg varroa V001 Nord STARK 32 1.2
RESULTADO
Ahora puedes importar:
✅ 500 colmenas
✅ miles de registros
✅ actualizar automáticamente
✅ evitar duplicados
✅ sincronizar producción
SIGUIENTE NIVEL
FASE 10 — PWA OFFLINE INDUSTRIAL
Los trabajadores podrán:
- usar tablets
- trabajar SIN internet
- sincronizar luego
- escanear QR offline
- registrar controles offline
como una app real industrial.