From a3c08127f80cd570d11eb6c54b4e113c5c8883cc Mon Sep 17 00:00:00 2001 From: ProgrammGamer Date: Sun, 1 Feb 2026 19:26:18 +0100 Subject: [PATCH 1/6] Release 1.0 notes + fixes: remove kc_phasen query, init $debug_output; add CHANGELOG and link from README --- CHANGELOG.md | 16 ++++++++++++++++ README.md | 4 ++++ includes/admin-workshops.php | 5 +++-- includes/frontend-form.php | 10 ++-------- 4 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ef279da --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +All notable changes to this project are documented in this file. + +## [1.0] - 2026-02-01 +### Added +- Initial release of the KonfiCastle Workshop-Wahlen plugin (Admin backend, participant frontend, assignment logic, CSV export, teamer password management). +- Shortcodes: `[konficastle_workshopwahl wahl=ID]`, `[konficastle_workshop_ergebnis wahl=ID]`. + +### Fixed +- Removed query against non-existent table `kc_phasen`; phases are derived from `kc_wahlen.anzahl_einheiten`. See [includes/admin-workshops.php](includes/admin-workshops.php). +- Initialized `$debug_output` to prevent PHP warning in frontend. See [includes/frontend-form.php](includes/frontend-form.php). + +### Notes +- Database tables use WordPress prefix via `$wpdb->prefix`. +- Force assignments have priority over automatic allocation. diff --git a/README.md b/README.md index 157bba0..dad92b6 100644 --- a/README.md +++ b/README.md @@ -48,3 +48,7 @@ Dieses WordPress-Plugin ermöglicht die Verwaltung und Durchführung von Worksho Für Detailfragen zu Datenbankstruktur, Shortcodes oder Zuteilungslogik siehe die jeweiligen Dateien im `includes/`-Verzeichnis. +## Release Notes + +Siehe die ausführlichen Hinweise zur Version 1.0 in [RELEASE_NOTES.md](RELEASE_NOTES.md). + diff --git a/includes/admin-workshops.php b/includes/admin-workshops.php index a03c672..d06296f 100644 --- a/includes/admin-workshops.php +++ b/includes/admin-workshops.php @@ -10,8 +10,9 @@ function kc_workshops_page() { // Liste aller Wahlen für Auswahl $wahlen_liste = $wpdb->get_results("SELECT * FROM {$prefix}kc_wahlen ORDER BY id DESC"); - // Liste aller Phasen für Auswahl - $phasen_liste = $wpdb->get_results("SELECT * FROM {$prefix}kc_phasen ORDER BY nummer"); + // Phasen werden pro Wahl über die Spalte `anzahl_einheiten` in `kc_wahlen` bestimmt. + // Eine separate Tabelle `kc_phasen` wird nicht benötigt. + $phasen_liste = []; // Workshop löschen if (isset($_GET['delete_workshop'])) { diff --git a/includes/frontend-form.php b/includes/frontend-form.php index d0be839..a706958 100644 --- a/includes/frontend-form.php +++ b/includes/frontend-form.php @@ -5,14 +5,8 @@ add_shortcode('konficastle_workshopwahl', function($atts) { global $wpdb; - // KRITISCHER TEST: Ausgabe ganz am Anfang - //$debug_output = '
'; - //$debug_output .= '

DEBUG INFO

'; - //$debug_output .= 'Shortcode läuft!
'; - //$debug_output .= 'REQUEST_METHOD: ' . ($_SERVER['REQUEST_METHOD'] ?? 'NICHT GESETZT') . '
'; - //$debug_output .= 'POST vorhanden: ' . (empty($_POST) ? 'NEIN' : 'JA') . '
'; - //$debug_output .= 'POST Inhalt:
' . print_r($_POST, true) . '
'; - //$debug_output .= '
'; + // Optionales Debug-Ausgabe-Fragment (standardmäßig leer, um Warnungen zu vermeiden) + $debug_output = ''; $wahl = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}kc_wahlen WHERE id=%d", $wahl_id)); if(!$wahl || !$wahl->freigegeben) { -- 2.49.1 From 92c4023fff3234f5d59c004072e7152d76b9877e Mon Sep 17 00:00:00 2001 From: ProgrammGamer Date: Sun, 1 Feb 2026 19:28:37 +0100 Subject: [PATCH 2/6] Move CHANGELOG to Notes/CHANGELOG.md and update README link --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dad92b6..6bf6cfb 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,9 @@ Dieses WordPress-Plugin ermöglicht die Verwaltung und Durchführung von Worksho Für Detailfragen zu Datenbankstruktur, Shortcodes oder Zuteilungslogik siehe die jeweiligen Dateien im `includes/`-Verzeichnis. -## Release Notes +## Release Notes & Changelog Siehe die ausführlichen Hinweise zur Version 1.0 in [RELEASE_NOTES.md](RELEASE_NOTES.md). +Das fortlaufende Changelog befindet sich im Ordner [Notes/CHANGELOG.md](Notes/CHANGELOG.md). + -- 2.49.1 From 3f207a361230db6dd11efdfcb971ada1b534fa8d Mon Sep 17 00:00:00 2001 From: ProgrammGamer Date: Sun, 1 Feb 2026 19:28:52 +0100 Subject: [PATCH 3/6] 0# Git commit message --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 6bf6cfb..dad92b6 100644 --- a/README.md +++ b/README.md @@ -48,9 +48,7 @@ Dieses WordPress-Plugin ermöglicht die Verwaltung und Durchführung von Worksho Für Detailfragen zu Datenbankstruktur, Shortcodes oder Zuteilungslogik siehe die jeweiligen Dateien im `includes/`-Verzeichnis. -## Release Notes & Changelog +## Release Notes Siehe die ausführlichen Hinweise zur Version 1.0 in [RELEASE_NOTES.md](RELEASE_NOTES.md). -Das fortlaufende Changelog befindet sich im Ordner [Notes/CHANGELOG.md](Notes/CHANGELOG.md). - -- 2.49.1 From 271af99fad0e349a62643fe7c0574e193b70150b Mon Sep 17 00:00:00 2001 From: ProgrammGamer Date: Fri, 6 Feb 2026 15:51:51 +0100 Subject: [PATCH 4/6] deleted: CHANGELOG.md --- CHANGELOG.md | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index ef279da..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,16 +0,0 @@ -# Changelog - -All notable changes to this project are documented in this file. - -## [1.0] - 2026-02-01 -### Added -- Initial release of the KonfiCastle Workshop-Wahlen plugin (Admin backend, participant frontend, assignment logic, CSV export, teamer password management). -- Shortcodes: `[konficastle_workshopwahl wahl=ID]`, `[konficastle_workshop_ergebnis wahl=ID]`. - -### Fixed -- Removed query against non-existent table `kc_phasen`; phases are derived from `kc_wahlen.anzahl_einheiten`. See [includes/admin-workshops.php](includes/admin-workshops.php). -- Initialized `$debug_output` to prevent PHP warning in frontend. See [includes/frontend-form.php](includes/frontend-form.php). - -### Notes -- Database tables use WordPress prefix via `$wpdb->prefix`. -- Force assignments have priority over automatic allocation. -- 2.49.1 From 077ba03a3fcf0e5d29d1f6590f7d793da95bcecc Mon Sep 17 00:00:00 2001 From: ProgrammGamer Date: Fri, 6 Feb 2026 19:39:35 +0100 Subject: [PATCH 5/6] update deploy.yml to implement new wp host --- .gitea/workflows/deploy.yml | 82 ++++++++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 10 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 62d2b7d..15221d4 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -51,17 +51,79 @@ jobs: # ===================== # PROD DEPLOY (FTP) # ===================== - - name: Deploy to PROD via FTP + - name: Deploy to PROD via Docker (SSH) if: github.ref == 'refs/heads/main' + env: + SSH_HOST: ${{ secrets.PROD_SSH_HOST }} + SSH_USER: ${{ secrets.PROD_SSH_USER }} + SSH_PORT: ${{ secrets.PROD_SSH_PORT }} + SSH_KEY: ${{ secrets.PROD_SSH_PRIVATE_KEY }} + WP_CONTAINER: ${{ secrets.PROD_WP_CONTAINER }} + WP_PLUGIN_PATH: ${{ secrets.PROD_WP_PLUGIN_PATH }} + HOST_PLUGIN_PATH: ${{ secrets.PROD_HOST_PLUGIN_PATH }} run: | + set -euo pipefail apt-get update - apt-get install -y lftp + # docker-cli needed to talk to remote engine; openssh-client to auth; tar for packaging with excludes + apt-get install -y docker.io openssh-client tar - lftp -u "${{ secrets.FTP_USER }},${{ secrets.FTP_PASS }}" ftp://${{ secrets.FTP_HOST }}:${{ secrets.FTP_PORT }} < ~/.ssh/prod_docker_key + chmod 600 ~/.ssh/prod_docker_key + + # Write SSH config so DOCKER_HOST can reference a named host + cat > ~/.ssh/config <> ~/.ssh/known_hosts || true + + # Point docker CLI to remote engine over SSH + export DOCKER_HOST=ssh://prod-docker + + # Sanity checks + docker info > /dev/null + docker ps --format 'table {{.Names}}\t{{.Status}}' + + # Defaults if path not provided + : "${WP_PLUGIN_PATH:=/var/www/html/wp-content/plugins/konficastle-workshopwahl}" + + # Create a tarball with excludes to avoid copying VCS and CI folders + TAR_FILE="/tmp/kc-plugin.tar.gz" + tar -czf "$TAR_FILE" \ + --exclude .git \ + --exclude .gitea \ + --exclude .github \ + --exclude Notes \ + --exclude "*.yml" \ + --exclude "*.yaml" \ + --exclude "*.md" \ + . + + if [ -n "${HOST_PLUGIN_PATH}" ]; then + echo "Deploying to host path relative to root's home: ~/${HOST_PLUGIN_PATH}" + # Upload tarball to host home and extract to ~/${HOST_PLUGIN_PATH} + scp -o StrictHostKeyChecking=accept-new -i ~/.ssh/prod_docker_key "$TAR_FILE" prod-docker:~/kc-plugin.tar.gz + ssh prod-docker "mkdir -p \"~/${HOST_PLUGIN_PATH}\" && rm -rf \"~/${HOST_PLUGIN_PATH}\"/* && tar -xzf \"~/kc-plugin.tar.gz\" -C \"~/${HOST_PLUGIN_PATH}\" && rm -f \"~/kc-plugin.tar.gz\"" + # Verify on host + ssh prod-docker "ls -la \"~/${HOST_PLUGIN_PATH}\" | head -n 50" + else + echo "Deploying directly into container plugin path" + # Defaults if path not provided (container path) + : "${WP_PLUGIN_PATH:=/var/www/html/wp-content/plugins/konficastle-workshopwahl}" + + # Copy tarball into the container + docker cp "$TAR_FILE" "${WP_CONTAINER}:/tmp/kc-plugin.tar.gz" + + # Replace plugin contents inside the container and clean up + docker exec "${WP_CONTAINER}" bash -lc "mkdir -p '${WP_PLUGIN_PATH}' && rm -rf '${WP_PLUGIN_PATH}'/* && tar -xzf /tmp/kc-plugin.tar.gz -C '${WP_PLUGIN_PATH}' && rm -f /tmp/kc-plugin.tar.gz" + # List deployed files for verification inside container + docker exec "${WP_CONTAINER}" bash -lc "ls -la '${WP_PLUGIN_PATH}' | head -n 50" + fi -- 2.49.1 From a65651358ae8bf3815efe8660663db49a3ddc60f Mon Sep 17 00:00:00 2001 From: ProgrammGamer Date: Fri, 6 Feb 2026 19:40:17 +0100 Subject: [PATCH 6/6] upstream develop --- .gitea/workflows/deploy.yml | 58 +++++++++++++++---------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 15221d4..86d1d88 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -51,25 +51,25 @@ jobs: # ===================== # PROD DEPLOY (FTP) # ===================== - - name: Deploy to PROD via Docker (SSH) + - name: Deploy to PROD via SSH if: github.ref == 'refs/heads/main' env: SSH_HOST: ${{ secrets.PROD_SSH_HOST }} SSH_USER: ${{ secrets.PROD_SSH_USER }} SSH_PORT: ${{ secrets.PROD_SSH_PORT }} SSH_KEY: ${{ secrets.PROD_SSH_PRIVATE_KEY }} - WP_CONTAINER: ${{ secrets.PROD_WP_CONTAINER }} - WP_PLUGIN_PATH: ${{ secrets.PROD_WP_PLUGIN_PATH }} - HOST_PLUGIN_PATH: ${{ secrets.PROD_HOST_PLUGIN_PATH }} + HOST_WP_ROOT: ${{ secrets.PROD_HOST_WP_ROOT }} + HOST_ABS_PLUGIN_PATH: ${{ secrets.PROD_HOST_ABS_PLUGIN_PATH }} run: | set -euo pipefail apt-get update - # docker-cli needed to talk to remote engine; openssh-client to auth; tar for packaging with excludes - apt-get install -y docker.io openssh-client tar + # openssh-client to auth; tar for packaging with excludes + apt-get install -y openssh-client tar # Prepare SSH key mkdir -p ~/.ssh - echo "$SSH_KEY" > ~/.ssh/prod_docker_key + # Write the multiline private key exactly as provided + printf "%s\n" "$SSH_KEY" > ~/.ssh/prod_docker_key chmod 600 ~/.ssh/prod_docker_key # Write SSH config so DOCKER_HOST can reference a named host @@ -79,22 +79,14 @@ jobs: User ${SSH_USER} Port ${SSH_PORT} IdentityFile ~/.ssh/prod_docker_key + IdentitiesOnly yes + PubkeyAuthentication yes StrictHostKeyChecking accept-new CFG # Prime known_hosts (optional, StrictHostKeyChecking accept-new will handle first connect) ssh-keyscan -p "$SSH_PORT" "$SSH_HOST" >> ~/.ssh/known_hosts || true - # Point docker CLI to remote engine over SSH - export DOCKER_HOST=ssh://prod-docker - - # Sanity checks - docker info > /dev/null - docker ps --format 'table {{.Names}}\t{{.Status}}' - - # Defaults if path not provided - : "${WP_PLUGIN_PATH:=/var/www/html/wp-content/plugins/konficastle-workshopwahl}" - # Create a tarball with excludes to avoid copying VCS and CI folders TAR_FILE="/tmp/kc-plugin.tar.gz" tar -czf "$TAR_FILE" \ @@ -107,23 +99,19 @@ jobs: --exclude "*.md" \ . - if [ -n "${HOST_PLUGIN_PATH}" ]; then - echo "Deploying to host path relative to root's home: ~/${HOST_PLUGIN_PATH}" - # Upload tarball to host home and extract to ~/${HOST_PLUGIN_PATH} - scp -o StrictHostKeyChecking=accept-new -i ~/.ssh/prod_docker_key "$TAR_FILE" prod-docker:~/kc-plugin.tar.gz - ssh prod-docker "mkdir -p \"~/${HOST_PLUGIN_PATH}\" && rm -rf \"~/${HOST_PLUGIN_PATH}\"/* && tar -xzf \"~/kc-plugin.tar.gz\" -C \"~/${HOST_PLUGIN_PATH}\" && rm -f \"~/kc-plugin.tar.gz\"" - # Verify on host - ssh prod-docker "ls -la \"~/${HOST_PLUGIN_PATH}\" | head -n 50" + # Choose target path: prefer absolute plugin path; otherwise derive from HOST_WP_ROOT + if [ -n "${HOST_ABS_PLUGIN_PATH}" ]; then + echo "Deploying to absolute host path: ${HOST_ABS_PLUGIN_PATH}" + REMOTE_PATH_DECL="PLUGIN_PATH=\"${HOST_ABS_PLUGIN_PATH%/}\"" + elif [ -n "${HOST_WP_ROOT}" ]; then + echo "Deploying to host path relative to remote home: \$HOME/${HOST_WP_ROOT%/}/wp-content/plugins/konficastle-workshopwahl" + REMOTE_PATH_DECL="PLUGIN_PATH=\$HOME/${HOST_WP_ROOT%/}/wp-content/plugins/konficastle-workshopwahl" else - echo "Deploying directly into container plugin path" - # Defaults if path not provided (container path) - : "${WP_PLUGIN_PATH:=/var/www/html/wp-content/plugins/konficastle-workshopwahl}" - - # Copy tarball into the container - docker cp "$TAR_FILE" "${WP_CONTAINER}:/tmp/kc-plugin.tar.gz" - - # Replace plugin contents inside the container and clean up - docker exec "${WP_CONTAINER}" bash -lc "mkdir -p '${WP_PLUGIN_PATH}' && rm -rf '${WP_PLUGIN_PATH}'/* && tar -xzf /tmp/kc-plugin.tar.gz -C '${WP_PLUGIN_PATH}' && rm -f /tmp/kc-plugin.tar.gz" - # List deployed files for verification inside container - docker exec "${WP_CONTAINER}" bash -lc "ls -la '${WP_PLUGIN_PATH}' | head -n 50" + echo "Error: set PROD_HOST_ABS_PLUGIN_PATH (absolute) or PROD_HOST_WP_ROOT (relative)" >&2 + exit 1 fi + + # Upload tarball to host home and extract + scp -o StrictHostKeyChecking=accept-new -o IdentitiesOnly=yes -i ~/.ssh/prod_docker_key "$TAR_FILE" prod-docker:~/kc-plugin.tar.gz + # Use \$HOME for remote expansion (tilde does not expand inside quotes) + ssh prod-docker "$REMOTE_PATH_DECL; mkdir -p \"\$PLUGIN_PATH\" && rm -rf \"\$PLUGIN_PATH\"/* && tar -xzf \"\$HOME/kc-plugin.tar.gz\" -C \"\$PLUGIN_PATH\" && rm -f \"\$HOME/kc-plugin.tar.gz\" && ls -la \"\$PLUGIN_PATH\" | head -n 50" -- 2.49.1