¿Cómo actualizar correctamente la página después de una acción del formulario?

8 jun 2016, 17:00:34
Vistas: 50K
Votos: 5

Tengo una página de listado donde se muestran todas las entradas. En cada fila de entrada puedo realizar acciones como eliminar, archivar, etc. Imaginen que:

  • Tengo un botón "archivar";
  • Al presionarlo obtengo un modal (formulario) que dice "¿Desea archivar esta entrada?"
  • En el modal tengo el botón de enviar, que debería ejecutar la acción del formulario y actualizar la página, ocultando la entrada recién archivada.

Mi problema: Mi entrada se archiva pero tengo que actualizar la página 2 veces antes de verla desaparecer de mi página. Cuando solo hago clic en enviar, la página se actualiza pero todavía veo la entrada que se oculta la segunda vez que recargo.

Supongo que estoy haciendo mal la ejecución de la acción. Mi código en functions.php:

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

    ?>
<div id="archive-modal" class="modal fade" role="dialog">
    <div class="modal-dialog">
        <div class="box_title">
            <?php printf(__("¿Desea archivar esto",'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 }

Llamo a esta función en mi bucle para pasar el $post->id para archivar de esta manera:

do_action('archive_post', $pid);

Lo que he intentado hasta ahora:

  • formulario con action="" vacío para actualizar la página, como en el código: no funciona, la entrada permanece y solo si actualizo de nuevo desaparece;
  • wp_redirect(get_permalink()); en la función $_POST: igual que antes;
  • echo '<meta http-equiv="refresh" content="0.5;url='.$mylink.'" />'; funciona pero, una vez más, actualiza la página dos veces, es como antes, solo que automatizado.

¿Hay alguna otra solución? ¿Qué me estoy perdiendo por favor?

1
Todas las respuestas a la pregunta 3
1

Después de buscar y no poder implementar la acción mediante el hook init, encontré esta solución alternativa que, aunque seguramente no es la mejor, funciona bastante bien.

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

al final de las instrucciones del $_POST. Si alguien tiene una mejor solución, bienvenido sea compartirla.

9 jun 2016 13:09:44
Comentarios

Estuve cerca de este enfoque pero no pude descubrir cómo activarlo desde mi función. Algo me dice que tal vez debería estar solucionando esto antes en el proceso.

sturlabragason sturlabragason
3 jun 2019 14:55:22
0

Si tu página ha sido enviada, entonces puedes estar bastante seguro de que $_SERVER['HTTP_REFERER'] está disponible.

Así que puedes hacer cualquiera de las dos opciones: wp_redirect($_SERVER['HTTP_REFERER']); o header('Location: ' . $_SERVER['HTTP_REFERER'])

Esto realizará una redirección a la misma página en la que ya te encuentras.

30 nov 2016 12:00:10
5

Es porque tu función archive_action se ejecuta cuando el bucle ya se realizó. Intenta enlazar tu función a la acción init, así se ejecutará antes del bucle.

Otro enfoque más elegante sería usar ajax. Así puedes enviar la solicitud mediante Ajax para archivar y simplemente usar javascript para eliminar la publicación del DOM.

8 jun 2016 17:31:12
Comentarios

¡Gracias! Pero, ¿cómo podría pasar una variable usando init? Me refiero a que debería apuntar a una fila específica. Ahora envío el post_id a través de do_action('archive_action', $pid);. ¿Podrías explicármelo? No me queda muy claro.

middlelady middlelady
8 jun 2016 17:41:36

He editado la pregunta y he explicado que mi función está en functions.php y la he convertido en una acción. Eso se me había pasado. Luego llamo a esta acción en mi bucle pasando el $post->id al archivo. ¿Cómo podría hacerlo con init?

middlelady middlelady
8 jun 2016 17:51:58

Tendrás que separar esta función y colocarla en el hook init

Bruno Cantuaria Bruno Cantuaria
9 jun 2016 01:01:04

Gracias Bruno, realmente lo aprecio. Pero si lo pregunto es porque no sé cómo hacerlo. ¿Tienes algún enlace con ejemplos? No encuentro ninguna referencia por ningún lado. Gracias de nuevo.

middlelady middlelady
9 jun 2016 10:39:47

Su pregunta de seguimiento está aquí: https://wordpress.stackexchange.com/questions/229228/init-action-and-refresh-page-after-form-action

Jesse Nickles Jesse Nickles
24 jul 2022 21:53:41