我正在創建一個插件,需要創建一個數據庫並向其中插入數據,我創建了表的部分,但每當我嘗試使用$wpdb
來插入數據說insert() could not be called on a null object
。
下面是一個最小的版本:
<?php
/*
Plugin Name: Test
*/
function activation() {
global $wpdb;
$table_name = $wpdb->prefix . 'testing';
$charset_collate = $wpdb->get_charset_collate();
# create table
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
$sql = "CREATE TABLE " . $table_name . " (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name TEXT NOT NULL,
PRIMARY KEY (id)
) " . $charset_collate . ";";
require_once(ABSPATH . "wp-admin/includes/upgrade.php");
dbDelta($sql);
}
}
function html($atts) {
$out = "";
return "<form action='wp-content/plugins/test/submit.php' method='post'><input type='text' name='name'><input type='submit' name='submit'></form>";
}
# setup and cleanup hooks
register_activation_hook(__FILE__, "activation");
add_shortcode('testing', 'html');
這裏是表單提交的文件:
<?php
function handle() {
global $wpdb;
if (isset($_POST['submit'])) {
$wpdb->insert('wp_testing', array('name' => "test"));
}
}
handle();
我讀了這個問題:$wpdb is null even after 'global $wpdb,這是非常清楚,但似乎表明$wpdb
絕在一個函數中使用,所以我把它包裝在一個。任何想法,爲什麼這是?
名稱僅適用於這個小例子,我在實際工程中比較獨特的名字。這是否給我這個錯誤'調用未定義的函數add_action()'。只有在提交表單時才應該運行這個文件,那麼在那個時候全局文件不會被加載? –
如果'add_action'未定義,則WordPress不會加載,這是別處的問題。是的 - 使用鉤子將意味着它在每次頁面加載時全局偵聽,但是if語句是在提交表單時告訴它運行的。唯一不全球監聽的方法是將其切換到ajax調用並通過ajax發佈您的表單。 –
,所以通過加入require('path/to/wp-load.php')並切換回剛纔運行的'handle()'我就可以使用它了。如果我用'add_action'來試試這個函數,那麼這個函數永遠不會被執行。 –