Come aggiornare correttamente la pagina dopo un'azione del form?

8 giu 2016, 17:00:34
Visualizzazioni: 50K
Voti: 5

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">&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 }

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?

1
Tutte le risposte alla domanda 3
1

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.

9 giu 2016 13:09:44
Commenti

Ero vicino a questo approccio ma non riuscivo a capire come attivarlo dalla mia funzione. Qualcosa mi dice che forse dovrei risolvere questo problema prima nel pipeline.

sturlabragason sturlabragason
3 giu 2019 14:55:22
0

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

30 nov 2016 12:00:10
5

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

8 giu 2016 17:31:12
Commenti

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.

middlelady middlelady
8 giu 2016 17:41:36

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?

middlelady middlelady
8 giu 2016 17:51:58

Dovrai separare questa funzione e inserirla sull'hook init

Bruno Cantuaria Bruno Cantuaria
9 giu 2016 01:01:04

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.

middlelady middlelady
9 giu 2016 10:39:47

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

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