¿Cómo actualizar correctamente la página después de una acción del formulario?
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">×</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?

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.

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.

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.

¡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.

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
?

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.

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