web-dev-qa-db-fra.com

Wordpress register_activation_hook la création de la table ne fonctionne pas

J'ai créé un cours simple pour mon plugin wordpress. Le fichier principal ressemble à ceci:

<?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'));
    }
}

Dans le dossier "inc", j'ai un fichier DatabaseUtils.php. Ceci est une classe avec une fonction pour créer une table dans la base de données wordpress après avoir activé le plugin. Voici le contenu:

<?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 );
    }

}

Si vous voyez, j'appelle la fonction dans la méthode d'activation dans mon fichier principal. Mais quand j'active le plugin, il n'y a pas de nouvelle table dans ma base.

Est-ce que quelqu'un a une idée pourquoi? Est-il possible de déboguer le register_activation_hook?

Merci de votre aide!

2
Markus

Le SQL pour la création de tables dans dbDelta() a des exigences très spécifiques. De le codex :

  • Vous devez mettre chaque champ sur sa propre ligne dans votre instruction SQL.
  • Vous devez avoir deux espaces entre les mots PRIMARY KEY et la définition de votre clé primaire.
  • Vous devez utiliser la clé Word KEY plutôt que son synonyme INDEX et vous devez inclure au moins une clé.
  • KEY doit être suivi d'un seul espace puis du nom de la clé puis d'un espace puis d'une parenthèse ouverte avec le nom du champ puis d'une parenthèse fermée.
  • Vous ne devez pas utiliser d'apostrophes ni de backticks autour des noms de champs.
  • Les types de champs doivent être en minuscules.
  • Les mots clés SQL, tels que CREATE TABLE et UPDATE, doivent être en majuscules.
  • Vous devez spécifier la longueur de tous les champs qui acceptent un paramètre de longueur. int (11), par exemple.

IF NOT EXISTS ne devrait pas non plus être nécessaire lors de l'utilisation de dbDelta(), dont le but est uniquement d'apporter automatiquement des modifications à la base de données, si elles sont nécessaires en fonction du code SQL.

Donc, votre code SQL devrait ressembler à ceci:

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

Votre code SQL manquait des 2 espaces après PRIMARY KEY. Vous avez également eu une faute de frappe dans laquelle il est indiqué bignit à la place si bigint pour pincode et DEFAULT NOT NULL n'est pas une instruction SQL valide, il doit simplement s'agir de NOT NULL.

J'ai également supprimé les backticks et ajouté un espace avant $charset_collate; pour être cohérent avec le style du codex, mais je ne suis pas sûr qu'ils causeraient des problèmes.

3
Jacob Peattie