Редирект не работает в ajax-функции WordPress
Я использую ajax для отправки данных формы. В конце хочу сделать редирект на главную страницу. Пробую следующий код, но он не работает. Возвращает ошибку 302. Как можно сделать редирект в данной функции? Спасибо.
add_action('wp_ajax_nopriv_custom_register', 'custom_register');
add_action('wp_ajax_custom_register', 'custom_register');
function custom_register(){
//обработка данных
wp_redirect( home_url() );
exit;
}

AJAX-запрос выполняется в фоновом режиме. Перенаправления здесь не влияют на основную страницу. И 302 — это не ошибка, а просто код состояния.
Ваш AJAX-ответ должен возвращать либо URL и код состояния на вызывающую страницу, либо просто число, например 1. Затем вы обрабатываете перенаправление на вызывающей странице:
jQuery( document ).ready( function( $ ) {
var url = '<?php echo home_url(); ?>';
$( '#ajaxtrigger' ).on( 'click',
function() {
$.post( ajaxurl, {}, function( response ) {
if ( 1 == response )
top.location.replace(url);
});
return false;
}
);
});

Этот ответ уже несколько лет, но я думаю, он может помочь другим:
Я использовал функцию для редиректа из JS AJAX вызова. Сначала она устанавливает некоторые значения в базу данных, а затем пытается выполнить редирект таким образом:
if (wp_safe_redirect( $url ))
exit();
Но это просто возвращает ту же страницу с добавлением 'undefined'.
В итоге я решил проблему, выполнив редирект напрямую в JS:
window.location.href = url; // сохраняет историю страницы
Также работает:
window.location.replace( url ); // очищает историю страницы

Если вам нужно выполнить перенаправление, используйте JavaScript window.location="ваш URL"
в вашем PHP коде.
Попробуйте этот вариант в функции, вызываемой AJAX запросом:
add_action('wp_ajax_nopriv_custom_register', 'custom_register');
add_action('wp_ajax_custom_register', 'custom_register');
function custom_register(){
//обработка данных
$url = home_url();
?>
<script>
demo(); //название JavaScript функции
function demo()
{
window.location="<?php echo $url ?>";
}
</script>
<?php exit;
}
