wake-up-neo.net

Wordpress register_activation_hook Tabellenerstellung funktioniert nicht

Ich habe eine einfache Klasse für mein WordPress-Plugin erstellt. Die Hauptdatei sieht folgendermaßen aus:

<?php
/*
 * Plugin Name: Codes
 * Description: Generates a coupon code after checkout
 * Version: 0.1.0
 * Author: XXX
 */

require_once('inc/DatabaseUtils.php');

$codes = new Codes();

class Codes {

    private $databaseUtils;

    /**
     * Create a new instance 
     *
     * @param null
     * @return void
     */
    function __construct() {
        $this->regsiter_hooks();
        $this->databaseUtils = new DatabaseUtils();
    }

    /**
     * Called on plugin activation
     *
     * @param null
     * @return void
     */
    function activate() {
        $this->databaseUtils->setup_codes_table();
    }

    /**
     * Called on plugin deactivation
     *
     * @param null
     * @return void
     */
    function deactivate() {

    }

    /**
     * Register plugin hooks
     *
     * @param null
     * @return void
     */
    function regsiter_hooks() {
        register_activation_hook(__File__, array($this, 'activate'));
        register_deactivation_hook(__File__, array($this, 'deactivate'));
    }
}

Im Ordner ´inc´ habe ich eine DatabaseUtils.php Datei. Dies ist eine Klasse mit einer Funktion zum Erstellen einer Tabelle in der WordPress-Datenbank nach dem Aktivieren des Plugins. Hier der Inhalt:

<?php

class DatabaseUtils {

    function setup_codes_table() {
        global $wpdb;
        global $charset_collate;
        $table_name = $wpdb->prefix . 'pin';
         $sql = "CREATE TABLE IF NOT EXISTS $table_name (
          `id` bigint(20) NOT NULL AUTO_INCREMENT,
          `pincode` bignit(128) DEFAULT NOT NULL,
           PRIMARY KEY (`id`)   
        )$charset_collate;";
         require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
         dbDelta( $sql );
    }

}

Wenn Sie sehen, rufe ich die Funktion in der Aktivierungsmethode in meiner Hauptdatei auf. Aber wenn ich das Plugin aktiviere, gibt es keine neue Tabelle in meiner Datenbank.

Hat jemand eine Idee warum? Gibt es eine Möglichkeit, den register_activation_hook zu debuggen?

Danke für Ihre Hilfe!

2
Markus

Die SQL zum Erstellen von Tabellen in dbDelta() hat sehr spezifische Anforderungen. Aus dem Codex :

  • Sie müssen jedes Feld in Ihrer SQL-Anweisung in eine eigene Zeile setzen.
  • Zwischen den Wörtern PRIMARY KEY und der Definition Ihres Primärschlüssels müssen zwei Leerzeichen stehen.
  • Sie müssen das Schlüsselwort KEY anstelle des Synonymes INDEX verwenden und mindestens einen KEY angeben.
  • Nach KEY muss ein EINZELNES LEERTASTE folgen, dann der Schlüsselname, dann ein Leerzeichen und dann eine offene Klammer mit dem Feldnamen und dann eine geschlossene Klammer.
  • Sie dürfen keine Apostrophe oder Backticks um Feldnamen verwenden.
  • Feldtypen müssen in Kleinbuchstaben angegeben werden.
  • SQL-Schlüsselwörter wie CREATE TABLE und UPDATE müssen in Großbuchstaben geschrieben werden.
  • Sie müssen die Länge aller Felder angeben, die einen Längenparameter akzeptieren. int (11) zum Beispiel.

IF NOT EXISTS sollte auch bei Verwendung von dbDelta() nicht erforderlich sein. Der Zweck besteht darin, Änderungen an der Datenbank nur dann automatisch vorzunehmen, wenn sie auf der Basis von SQL erforderlich sind.

Ihr SQL sollte also so aussehen:

$sql = "CREATE TABLE $table_name (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    pincode bigint(128) NOT NULL,
    PRIMARY KEY  (id)   
) $charset_collate;";

In Ihrem SQL fehlten die 2 Leerzeichen nach PRIMARY KEY. Sie hatten auch einen Tippfehler, in dem stattdessen bignit steht, wenn bigint für pincode und DEFAULT NOT NULL kein gültiges SQL ist, sollte es einfach NOT NULL sein.

Ich habe auch die Backticks entfernt und vor $charset_collate; ein Leerzeichen eingefügt, um mit dem Stil im Codex übereinzustimmen, aber ich bin nicht sicher, ob sie Probleme verursachen würden.

3
Jacob Peattie