web-dev-qa-db-ja.com

を使用してWordPressでカスタムテーブルの行を削除する AJAX

私のカスタムテーブル($table = $wpdb->prefix . 'user_req';)から、$wpdb->get_results()とforeachループでデータを表示しています。

my table

"Submit"ボタンがあるフォームからの個々の値でデータベースを更新することに成功しました。しかし、この表から、各行の右側にある(x)ボタンをクリックして、行を削除したいと思います。 $_GET[]を使用して簡単に行を削除できますが、この場合はAJAXを使用します。

各行の右側にある(x)ボタンは、実際には次のとおりです。

<input type="button" class="delete" title="Exclude This One"/>

私はコードの背景ではないので、実際には苦労しています。私が検索したとき、ほとんどの解決策が生のPHP-mySQL用ですが、私はそれをWordPressの方法で処理しようとしています。 $ wpdb削除クエリを準備できます。

<?php $wpdb->delete( $table, array( 'post_id' => $products->post_id ) ); ?>

しかし、WordPress-AJAXの方法でうまくいくことはできませんでした。したがって、任意の助けは大歓迎です。

2
Mayeenul Islam

一回だけ

あなたはリクエストを検証できるようにnonce隠しフィールドまたは要素を設定したいでしょう。例としてコーデックスを見てください。

POST IDとNonceの設定

特定の投稿のIDを削除ボタンまたはそのエントリに関連付けられた非表示の入力フィールドに追加する必要があります。設定例がありますので、post_idのような形式で#delete_postid_noncenonceを要素IDに追加する必要があります。あなたの要素IDは#delete_12_94f3a1e666のようになってしまいます。

あなたはそれを使って割り当てることができます:$element_id = 'delete_' . $products->post_id . '_' . wp_create_nonce('delete_' . $products->post_id );

アクションを追加

これらはfunctions.phpまたはカスタムプラグインに配置する必要があります。

2つのadd_action呼び出しがあることに気付くでしょう。 1つは特権ユーザー用(つまり、ログインしているユーザー用)、もう1つは非特権ユーザー用です。どちらも必要ない場合は、どちらか一方を取り外してください。あなたはそれについてもっとCodexで読むことができます。

Delete_Row()関数

これはfunctions.phpまたはカスタムプラグインに配置する必要があります。

ここであなたは私たちがajax呼び出しのidオブジェクトで送ったdataをつかんでいます。 ajax呼び出しのPOSTtypeに設定されているので、これは解析されてPOST配列に入れられます。

それから、ajax呼び出しで送信された要素IDからIDをexplode()して(例えば '#delete_12_94f3a1e666')、$id = array('delete', 12, '94f3a1e666');を残します。したがって、post_idはインデックス[1]と同じです。

それからechoを返して、dataをajax呼び出しのsuccess部分に返します。そして、 'die'を呼び出してphp関数を終了します。


あなたはそれが100%動作するようにこのコードを変更する必要があります。

JS:

jQuery(document).on('click', '.delete', function () {
    var id = this.id;
    jQuery.ajax({
        type: 'POST',
        url: ajaxurl,
        data: {"action": "your_delete_action", "element_id": id},
        success: function (data) {
            //run stuff on success here.  You can use `data` var in the 
           //return so you could post a message.  
        }
    });
});

PHP:

function delete_row() {
    $id = explode('_', sanitize_text($_POST['element_id']));
    if (wp_verify_nonce($id[2], $id[0] . '_' . $id[1])) {
                $table = 'yourtable';
        $wpdb->delete( $table, array( 'post_id' => $id[1] ) );

        echo 'Deleted post';
        die;
    } else {
        echo 'Nonce not verified';
        die;
    }

}

add_action('wp_ajax_your_delete_action', 'delete_row');
add_action( 'wp_ajax_nopriv_your_delete_action', 'delete_row');
4
CommandZ