Удаление строки из пользовательской таблицы в WordPress с помощью AJAX

22 февр. 2014 г., 18:02:40
Просмотры: 18.7K
Голосов: 3

Из моей пользовательской таблицы ($table = $wpdb->prefix . 'user_req';) я вывожу данные с помощью $wpdb->get_results() и цикла foreach:

Моя таблица

Мне удалось обновить базу данных с отдельными значениями из формы, где есть кнопка "Отправить". Но из этой таблицы я хочу удалять любую строку, нажимая на кнопку (x) справа от каждой строки. Я мог бы использовать $_GET[] и легко удалить строку, но в данном случае я хочу использовать AJAX.

Кнопка (x) справа от каждой строки фактически выглядит так:

<input type="button" class="delete" title="Удалить эту строку"/>

У меня нет технического бэкграунда, поэтому я испытываю трудности. Большинство решений, которые я нахожу, предназначены для чистого PHP-mySQL, но я пытаюсь решить эту задачу в рамках WordPress. Я смог подготовить запрос на удаление через $wpdb:

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

Но не смог реализовать это в WordPress-стиле с использованием AJAX. Поэтому любая помощь будет очень ценной.

0
Все ответы на вопрос 1
8

Nonce

Вам нужно установить скрытое поле nonce или добавить его к элементу, чтобы можно было проверить запрос. Посмотрите примеры в Кодексе.

Установка POST ID и Nonce

Вам понадобится добавить ID конкретной записи к кнопке удаления или к скрытому полю ввода, связанному с этой записью. В примере показано, что вам нужно добавить post_id и nonce к ID элемента в формате, таком как #delete_postid_nonce. Итоговый ID элемента должен выглядеть так: #delete_12_94f3a1e666.

Вы можете назначить его с помощью: $element_id = 'delete_' . $products->post_id . '_' . wp_create_nonce('delete_' . $products->post_id );

Добавление действий

Эти действия нужно разместить в файле functions.php или в пользовательском плагине.

Обратите внимание, что есть два вызова add_action. Один для привилегированных пользователей (т.е. вошедших в систему), а другой — для непривилегированных. Удалите один из них, если он вам не нужен. Подробнее об этом можно прочитать в Кодексе.

Функция Delete_Row()

Её также нужно разместить в functions.php или в пользовательском плагине.

Здесь вы получаете id, который мы отправили в объекте data AJAX-вызова. Он анализируется и помещается в массив POST, так как тип AJAX-вызова установлен в POST.

Затем вы используете explode() для извлечения ID из ID элемента, отправленного в AJAX-вызове (например, '#delete_12_94f3a1e666'), что оставит вам $id = array('delete', 12, '94f3a1e666');. Таким образом, post_id равен индексу [1].

Затем вы используете echo, чтобы вернуть data в часть success AJAX-вызова. После этого вы завершаете PHP-функцию с помощью `die`.


Вам нужно будет модифицировать этот код, чтобы он работал на 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) {
            //здесь можно выполнить действия при успехе. 
            //Можно использовать переменную `data` в возврате, чтобы вывести сообщение.  
        }
    });
});

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 'Запись удалена';
        die;
    } else {
        echo 'Nonce не подтверждён';
        die;
    }
}

add_action('wp_ajax_your_delete_action', 'delete_row');
add_action( 'wp_ajax_nopriv_your_delete_action', 'delete_row');
22 февр. 2014 г. 18:29:51
Комментарии

Огромное спасибо за подробный ответ. Но, боюсь, я не понимаю часть if( wp_verify_nonce( $id[2], $id[0] . '_' . $id[1] ) ). Не могу сопоставить эту часть с другими туториалами (например, этим). И без изменений в вашем коде, если я запускаю свою страницу, возникает фатальная ошибка на втором продукте - показывает: Нельзя переопределить функцию delete_row(). Я вставил и функцию, и <script>jQuery(document).on... внутри цикла.

Mayeenul Islam Mayeenul Islam
24 февр. 2014 г. 18:12:08

В этом туториале делают по-другому. Совершенно правильный способ. Когда вы разбиваете строку delete_12_94f3a1e666, получаете delete в индексе массива [0], 12 в индексе [1], 94f3a1e666 в индексе [2]. Если посмотреть на документацию функции, первый параметр wp_verify_nonce - это nonce, затем имя nonce. В условии if я проверяю nonce. delete_row(): похоже, что у вас уже есть другая функция с именем delete_row() в вашей установке. Переименуйте эту. Не нужно помещать функцию внутрь цикла. В файле functions.php или в кастомном плагине.

CommandZ CommandZ
24 февр. 2014 г. 18:46:04

Когда вы измените имя функции, вам также нужно будет переименовать её в add_actions. Этот код не предназначен для простого копирования/вставки. Я не знаю полной конфигурации вашего проекта. Вам нужно адаптировать его под вашу конкретную настройку. Например: в функции delete_row() вам нужно правильно настроить $wpdb->delete(), потому что в текущем виде он не будет работать.

CommandZ CommandZ
24 февр. 2014 г. 18:52:07

Можешь быть в цикле для чата со мной?

Mayeenul Islam Mayeenul Islam
24 февр. 2014 г. 18:56:05

@Mayeenul Islam: Какие у тебя сейчас вопросы? Я могу указать на подходящие ресурсы. Ты очень близок к тому, чтобы это заработало. Убедись, что у тебя установлен плагин debug bar! Также используй консоль javascript в браузере для отладки javascript!

CommandZ CommandZ
24 февр. 2014 г. 19:00:22

Функция не должна быть в цикле - это ключевая команда для меня. Я перенес её в functions.php. Переименовывать не нужно, потому что возникает конфликт из-за двойного вызова внутри цикла. Ок. Теперь я открыл Консоль, и при нажатии на кнопку появляется ошибка Uncaught ReferenceError: ajaxurl is not defined. Я подключил библиотеку jQuery в начале.

Mayeenul Islam Mayeenul Islam
24 февр. 2014 г. 19:02:26

Хороший вопрос. Вам нужно указать путь к ajax.php: попробуйте добавить это сразу после var id = this.id;: var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>'; Где находится этот javascript? На странице? Тогда можно легко использовать php. Убедитесь, что он находится вне цикла, иначе переменная будет переопределяться.

CommandZ CommandZ
24 февр. 2014 г. 19:04:55

давайте продолжим обсуждение в чате

Mayeenul Islam Mayeenul Islam
24 февр. 2014 г. 19:25:03
Показать остальные 3 комментариев