こんにちは、私はいくつかの値を別のテーブルに保存することを決めたので、それを作成し、値を保存するためにフォームを使用しましたが、そのフォームを処理するとエラーTrying to get property of non-object
およびCall to a member function insert() on a non-object
が発生しますglobal $wpdb;
を宣言しました
こちらがフォームです
<form action="formaction.php" method="post">
<input type="text" name="name1" value="">
<input type="text" name="name2" value="">
<input type="submit" name="submit" value="add">
</form>
formaction.php
if(isset($_POST['name1']))
{
$db_data1=$_POST['name1'];
}
if(isset($_POST['name2']))
{
$db_data2=$_POST['name2'];
}
function res()
{
global $wpdb,$db_data1,$db_data2;
$my_table_name=$wpdb->prefix."my_table";
$name1=$db_data1;
$name2=$db_data2;
$rows_affected = $wpdb->insert( $my_table_name, array( 'first' => $name1, 'last' => $name2 ) );
}
res();
エラーによると、$ wpdbはオブジェクトではありませんが、グローバルを使用しましたが、このコードのバグは何ですか?私は正しくやっていますか?
WordPressはロードされず、formaction.php
に格納されているデータベースAPI(これがエラーの原因となっている)を含むそのAPIのいずれにもアクセスできないため、あなたはglobal $wpdb
に直接投稿しています。私はすべてをWordPressに保存することをお勧めします...そしてフォーム処理のための便利な方法はadmin-post.php
を使うことです(もしあなたがWordPressのajax処理に慣れているなら - これも同様の考えです)。
アイデアはあなたがURLに投稿するということです
.../wp-admin/admin-post.php
これはadmin_url('admin-post.php');
経由で取得できます。そして、あなたは、どんなデータやナンスも含めて - 変数action
にuniqueの値をポストします。 (wpse111797_form_submitted
と言いましょう)。フォームがadmin-post.php
に送信されると、WordPressはフックを起動します。
admin_post_wpse111797_form_submitted
- ログインしている場合inadmin_post_nopriv_wpse111797_form_submitted
- ログインしている場合outだからあなたのフォームはこんな感じになるでしょう:
<form action="<?php echo admin_url('admin-post.php'); ?>" method="post">
<input type="hidden" name="action" value="wpse111797_form_submitted">
<input type="text" name="name1" value="">
<input type="text" name="name2" value="">
<input type="submit" name="submit" value="add">
</form>
意図を検証するために ノンス を使うことを忘れないでください。
ログインしたユーザー、ゲスト、またはその両方からのフォーム送信を処理するかどうかに応じて、上記のいずれかのフック(またはその両方)にフックできます。
function wpse111797_form_handler(){
global $wpdb;
$name1 = isset( $_POST['name1'] ) ? $_POST['name1'] : null;
$name2 = isset( $_POST['name2'] ) ? $_POST['name2'] : null;
//TODO Check nonces & permissions first!
$my_table_name=$wpdb->prefix."my_table";
$rows_affected = $wpdb->insert( $my_table_name, array( 'first' => $name1, 'last' => $name2 ) );
//Redirect user to a 'success' page, or from back whence they came!
}
//Attach callback to hook (in this case, the hook for logged-in users)
add_action( 'admin_post_wpse111797_form_submitted', 'wpse111797_form_handler' );