Как правильно обновить страницу после действия формы?
У меня есть страница со списком постов, где отображаются все записи. Для каждой строки поста можно выполнять действия, такие как удаление, архивирование и т.д. Представьте, что:
- У меня есть кнопка "архивировать";
- Я нажимаю на неё и получаю модальное окно (форму) с вопросом "Вы хотите архивировать этот пост?"
- В модальном окне есть кнопка отправки, которая должна выполнить действие формы и обновить страницу, скрывая только что архивированный пост.
Моя проблема: Мой пост архивируется, но мне приходится обновлять страницу 2 раза, прежде чем он исчезнет. Когда я просто нажимаю кнопку отправки, страница обновляется, но пост всё ещё виден, и только при втором обновлении он исчезает.
Полагаю, что я неправильно выполняю действие. Мой код в functions.php:
add_action('archive_post','archive_action');
function archive_action($pid) {
if(isset($_POST['archive']))
{
update_post_meta($pid, 'archived', "1");
//другой код
}
?>
<div id="archive-modal" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="box_title">
<?php printf(__("Вы хотите архивировать это",'metheme'), $pid);?>
<a class="pull-right" href="#" data-dismiss="modal">×</a>
</div>
<div class="box_content">
<form method="post" action="">
<input type="submit" name="archive" style="width:100%; text-align:center;" ?>" />
</form>
</div>
</div>
</div>
<?php }
Я вызываю эту функцию в моём цикле для передачи $post->id
в архив следующим образом:
do_action('archive_post', $pid);
Что я уже пробовал:
- форма с пустым
action=""
для обновления страницы, как в коде: не работает, пост остаётся и исчезает только при повторном обновлении; wp_redirect(get_permalink());
в функции$_POST
: то же самое, что и раньше;echo '<meta http-equiv="refresh" content="0.5;url='.$mylink.'" />';
работает, но опять же, обновляет страницу дважды, как и раньше, только автоматически.
Есть ли другое решение? Что я упускаю, пожалуйста?

Искал повсюду и не смог реализовать действие через хук init
, поэтому нашел это решение, которое, конечно, не самое лучшее, но отлично справляется с задачей.
echo "<script type='text/javascript'>
window.location=document.location.href;
</script>";
в конце инструкций $_POST
.
Если у кого-то есть лучшее решение, буду рад его увидеть.

Если ваша страница была отправлена, то можно быть уверенным, что $_SERVER['HTTP_REFERER']
доступен.
Таким образом, вы можете сделать либо:
wp_redirect($_SERVER['HTTP_REFERER']);
или
header('Location: ' . $_SERVER['HTTP_REFERER'])
Это выполнит перенаправление на ту же страницу, на которой вы уже находитесь.

Это происходит потому, что ваша функция archive_action
выполняется после того, как цикл уже завершился. Попробуйте подключить вашу функцию к действию init
, чтобы она выполнялась до начала цикла.
Более изящным решением будет использование AJAX. В этом случае вы отправляете запрос через AJAX для архивирования и просто используете JavaScript для удаления поста из DOM.

Спасибо! Но как я могу передать переменную, используя init
? Я имею в виду, что мне нужно обратиться к конкретной строке. Сейчас я отправляю post_id через do_action('archive_action', $pid);
. Не могли бы вы объяснить это? Мне не совсем понятно.

Я отредактировал вопрос и объяснил, что моя функция находится в functions.php и преобразована в действие. Я упустил этот момент. Затем я вызываю это действие в своем цикле, передавая $post->id в архив. Как я могу сделать это с init
?

Вам нужно будет разделить эту функцию и поместить её на хук init

Спасибо, Бруно, я действительно ценю это. Но если я спрашиваю, значит я не знаю, как это сделать. У вас есть ссылка с примерами? Я не могу найти никаких материалов по теме. Еще раз спасибо.

Её уточняющий вопрос здесь: https://wordpress.stackexchange.com/questions/229228/init-action-and-refresh-page-after-form-action
