2017-02-17 69 views
2

我正在創建一個插件,需要創建一個數據庫並向其中插入數據,我創建了表的部分,但每當我嘗試使用$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絕在一個函數中使用,所以我把它包裝在一個。任何想法,爲什麼這是?

回答

3

修復 如果直接發佈形式的PHP文件,而無需加載WordPress的,除非你需要wp-load.php沒有它的功能將可用。這就是爲什麼add_action$wpdb未定義。

請參閱下面的評論和原始答案,瞭解詳細信息以及在WordPress中發佈表單的其他方式。

原來的答案 你似乎並不具備handle()功能,所以它的加載和運行的WordPress是包括必要的文件捆綁任何掛鉤,但在此之前它實際上加載了$wpdb。這就是爲什麼$ wpdb沒有被定義 - 它還不存在。試試這個:

<?php 
function handle() { 
    global $wpdb; 

    if(isset($_POST[ 'submit' ])){ 
    $wpdb->insert('wp_testing', array('name' => 'test')); 
    } 
} 

//handle(); 
add_action('init', 'handle'); 

我還考慮前綴的handle()功能(或更好,但它包裝在一個類),以避免命名衝突。喜歡的東西:

<?php 
function jacob_morris_handle() { 
    global $wpdb; 

    if(isset($_POST[ 'submit' ])){ 
    $wpdb->insert('wp_testing', array('name' => 'test')); 
    } 
} 

//handle(); 
add_action('init', 'jacob_morris_handle'); 

<?php 
class JacobMorris { 
    function handle() { 
    global $wpdb; 

    if(isset($_POST[ 'submit' ])){ 
     $wpdb->insert('wp_testing', array('name' => 'test')); 
    } 
    } 

    function __construct(){ 
    add_action('init', array($this, 'handle')); 
    } 
} 
new JacobMorris(); 
+0

名稱僅適用於這個小例子,我在實際工程中比較獨特的名字。這是否給我這個錯誤'調用未定義的函數add_action()'。只有在提交表單時才應該運行這個文件,那麼在那個時候全局文件不會被加載? –

+0

如果'add_action'未定義,則WordPress不會加載,這是別處的問題。是的 - 使用鉤子將意味着它在每次頁面加載時全局偵聽,但是if語句是在提交表單時告訴它運行的。唯一不全球監聽的方法是將其切換到ajax調用並通過ajax發佈您的表單。 –

+0

,所以通過加入require('path/to/wp-load.php')並切換回剛纔運行的'handle()'我就可以使用它了。如果我用'add_action'來試試這個函數,那麼這個函數永遠不會被執行。 –

相關問題