2017-02-17 3 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 파일에 직접 양식을 게시 할 경우 wp-load.php을 필요로하지 않는 한, 그 기능 중 어느 것도 사용할 수 없습니다. 이것이 add_action$wpdb이 정의되지 않은 이유입니다.

WordPress에 양식을 게시하는 자세한 방법 및 다른 방법에 대해서는 아래의 주석과 원래의 대답을 참조하십시오.

원래의 대답 당신은 그것을로드 워드 프레스가 필요한 파일을 포함한다으로 실행 그래서 어떤 고리에 연결된 handle() 기능을하지 않는 것,하지만 실제로는 최대 $wpdb로드하기 전에. 그것이 $ wpdb가 정의되지 않은 이유입니다. 아직 존재하지 않습니다. 이 시도 : 나는 또한 handle() 기능을 접두어로 고려 (또는 더 나은 아직, 클래스에 포장) 이름 충돌을 피하기 위해 줄

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

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

//handle(); 
add_action('init', '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'으로 시도해 본 결과 함수는 결코 실행되지 않았습니다. –

관련 문제