Besucherzähler-Plugin für WordPress mit KI erstellen lassen

ChatGPT erstellt dir ohne Ahnung von Programmierung ein Plugin, das die Aufrufe deiner Blockbeiträge zählt.

Auf der Suche nach einem einfachen Besucherzähler-Plugin für WordPress bin ich auf die Seite www.programmier-tipps.de gestoßen. Hier wird erklärt, wie man sich mithilfe der Programmiersprache PHP ein Counter Plugin für WordPress selbst ohne großen Aufwand erstellen kann. Inspiriert durch diesen Artikel, kam ich auf die Idee einmal zu testen, ob man sich einfache Plugins für WordPress nicht auch einfach mit KI (in meinem Fall ChatGPT) erstellen lassen kann. Also probieren wir es einmal aus.

Grafik: Gerd Altmann, pixabay.com

Und so einfach geht es!

Ich besitze das kostenpflichtige Abonnement ChatGPT Plus für ca. 20,- Euro im Monat und habe die Version 5.2 benutzt. Im Prinzip ist alles kinderleicht, man gibt seinen Wunsch oder Frage in das Formularfeld ein und bekommt ein fertiges Ergebnis präsentiert.

Meine Eingabe analog dem Besucherzähler von programmier-tipps.de

„programmiere mir ein plugin für WordPress, welches die zugriffe auf einzelene seiten oder beiträge zählt indem es die daten im table post_meta abspeichert und die besucher über die SessionID erkannt werden ohne ein eigenes cookie zu setzen und mit dem ich die Aufrufe per shortcode einbinden kann

Nach ca. 10 Sekunden wurde mir folgender Code angezeigt:

<?php
/**
 * Plugin Name: WP Session View Counter (Post Meta + Shortcode)
 * Description: Zählt Aufrufe von einzelnen Beiträgen/Seiten und speichert sie in post_meta. 
 * Dedupliziert pro PHP-Session. Ausgabe per Shortcode 92.
 * Version: 1.1.0
 * Author: Dein Name
 * License: GPLv2 or later
 */

if (!defined('ABSPATH')) exit;

final class WP_Session_View_Counter {
    const META_KEY          = '_wsvc_view_count';
    const SESSION_SEEN_KEY  = 'wsvc_seen_posts';
    const SESSION_OK_FLAG   = 'wsvc_session_started';

    public static function init(): void {
        add_action('init', [__CLASS__, 'maybe_start_session'], 1);
        add_action('template_redirect', [__CLASS__, 'maybe_count_view'], 20);
        add_shortcode('wsvc_views', [__CLASS__, 'shortcode_views']);
    }

    /**
     * Startet eine PHP-Session, wenn möglich.
     * Setzt kein eigenes Cookie – nutzt nur die PHP-Session-Mechanik.
     */
    public static function maybe_start_session(): void {
        // In diesen Kontexten brauchen wir keine Session.
        if (defined('DOING_CRON') && DOING_CRON) return;
        if (defined('WP_CLI') && WP_CLI) return;
        if (wp_doing_ajax()) return;
        if (defined('REST_REQUEST') && REST_REQUEST) return;

        if (headers_sent()) return;

        if (session_status() !== PHP_SESSION_ACTIVE) {
            // Keine URL-basierten Session IDs (Sicherheits/SEO-Gründe).
            @ini_set('session.use_only_cookies', '1');
            @ini_set('session.use_trans_sid', '0');

            @session_start();
        }

        if (session_status() === PHP_SESSION_ACTIVE) {
            $_SESSION[self::SESSION_OK_FLAG] = true;

            if (!isset($_SESSION[self::SESSION_SEEN_KEY]) || !is_array($_SESSION[self::SESSION_SEEN_KEY])) {
                $_SESSION[self::SESSION_SEEN_KEY] = [];
            }
        }
    }

    /**
     * Zählt nur auf Singular-Seiten (Beiträge/Seiten/CPT), pro Session nur einmal je Post.
     */
    public static function maybe_count_view(): void {
        if (!is_singular()) return;

        // Ohne aktive Session keine Session-Deduplizierung -> hier zählen wir dann bewusst NICHT.
        if (!isset($_SESSION) || empty($_SESSION[self::SESSION_OK_FLAG])) return;

        global $wp_query;
        if (empty($wp_query) || empty($wp_query->post) || !($wp_query->post instanceof WP_Post)) return;

        $post_id = (int) $wp_query->post->ID;
        if ($post_id <= 0) return;

        // Optional: Admins nicht zählen (kannst du entfernen, wenn du willst).
        if (is_user_logged_in() && current_user_can('manage_options')) return;

        // Dedupe pro Session
        if (in_array($post_id, $_SESSION[self::SESSION_SEEN_KEY], true)) {
            return;
        }
        $_SESSION[self::SESSION_SEEN_KEY][] = $post_id;

        self::atomic_increment_post_meta($post_id, self::META_KEY);
    }

    /**
     * "Atomisches" Inkrement über SQL (reduziert Race-Conditions bei gleichzeitigen Aufrufen).
     */
    private static function atomic_increment_post_meta(int $post_id, string $meta_key): void {
        global $wpdb;

        // meta_id suchen
        $meta_id = $wpdb->get_var(
            $wpdb->prepare(
                "SELECT meta_id FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = %s LIMIT 1",
                $post_id,
                $meta_key
            )
        );

        // Falls nicht vorhanden: anlegen
        if (!$meta_id) {
            add_post_meta($post_id, $meta_key, '0', true);

            $meta_id = $wpdb->get_var(
                $wpdb->prepare(
                    "SELECT meta_id FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = %s LIMIT 1",
                    $post_id,
                    $meta_key
                )
            );
        }

        if ($meta_id) {
            $wpdb->query(
                $wpdb->prepare(
                    "UPDATE {$wpdb->postmeta}
                     SET meta_value = CAST(meta_value AS UNSIGNED) + 1
                     WHERE meta_id = %d",
                    (int) $meta_id
                )
            );
        } else {
            // Fallback
            $current = (int) get_post_meta($post_id, $meta_key, true);
            update_post_meta($post_id, $meta_key, (string) ($current + 1));
        }
    }

    public static function get_views(int $post_id): int {
        return (int) get_post_meta($post_id, self::META_KEY, true);
    }

    /**
     * Shortcode: 92 oder 0 Aufrufe
     *
     * Attribute:
     * - post_id: 0/leer = aktueller Beitrag
     * - format:  plain | text
     * - label:   Textanhang bei format=text
     */
    public static function shortcode_views($atts): string {
        $atts = shortcode_atts([
            'post_id' => 0,
            'format'  => 'plain',
            'label'   => 'Aufrufe',
        ], $atts, 'wsvc_views');

        $post_id = (int) $atts['post_id'];
        if ($post_id <= 0) {
            $post_id = (int) get_the_ID();
        }
        if ($post_id <= 0) return '';

        $views = self::get_views($post_id);

        if ($atts['format'] === 'text') {
            return esc_html($views . ' ' . (string) $atts['label']);
        }

        return esc_html((string) $views);
    }
}

WP_Session_View_Counter::init();

/**
 * Optionaler Template-Helper:
 * echo esc_html( wsvc_get_views(get_the_ID()) );
 */
function wsvc_get_views(int $post_id): int {
    return WP_Session_View_Counter::get_views($post_id);
}
?>

Um das Plugin zu installieren und zu Testen gehen Sie wie folgt vor:

  1. Im Plugin-Verzeichnis (wp-content/plugins/) diesen Ordner anlegen:
    wp-session-view-counter
    (wp-content/plugins/session-views-counter/)
  2. Den Code in eine Textdatei kopieren und unter folgenden Namen speichern:
    session-views-counter.php
    Diese Datei in das angelegte Verzeichnis (wp-session-view-counter) kopieren.
  3. Plugin aktivieren

Diesen Text als Shortcode in die gewünschte Seite einfügen:

[wsvc_views format="text" label="Aufrufe"]

Hier ist das Ergebnis

92 Aufrufe

Kurzes Fazit

Der von ChatGPT generierte Code hat beim ersten Versuch sofort funktioniert. Es ist also möglich, sich einfache WordPress-Plugins ohne Programmierkenntnisse durch KI generieren zu lassen. Je genauer man seine Wünsche formuliert, um so besser wird natürlich auch der erstellte Code. In Zukunft werde ich versuchen auch abspruchsvollere Projekte umzusetzen und die Künstliche Intelligenz in die alltäglichen Arbeitsabläufe zu integrieren.