web-dev-qa-db-ja.com

プラグインはx文字の予期しない出力を生成しました、$ wpdbは定義されていません

新しいデータベーステーブルを作成するための簡単なWordpressプラグインを書きました。新しいテーブルはプラグインがアクティブになったときに作成されるべきです。プラグインを有効にしようとすると、次のエラーが発生します。

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.

強調テキストこれは明らかに$ wbdbが定義されていないという事実の結果です。 xDebugは以下を出力します。

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

プラグイン全体は次のもので構成されています。

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

?>

他のプラグインがインストールされていません。 $ wpdbが定義されていないのはなぜですか?プラグインをアクティブにするときに新しいデータベーステーブルを作成する標準的な方法はありますか?

2
cg433n

$wpdbはプラグインファイルの範囲外です、global $wpdb;を使う前に$wpdb->prefixが必要です

2
Milo

あなたのプラグインは、それが存在する前に$ wpdbにアクセスしようとしています。次のように、 アクションフック で囲む必要があります。

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

WordPressのアクションやフィルタに関して、Googleで見つけることができるすべてのものを貪ることを強くお勧めします。これらは、プラグインとテーマを効果的に作成するために完全に理解する必要がある中心的な概念です。

1
akTed