2017-02-17 11 views
2

データベースを作成してデータを挿入する必要があるプラグインを作成していますが、テーブルを作成する部分がありますが、データを挿入するときにはいつでもエラーが発生します。 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必見関数内で使用されるので、1つにまとめました。これはなぜですか?

答えて

3

修正 あなたがワードプレスをロードせずにPHPファイルに直接フォームを投稿する場合は、wp-load.phpを必要としない限り、その機能のいずれも使用できなくなります。このため、add_action$wpdbは未定義です。

WordPressでフォームを投稿する方法や詳細については、以下のコメントと元の回答を参照してください。

元答え あなたはワードプレスが必要なファイルを含めているとして、それはロードして実行しているので、いずれかのフックに縛らhandle()機能を持っていないように見えますが、それは実際に$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はロードされておらず、別の場所で問題になっています。そしてyes - フックを使用すると、ページが読み込まれるたびに全世界的に聞こえることになりますが、if文はフォームが送信されたときにRUNに伝えることになります。グローバルに聞かない唯一の方法は、それをajax呼び出しに切り替えて、フォームをajax経由で投稿することです。 –

+0

'require( 'path/to/wp-load.php')を追加して、' handle() 'を実行し直すだけに戻って動作させました。 'add_action'で試してみたら、関数は決して実行されませんでした。 –

関連する問題