Я вижу несколько вещей здесь не так. Если вы используете ajax с WordPress, вы должны запускать его через URL-адрес admin 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)
для интерфейса.
Это изменит вашу АЯКС функцию обработчика на что-то вроде этого:
// 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.
Одна вещь, о которой я не упоминал, - nonces. Вы должны использовать nonces для обеспечения безопасности. Nonces используются с check_ajax_referer, чтобы убедиться, что запросы ajax исходят из правильного источника.
Как у * clearcache.php * есть доступ к функциям WordPress? – rnevius
Вы загрузили wordpress в clearcache.php? – Musa
Вы должны действительно рассмотреть возможность избавиться от файла PHP и вместо этого использовать ['wp_ajax_ (действие)'] (https://codex.wordpress.org/AJAX_in_Plugins#Ajax_on_the_Viewer-Facing_Side). – rnevius