Функция не выполняется должным образом при нажатии кнопки

У меня есть запрос Ajax, который выглядит следующим образом:

  $('#clear_cache').click(function (event) {
event.preventDefault();
var ajaxurl = "clearcache.php";
$.post(ajaxurl, function () {
$('<p>The cache was cleared successfully.</p>').insertAfter('#clear_cache');
});
});

Файл clearcache.php выглядит так:

do_action( 'clear_terms', 'clear_transients' );

function clear_transients() {
global $wpdb;
$sql = "delete from {$wpdb->options}
where option_name like '_transient_cc%'";
return $wpdb->query($sql);
}

Я знаю, что запрос ajax нормально связывается с файлом php, потому что, когда я очищаю файл php и нажимаю на мою кнопку, запрос выполняется. Я чувствую, что с моим PHP-файлом что-то не так, например, функция не была правильно настроена или я делаю неправильный тип запроса. Однако, когда я проверил этот php-код в том же файле, где находится моя кнопка, он работал нормально (но это был метод строки запроса). Ваша помощь очень ценится.

1

Решение

Я вижу пару вещей неправильно здесь. Если вы используете ajax с WordPress, вы должны запускать его через URL администратора ajax.

Вы не используете do_action должным образом. Первый параметр — это имя действия, а второй — аргументы для действия. Я думаю ты путаешь do_action с add_action,

Лучше всего использовать die() или еще лучше wp_die() когда вы закончите ваш обработчик AJAX. В качестве альтернативы, если вы возвращаете какой-то вывод, вы можете использовать wp_send_json()

Ваш ajaxurl всегда должен указывать на admin-ajax.php. Если вы делаете это на стороне администратора ajaxurl уже настроен для вас. Если вы делаете это на веб-интерфейсе, у вас должен быть фрагмент, подобный следующему, в вашем functions.php

add_action( 'wp_enqueue_scripts', 'my_scripts' );

function my_scripts() {
// the file where your javascript is located
wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/script.js', array('jquery') );

// this makes the admin url available to your javascript
wp_localize_script( 'ajax-script', 'ajax_object',
array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
}

Вы можете использовать ajax_object.ajaxurl в вашем JavaScript, чтобы получить правильный URL.

Ваш javascript может теперь выглядеть примерно так:

$('#clear_cache').click(function (event) {
event.preventDefault();
var data = { action: 'clear_transients' }
$.post( ajax_object.ajaxurl, data, function () {
$('<p>The cache was cleared successfully.</p>').insertAfter('#clear_cache');
});
});

Если вы запускаете это в админке, просто замените ajax_object.ajaxurl с ajaxurl, Обратите внимание на добавление data переменная. Это скажет WordPress, какое действие он должен выполнить.

Для ваших действий вы должны использовать wp_ajax_(action) для стороны администратора или wp_ajax_nopriv_(action) для внешнего интерфейса.

Это изменит вашу функцию обработчика ajax на что-то вроде этого:

// run on the admin side
add_action( 'wp_ajax_clear_transients', 'clear_transients' );

// or run on the frontend
add_action( 'wp_ajax_nopriv_clear_transients', 'clear_transients' );

function clear_transients() {
global $wpdb;
$sql = "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_cc%'";
$wpdb->query($sql);
wp_die();
}

Ваш обработчик ajax также может быть помещен в functions.php.

Одна вещь, которую я не упомянул, одноразовые. Вы должны использовать одноразовые номера для безопасности. Одноразовые номера используются с check_ajax_referer чтобы убедиться, что запросы AJAX исходят из правильного источника.

5

Другие решения

Похоже, вы используете WordPress, но Ajax-вызов напрямую переходит к файлу php, не загружая ранее необходимые файлы WordPress.

Посмотрите здесь инструкции по использованию Ajax с WordPress:
https://codex.wordpress.org/AJAX_in_Plugins

0

По вопросам рекламы [email protected]