У меня есть запрос 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-код в том же файле, где находится моя кнопка, он работал нормально (но это был метод строки запроса). Ваша помощь очень ценится.
Я вижу пару вещей неправильно здесь. Если вы используете 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 исходят из правильного источника.
Похоже, вы используете WordPress, но Ajax-вызов напрямую переходит к файлу php, не загружая ранее необходимые файлы WordPress.
Посмотрите здесь инструкции по использованию Ajax с WordPress:
https://codex.wordpress.org/AJAX_in_Plugins