Sử dụng jQuery để xóa dữ liệu được lưu trữ trong wp_options


10

Tôi tự hỏi nếu có ai có thể tư vấn cho tôi thêm về vấn đề của tôi. Một phần của plugin của tôi lưu trữ các tệp nhật ký cho mục đích gỡ lỗi. Tôi đã hiển thị thành công chúng trong một (div # log) trong trang quản trị của mình bằng jquery và wp_localise_script. Tôi có một nút để xóa các nhật ký này nhưng tôi không chắc làm thế nào để xử lý này. Tôi có cảm giác rằng ajax có thể có ích ở đây nhưng không biết bắt đầu từ đâu.

Đây là phần có liên quan trong mã của tôi:

admin_enqueue_scripts (hành động)

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

Trang quản trị

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

Hành động để xóa nhật ký

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

Cho đến nay tập lệnh này đang hoạt động để hiển thị tất cả các tệp nhật ký, bây giờ tất cả những gì tôi cần là xóa chúng khi nhấp vào #clear_log. Tôi biết việc cắm một do_action trên init sẽ xóa chúng ngay khi tải trang, làm cho javascript của tôi trở nên vô dụng nên tôi đoán tùy chọn duy nhất là ajax! Tôi có cần thêm một tham chiếu khác vào wp_localize_script () không? Bất kỳ trợ giúp sẽ được đánh giá cao.


Cảm ơn mọi người cho tất cả các đầu vào của bạn. Tôi chưa bao giờ nghĩ về việc sử dụng nonce để xóa các tùy chọn. Tôi chưa hoàn toàn làm việc được nhưng tôi cho rằng đó là điều tôi đã làm nên tôi sẽ có một cú đánh tốt với nó khi lấy mọi thứ bạn đã nói trên tàu
Tracy

@brasofilo Cảm ơn bạn đã bình luận. Tôi tin rằng việc mô tả giúp người khác hiểu và có thể giúp bạn giải quyết vấn đề của bạn nhiều hơn.
Tracy

Xin chào @Tvery, nonce chỉ là kiểm tra một lần để đảm bảo rằng yêu cầu đó là hợp lệ, tức là đến từ trang web của bạn và bạn muốn thực hiện nó. Nếu bạn muốn chỉnh sửa bài đăng của mình với mã bạn có bây giờ tôi chắc chắn mọi người sẽ rất vui khi xem qua.
Andrew Bartel

Xin lỗi về điều đó, đã có một khoảnh khắc tóc vàng ở đó! Tôi đã hoàn thành thành công những gì tôi đang hướng tới. Tôi đã sử dụng ajax trên # debug.click () để tải các bản ghi sau đó ajax lại trên # clear_log.click () để xóa nhật ký. Có lẽ có một phương pháp tốt hơn ngoài kia (ví dụ sử dụng 1 cuộc gọi ajax) nhưng bây giờ nó đang hoạt động tôi có thể kiểm tra những lý thuyết này. Cảm ơn một lần nữa cho tất cả những hiểu biết của bạn!
Tracy

Câu trả lời:


7

Ajax trong WordPress hoạt động bằng cách gửi một bài đăng HTTP đến /wp-admin/admin-ajax.php (theo mặc định) để sau đó kích hoạt hook tương ứng. Vì vậy, bạn đính kèm một số jquery vào một sự kiện được kích hoạt bởi nút xóa của bạn, sau đó đăng lên admin-ajax.php, có hành động, giả sử, xóa_my_options (), thực sự chạy php để xóa. Sau đó, bạn có một hàm, được gọi là gọi lại, chạy khi hoàn thành thành công yêu cầu ajax. Bạn có thể sử dụng điều này để làm mờ #log div của bạn chẳng hạn.

Nói tóm lại, bạn có ba bước, hành động, ajax và gọi lại. Hành động được kích hoạt bởi một sự kiện DOM và được đính kèm với hai hook, wp_ajax_ {action_name} và wp_ajax_nopriv_ {action_name} (chỉ khi bạn không muốn người dùng đăng nhập mới có thể thực hiện được). Sẽ kích hoạt khi hành động đó được đăng lên wp-admin / admin-ajax.php. Các ajax là hàm php (thường) được nối với chúng. Hàm gọi lại là một hàm javascript được kích hoạt khi ajax hoàn thành thành công.

Từng bước một:

Bước 1, trong tệp js của bạn

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

}); 

Bước 2, trong hàm.php của bạn hoặc một plugin

Thêm phần này vào chức năng mà bạn yêu thích javascript của bạn từ: (cảm ơn @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' ), ) );

Sau đó thêm phần này vào hàm.php hoặc plugin của bạn:

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

Bước 3, quay lại tập tin js của bạn

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

4
một trong những điều tôi sẽ thay đổi ở đây là sử dụng admin_urlvới wp_localize_scriptđể sản xuất các admin-ajax.phpURL, nó không phải là '/wp-admin/admin-ajax.php'trong nhiều trường hợp, tùy thuộc vào cài đặt chi tiết cụ thể.
Milo

5
Tôi sẽ rời khỏi wp_ajax_nopriv_clear_log_action. Tại sao bất kỳ khách truy cập nên được phép xóa nhật ký? :)
fuxia

2
Chà, tôi muốn nó là một ví dụ chung :) Nhưng, những điểm rất hợp lệ, đã chỉnh sửa nopriv và đưa vào ajaxurl được thiết lập.
Andrew Bartel

5
Ngoài ra, bạn nên thêm vào một nonce để ngăn chặn các cuộc tấn công CSRF. Ngoài ra, is_admin () không phải là kiểm tra hợp lệ để xem người dùng có phải là quản trị viên hay không, nó sẽ kiểm tra xem bạn có trong đường dẫn wp-admin hay không. Vì vậy, bạn thực sự nên kiểm tra xem nếu current_user_can ('Manage_options').
Otto

4
Bạn vừa nhận được lời khuyên tuyệt vời từ ba trọng lượng nặng, Câu trả lời là phần giới thiệu mẫu mực cho Ajax, mã này sẽ được sao chép qua vô số lần và tôi không nhớ đã thấy một Câu hỏi đầu tiên được viết rất hay, kudos gửi
@all
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.