web-dev-qa-db-fra.com

Le plugin a généré x caractères de sortie inattendue, $ wpdb non défini

J'ai écrit un simple plugin Wordpress pour créer une nouvelle table de base de données. La nouvelle table doit être créée lorsque le plugin est activé. Lorsque j'essaie d'activer le plugin, j'obtiens le message d'erreur suivant:

The plugin generated 3989 characters of unexpected output during activation. If you notice “headers already sent” messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.

texte souligné Ceci est évidemment dû au fait que $ wbdb n'est pas défini. xDebug génère les éléments suivants:

[Mon Feb 04 ] [error] PHP Notice:  Undefined variable: wpdb in test.php on line 13

L'ensemble du plugin comprend les éléments suivants:

<?php

/**
 * Plugin Name: Test Plugin
 * Plugin URI: http://everybytcaptive.com
 * Description: A test plugin.
 * Version: 1.0
 * Author: Christopher Green
 * Author URI: http://everybytecaptive.com
 */

$test_db_name = $wpdb->prefix . 'test_db_name';

function test_install_plugin() {
    global $wpdb;
    global $test_db_name;

    $sql = "CREATE TABLE " . $test_db_name . " (
        `id` int(9) NOT NULL AUTO_INCREMENT,
        UNIQUE KEY id (id)
    );";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}

register_activation_hook(__FILE__,'test_install_plugin');

?>

Je n'ai pas d'autres plugins installés. Pourquoi $ wpdb n'est-il pas défini? Existe-t-il un moyen standard de créer une nouvelle table de base de données lors de l'activation d'un plugin?

2
cg433n

$wpdb est en dehors de la portée de votre fichier de plugin, vous avez besoin de global $wpdb; avant d'utiliser $wpdb->prefix

2
Milo

Votre plugin tente d'accéder à $ wpdb avant qu'il n'existe. Vous devez l'envelopper dans un crochet d'action , comme suit:

<?php

/**
 * Plugin Name: Test Plugin
 * Plugin URI: http://everybytcaptive.com
 * Description: A test plugin.
 * Version: 1.0
 * Author: Christopher Green
 * Author URI: http://everybytecaptive.com
 */

add_action( 'init', 'test_install_plugin' );

function test_install_plugin() {
    global $wpdb;
    global $test_db_name;

    $test_db_name = $wpdb->prefix . 'test_db_name';

    $sql = "CREATE TABLE " . $test_db_name . " (
        `id` int(9) NOT NULL AUTO_INCREMENT,
        UNIQUE KEY id (id)
    );";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}

// commented out for now, worry about running activation later
// register_activation_hook(__FILE__,'test_install_plugin');

Je recommande fortement de dévorer tout ce que vous pouvez trouver avec Google concernant les actions et les filtres dans WordPress. Ce sont des concepts de base que vous devez comprendre pour pouvoir créer des plugins et des thèmes de manière efficace.

1
akTed