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

Вопрос или проблема

Моя проблема в том, что я не могу обновить страницу после действия формы в цикле.
В моем случае у меня есть страница с постами, где я могу удалять, архивировать, доставлять посты через модальную форму, строка за строкой.

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

Я пытался сделать это безуспешно следующим образом:
В моем файле functions.php

add_action('init', 'init_deliver'); //пытаюсь запустить до заголовков
function init_deliver($pid){
    //код для архивирования поста
    //update_post_meta и т. д.
}
add_action('deliver_post', 'delivered_action');
function delivered_action($pid) { 
    if(isset($_POST['deliver']))
    {   
        init_deliver($pid); //вызов функции init
    } ?>
 <div id="modal" class="modal fade" role="dialog">
     <form method="post"> 
        <input id="deliver" type="submit" name="deliver" class="submit_green" style="width:100%; text-align:center;" />
     </form>
 </div>
}

И я вызываю это в моем цикле вот так

<a href="#" data-toggle="modal" data-target="#-modal">Deliver?</a>
<?php do_action("deliver_post", $pid); ?> <!--Я передаю здесь идентификатор поста $pid-->

Пост доставляется, но страница не обновляется при отправке формы. Она всегда обновляется при втором перезагрузке.
Мне нужно, чтобы страница немедленно обновлялась после отправки формы. Можете, пожалуйста, дать пример или помочь мне в этом? Спасибо.

Из документации: https://developer.wordpress.org/reference/hooks/init/

add_action( 'init', 'process_post' );
 
function process_post() {
     if( isset( $_POST['unique_hidden_field'] ) ) {
          // обработать данные $_POST здесь
     }
}

В вашем примере, возможно, наличие двух разных add_action вызывает проблемы и прячет вашу функцию, из-за чего она не срабатывает во время init

Я собираюсь протестировать похожее решение и посмотрю, что получится, обновлю, если узнаю больше.

Ответ или решение

Интеграция действий init и обновление страницы после обработки формы

Здравствуйте! Решение задачи по обновлению страницы после выполнения действия формы в WordPress действительно может оказаться нетривиальной задачей, особенно когда речь идет об использовании модального окна для этих целей. Давайте разберем вашу проблему и предложим эффективное решение.

Проблема

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

Исследование

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

Решение

  1. Образец кода с использованием хука init:

    Следует объединить действия в рамках одной функции и четко обозначить процесс обработки данных формы:

    add_action('init', 'process_form_action');
    
    function process_form_action() {
       if (isset($_POST['deliver']) && is_user_logged_in()) {
           $pid = intval($_POST['post_id']); // убедитесь, что используется правильный идентификатор поста
           // Например, обновление метаданных поста
           update_post_meta($pid, 'status', 'delivered');
    
           // После обработки данных сделать перенаправление
           wp_redirect(add_query_arg('message', 'post_delivered', get_permalink($pid)));
           exit;
       }
    }
  2. HTML и JavaScript для обновления страницы:

    Убедитесь, что форма отправляет данные о посте, и добавьте скрытое поле для передачи идентификатора поста:

    <div id="modal" class="modal fade" role="dialog">
       <form method="post" action="">
           <input type="hidden" name="post_id" value="<?php echo esc_attr($pid); ?>" />
           <input id="deliver" type="submit" name="deliver" class="submit_green" style="width:100%; text-align:center;" />
       </form>
    </div>

    При использовании хука wp_redirect, убедитесь, что выход из скрипта осуществляется после перенаправления для предотвращения выполнения оставшегося кода.

  3. Вызов на страницу и передача параметров:

    Путем добавления ссылки поблизости от вызова модального окна, можно управлять его открытием и закрытием на стороне клиента:

    <a href="#" data-toggle="modal" data-target="#modal">Deliver?</a>

Заключение

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

Успехов в реализации вашего проекта! Если у вас возникнут дополнительные вопросы, пожалуйста, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...