jQueryを使用してwp_optionsに保存されているデータを削除する


10

私の問題について誰かが私にさらに助言してくれるだろうか。私のプラグインの一部は、デバッグ目的でログファイルを保存します。jqueryとwp_localise_scriptを使用して、管理ページの(div#log)に正常に表示しました。これらのログを削除するボタンがありますが、これを処理する方法がわかりません。ここではajaxが役に立つかもしれないと感じていますが、どこから始めればよいかわかりません。

これが私のコードの関連部分です:

admin_enqueue_scripts(アクション)

 $args = array(get_option('wow_tweets_log'));//log files fetched from wp_options table    
    wp_enqueue_script('wow_tweet');//registered earlier on with jQuery dependency
    wp_localize_script('wow_tweet', 'wow_vars', $args);

管理ページ

<tr><th scope="row"><strong>Debugging</strong></th><td>
    <div id="debug" class="button-primary">Debug</div><!--debug button shows logs-->
    <div id="hide_debug" class="button-secondary">Hide</div><!--debug button hides logs-->
    <div id="clear_log" class="button-secondary">Empty Log</div><!--Press to delete logs-->
</td></tr>
<tr><th scope="row"></th><td><div id="log"><!--Logs show here--></div></td></tr>

Javascript

jQuery(document).ready(function() { 

    var debug_show = jQuery('#log').hide();//hides log by default

    jQuery('#debug').click(function(){//on click shows logs files in div#log
        for (var i = 0, l = wow_vars.length; i < l; i++) {
            var data = wow_vars[i];
        }
        jQuery('#log').show().html(data);

    });
    jQuery('#hide_debug').click(function()
    {
        debug_show.hide();
    }); 
});

ログをクリアするアクション

 function clear_log(){
    delete_option('wow_tweets_log');//am stuck on how to invoke this

    /*die();  would go at the end if ajax used*/
 }
 add_action('clear_log','clear_log');

これまでのところ、このスクリプトはすべてのログファイルを表示するように機能しており、#clear_logをクリックしたときにそれらを削除するだけで済みます。initにdo_actionをプラグインすると、ページが読み込まれるとすぐに削除され、JavaScriptが役に立たなくなるため、唯一のオプションはajaxだと思います!wp_localize_script()に別の参照を追加する必要がありますか?任意の助けいただければ幸いです。


すべての入力をありがとうございました。私はナンスを使用してオプションを削除することを考えたことはありませんでした。まだ十分に機能していませんが、それは自分が行った何かにかかっていると思います。そのため、あなたが船上で言ったすべてのことを踏まえて、私はそれで良いバッシュを手に入れます
Tracy

@brasofilo親切なコメントをありがとう。説明的であることは、他の人があなたの問題をより理解し、あなたを助けることができると信じています。
トレーシー

@Tracyさん、nonceは、リクエストが有効であることを確認するための1回限りのチェックです。つまり、サイトからのものであり、それを行うつもりでした。あなたが今持っているコードであなたの投稿を編集したいなら、私は誰もが見て喜んでいると確信しています。
Andrew Bartel 2013

申し訳ありませんが、金髪の瞬間がありました!やりたいことを無事完了しました。#debug.click()でajaxを使用してログをロードし、#clear_log.click()で再度ajaxを使用してログを削除しました。おそらくもっと良い方法があります(たとえば、1つのajax呼び出しを使用します)が、機能しているので、これらの理論をテストできます。あなたの洞察のすべてに再び感謝します!
トレーシー

回答:


7

WordPressのAjaxは、/ wp-admin / admin-ajax.php(デフォルト)にHTTPポストを送信し、対応するフックを起動します。そのため、削除ボタンによってトリガーされたイベントにjqueryをアタッチし、admin_ajax.phpに投稿します。このアクションには、たとえば、実際にPHPを実行して削除するdelete_my_options()などのアクションがあります。次に、ajaxリクエストが正常に完了したときに実行されるコールバックと呼ばれる関数があります。これを使用して、たとえば#log divをフェードアウトできます。

つまり、アクション、ajax、およびコールバックの3つのステップがあります。アクションはDOMイベントによってトリガーされ、wp_ajax_ {action_name}とwp_ajax_nopriv_ {action_name}の2つのフックにアタッチされます(ログインしているユーザーが実行できないようにする場合のみ)。これらは、そのアクションがwp-admin / admin-ajax.phpに投稿されたときに発生します。ajaxは、それらに接続されたphp(通常)関数です。コールバック関数は、ajaxが正常に完了したときに発生するJavaScript関数です。

ステップバイステップ:

ステップ1、jsファイル内

jQuery('#hide_debug').click(function()
{
    var data = {};
    data.action = 'clear_log_action';
    data.options_delete_nonce = ajax_object.options_delete_nonce;
    jQuery.post(ajax_object.ajax_url, data, clear_log_callback);

}); 

ステップ2、functions.phpまたはプラグイン

これを、JavaScriptをエンキューする関数に追加します(thanks @Milo)

wp_localize_script( 'my_js_file_name', 'ajax_object', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ,   'options_delete_nonce' => wp_create_nonce( 'options_delete_nonce' ), ) );

次に、これをfunctions.phpまたはプラグインに追加します。

// Edit: removed the nopriv hook (Thanks @toscho)
add_action('wp_ajax_clear_log_action','clear_log_ajax'); // attach your data.action to wp_ajax and wp_ajax_nopriv and hook your php function
function clear_log_ajax() {
    $nonce = $_POST['options_delete_nonce'];
    // Edit: Added nonces and permissions check (Thanks @Otto)
    if( wp_verify_nonce( $nonce, 'options_delete_nonce' ) && current_user_can( 'manage_options' ) ) {
        delete_option('wow_tweets_log');
        die(); // make sure to put a die() or exit() at the end of your ajax
    }
}

ステップ3、jsファイルに戻る

// output will be what is echoed from your ajax, if anything
function clear_log_callback(output) 
{
    jQuery('#log').hide();
}

4
ここで変更することの1つは、URL を出力するためにを使用admin_urlするwp_localize_scriptことです。多くの場合、インストールの詳細によって異なります。admin-ajax.php'/wp-admin/admin-ajax.php'
ミロ

5
私は除外しwp_ajax_nopriv_clear_log_actionます。なぜ訪問者がログをクリアできるようにする必要があるのですか?:)
fuxia

2
まあ、私はそれを一般的な例にしたいと思いました:)しかし、非常に有効な点は、noprivを編集してajaxurl設定に入れました。
Andrew Bartel 2013

5
さらに、CSRF攻撃を防ぐためにナンスを追加する必要があります。また、is_admin()は、ユーザーが管理者であるかどうかを確認する有効なチェックではなく、wp-adminパスにいるかどうかを確認します。したがって、実際にcurrent_user_can( 'manage_options')かどうかを確認する必要があります。
オットー

4
あなたは3人のヘビーウェイトから素晴らしいアドバイスを受けました。AnswerはAjaxの模範的なイントロです。このコードは無数にコピーアンドペーストされます。最初の質問がそれほどよく書かれているのを覚えていません。@ allへの称賛:)
brasofilo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.