Come aggiornare correttamente la pagina dopo un'azione del form?
Ho una pagina di elenco post dove vengono mostrati tutti i post. Su ogni riga del post posso eseguire azioni come eliminare, archiviare ecc. Quindi immaginate che:
- Ho un pulsante "archivia";
- Premo su di esso e ottengo una modale (form) che dice "Vuoi archiviare questo post?"
- Nella modale ho il pulsante di invio, che dovrebbe eseguire l'azione del form e aggiornare la pagina, nascondendo il post appena archiviato.
Il mio problema: Il mio post viene archiviato ma devo aggiornare la pagina 2 volte prima di vederlo scomparire. Quando clicco su invio, la pagina si aggiorna ma vedo ancora il post che viene nascosto solo al secondo ricaricamento.
Suppongo di star eseguendo l'azione in modo errato. Il mio codice in functions.php:
add_action('archive_post','archive_action');
function archive_action($pid) {
if(isset($_POST['archive']))
{
update_post_meta($pid, 'archived', "1");
//altro codice
}
?>
<div id="archive-modal" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="box_title">
<?php printf(__("Vuoi archiviare questo",'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 }
Richiamo questa funzione nel mio loop per passare il $post->id
da archiviare in questo modo:
do_action('archive_post', $pid);
Quello che ho provato finora:
- form
action=""
vuoto per aggiornare la pagina, come nel codice: non funziona, il post rimane e solo se aggiorno di nuovo scompare; wp_redirect(get_permalink());
nella funzione$_POST
: come prima;echo '<meta http-equiv="refresh" content="0.5;url='.$mylink.'" />';
funziona ma, ancora una volta, aggiorna la pagina due volte, è come prima, solo automatizzato.
C'è qualche altra soluzione? Cosa mi sto perdendo per favore?
Cercando in giro e non essendo riuscito a implementare l'azione tramite l'hook init
, ho trovato questa soluzione alternativa che sicuramente non è la migliore ma fa al caso suo.
echo "<script type='text/javascript'>
window.location=document.location.href;
</script>";
alla fine delle istruzioni $_POST
.
Se qualcuno ha una soluzione migliore, è benvenuto a condividerla.

Se la tua pagina è stata inviata, puoi essere abbastanza sicuro che $_SERVER['HTTP_REFERER']
sia disponibile.
Quindi puoi fare entrambe le cose:
wp_redirect($_SERVER['HTTP_REFERER']);
oppure
header('Location: ' . $_SERVER['HTTP_REFERER'])
Questo eseguirà un reindirizzamento alla stessa pagina su cui ti trovi già.

È perché la tua funzione archive_action
viene eseguita quando il loop è già stato effettuato. Prova ad agganciare la tua funzione all'azione init
, così verrà eseguita prima del loop.
Un approccio più elegante sarebbe utilizzare ajax. In questo modo invii la richiesta attraverso Ajax per archiviare e usi semplicemente javascript per rimuovere il post dal DOM.

Grazie! Ma come potrei passare una variabile usando init
? Intendo dire che dovrei puntare a una riga specifica. Ora invio il post_id tramite do_action('archive_action', $pid);
. Potresti spiegarmelo? Non mi è molto chiaro.

Ho modificato la domanda e ho spiegato che la mia funzione è in functions.php e convertita in un'azione. Mi era sfuggito questo dettaglio. Chiamo quindi questa azione nel mio loop passando l'$post->id all'archivio. Come potrei fare con init
?

Grazie Bruno, lo apprezzo molto. Ma se lo chiedo è perché non so come farlo. Hai un link con degli esempi? Non riesco a trovare alcun riferimento in giro. Grazie ancora.

La sua domanda di follow-up è qui: https://wordpress.stackexchange.com/questions/229228/init-action-and-refresh-page-after-form-action
