Удаление строки из пользовательской таблицы в WordPress с помощью AJAX
Из моей пользовательской таблицы ($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. Поэтому любая помощь будет очень ценной.

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

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

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

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

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

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

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

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

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