Wp_options içinde saklanan verileri silmek için jQuery kullanma


10

Birisi bana sorunum hakkında daha fazla bilgi verebilir mi acaba? Eklentimin bir kısmı, hata ayıklama amacıyla günlük dosyalarını depolar. Onları jquery ve wp_localise_script kullanarak yönetici sayfamdaki (div # log) başarıyla görüntüledim. Bu günlükleri silmek için bir düğme var ama bunu nasıl işleyeceğinden emin değilim. Ajax'ın burada işe yarayabileceğini ama nereden başlayacağımı bilmediğini hissediyorum.

İşte kodumun ilgili bölümleri:

admin_enqueue_scripts (eylem)

 $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);

Yönetici sayfası

<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();
    }); 
});

Günlüğü temizleme eylemi

 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');

Şimdiye kadar bu komut dosyası tüm günlük dosyalarını göstermek için çalışıyor, şimdi tek ihtiyacım olan #clear_log'u tıklatmak. Ben init bir do_action takma sayfa yükler yüklenmez onları sileceğini biliyorum, bu yüzden tek seçenek ajax olduğunu tahmin benim javascript işe yaramaz hale! Wp_localize_script () işlevine başka bir başvuru eklemem gerekir mi? Herhangi bir yardım mutluluk duyacağız.


Tüm girdileriniz için teşekkürler çocuklar. Seçenekleri silmek için nonce'yi kullanmayı hiç düşünmemiştim. Henüz çalışmak için pek bir şeyim yok ama yaptığım bir şeye inandığımı, bu yüzden gemide söylediğin her şeyi alarak iyi bir bash yapacağım
Tracy

@brasofilo Nazik yorumunuz için teşekkürler. Açıklayıcı olmanın, başkalarının probleminizi daha iyi anlamasına ve size yardımcı olabilmesine yardımcı olduğuna inanıyorum.
Tracy

Hey @Tracy, nonce, isteğin geçerli olduğundan emin olmak için sadece bir kez kontrol edilir, yani sitenizden geldi ve bunu yapmak istediniz. Gönderinizi şimdi sahip olduğunuz kodla düzenlemek istiyorsanız, herkesin bir göz atmaktan memnuniyet duyacağından eminim.
Andrew Bartel

Üzgünüm, orada sarışın bir an vardı! Yapmayı hedeflediğim şeyi başarıyla tamamladım. Günlükleri yüklemek için # debug.click () üzerinde ajax kullandım, sonra günlükleri kaldırmak için # clear_log.click () üzerinde tekrar ajax kullandım. Muhtemelen orada daha iyi bir yöntem var (örneğin 1 ajax çağrısı kullanarak) ama şimdi çalışıyor bu teorileri test edebilirim. Tüm görüşleriniz için tekrar teşekkürler!
Tracy

Yanıtlar:


7

WordPress'teki Ajax, /wp-admin/admin-ajax.php dosyasına (varsayılan olarak) bir HTTP postası göndererek çalışır ve bu da ilgili kancayı tetikler. Bu nedenle, silme düğmeniz tarafından tetiklenen bir etkinliğe bazı jquery eklersiniz; bu, daha sonra silinecek php'yi çalıştıran delete_my_options () adlı bir eylemi olan admin-ajax.php dosyasına gönderir. Ardından, geri çağrı adı verilen ve ajax isteğinin başarıyla tamamlanmasıyla çalışan bir işleve sahipsiniz. Örneğin #log div'inizi soldurmak için bunu kullanabilirsiniz.

Kısacası, eylem, ajax ve geri arama olmak üzere üç adımınız var. Eylem bir DOM olayı tarafından tetiklenir ve wp_ajax_ {action_name} ve wp_ajax_nopriv_ {action_name} olmak üzere iki kancaya eklenir (yalnızca oturum açmış kullanıcının bunu yapmasını istemiyorsanız). Bu eylem wp-admin / admin-ajax.php dosyasına gönderildiğinde tetiklenir. Ajax, onlara bağlanan php (genellikle) işlevidir. Geri arama işlevi, ajax başarıyla tamamlandığında tetiklenen bir javascript işlevidir.

Adım adım:

Adım 1, js dosyanızda

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);

}); 

Adım 2, işlevlerinizde. Php veya bir eklenti

Bunu javascript'inizden sıyırdığınız işleve ekleyin: (teşekkürler @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' ), ) );

Sonra da bunu function.php veya plugin dosyasına ekleyin:

// 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
    }
}

Adım 3, JS dosyanıza geri

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

4
Burada değiştirecek bir şey kullanmaktır admin_urlile wp_localize_scriptçıkışa admin-ajax.phpöyle değil, URL '/wp-admin/admin-ajax.php'özelliklerini yüklemek bağlı birçok durumda.
Milo

5
Dışarıda kalırdım wp_ajax_nopriv_clear_log_action. Neden herhangi bir ziyaretçinin günlüğü temizlemesine izin verilmelidir? :)
fuxia

2
Bunun genel bir örnek olmasını istedim :) Ama, çok geçerli noktalar, nopriv'i düzenledi ve ajaxurl kurulumuna koydu.
Andrew Bartel

5
Ayrıca, CSRF saldırılarını önlemek için bir nonce eklemeniz gerekir. Ayrıca, is_admin (), kullanıcının yönetici olup olmadığını görmek için geçerli bir kontrol değildir, wp-admin yolunda olup olmadığınızı kontrol eder. Bu yüzden current_user_can ('manage_options') olup olmadığını gerçekten kontrol etmelisiniz.
Otto

4
Sadece üç ağır ağırlıklar gelen büyük tavsiye var, cevap Ajax'a örnek bir intro, bu kod kopyalama sayısız kez yapıştırılır ve ben :) @all için bir ilk soru bu kadar iyi yazılmış şeref gördüğümü hatırlamıyorum olduğunu
brasofilo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.