it-roy-ru.com

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

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

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

Моя проблема: Мой пост заархивирован, но мне нужно обновить страницу 2 раза, прежде чем я вижу, что она исчезла с моей страницы. Когда я просто нажимаю "Отправить", страница обновляется, но я все равно вижу сообщение, которое скрывается при второй перезагрузке.

Я предполагаю, что я делаю неправильно, выполняя действие. Мой код в functions.php:

add_action('archive_post','archive_action');
function archive_action($pid) { 
    if(isset($_POST['archive']))
    {   
        update_post_meta($pid, 'archived', "1");
        //other code
    }

    ?>
<div id="archive-modal" class="modal fade" role="dialog">
    <div class="modal-dialog">
        <div class="box_title">
            <?php printf(__("Do you want archive this",'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.'" />'; работает, но, опять же, обновляет страницу дважды, как раньше, только автоматизировано.

Есть ли другое решение? Что мне не хватает, пожалуйста?

2
huraji

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

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

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

4
DarkNeuron

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

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

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

2
huraji

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

Другим более привлекательным подходом было бы использование ajax. Таким образом, вы отправляете запрос через Ajax в архив и просто используете javascript для удаления сообщения из DOM.

0
Bruno Cantuaria