Как правильно обновить страницу после действия формы?

8 июн. 2016 г., 17:00:34
Просмотры: 50K
Голосов: 5

У меня есть страница со списком постов, где отображаются все записи. Для каждой строки поста можно выполнять действия, такие как удаление, архивирование и т.д. Представьте, что:

  • У меня есть кнопка "архивировать";
  • Я нажимаю на неё и получаю модальное окно (форму) с вопросом "Вы хотите архивировать этот пост?"
  • В модальном окне есть кнопка отправки, которая должна выполнить действие формы и обновить страницу, скрывая только что архивированный пост.

Моя проблема: Мой пост архивируется, но мне приходится обновлять страницу 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">&times;</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.'" />'; работает, но опять же, обновляет страницу дважды, как и раньше, только автоматически.

Есть ли другое решение? Что я упускаю, пожалуйста?

1
Комментарии

Похожие вопросы: https://stackoverflow.com/questions/29232764/how-to-properly-url-redirect-in-wordpress-after-form-submission

Jesse Nickles Jesse Nickles
24 июл. 2022 г. 22:04:47
Все ответы на вопрос 3
1

Искал повсюду и не смог реализовать действие через хук init, поэтому нашел это решение, которое, конечно, не самое лучшее, но отлично справляется с задачей.

echo "<script type='text/javascript'>
        window.location=document.location.href;
        </script>";

в конце инструкций $_POST. Если у кого-то есть лучшее решение, буду рад его увидеть.

9 июн. 2016 г. 13:09:44
Комментарии

Был близок к такому подходу, но не смог разобраться, как его вызвать из моей функции. Что-то подсказывает мне, что, возможно, стоит исправить это раньше в конвейере.

sturlabragason sturlabragason
3 июн. 2019 г. 14:55:22
0

Если ваша страница была отправлена, то можно быть уверенным, что $_SERVER['HTTP_REFERER'] доступен.

Таким образом, вы можете сделать либо: wp_redirect($_SERVER['HTTP_REFERER']); или header('Location: ' . $_SERVER['HTTP_REFERER'])

Это выполнит перенаправление на ту же страницу, на которой вы уже находитесь.

30 нояб. 2016 г. 12:00:10
5

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

Более изящным решением будет использование AJAX. В этом случае вы отправляете запрос через AJAX для архивирования и просто используете JavaScript для удаления поста из DOM.

8 июн. 2016 г. 17:31:12
Комментарии

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

middlelady middlelady
8 июн. 2016 г. 17:41:36

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

middlelady middlelady
8 июн. 2016 г. 17:51:58

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

Bruno Cantuaria Bruno Cantuaria
9 июн. 2016 г. 01:01:04

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

middlelady middlelady
9 июн. 2016 г. 10:39:47

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

Jesse Nickles Jesse Nickles
24 июл. 2022 г. 21:53:41