web-dev-qa-db-fra.com

Actualiser la page après l'action du formulaire

J'ai une page de publication où tous les articles sont affichés. Sur chaque ligne, je peux effectuer des actions telles que supprimer, archiver, etc. Alors imaginez que:

  • J'ai un bouton "archive";
  • J'appuie dessus et je reçois un modal (formulaire) disant "Voulez-vous archiver ce message?"
  • Dans le modal, j'ai le bouton d'envoi, qui doit exécuter l'action de formulaire et actualiser la page en masquant le message qui vient d'être archivé.

Mon problème: Mon message est archivé, mais je dois rafraîchir la page 2 fois avant de voir qu'il a disparu de ma page. Lorsque je clique sur Soumettre, la page est actualisée mais je vois toujours le message qui est masqué la deuxième fois que je recharge.

Je suppose que je me trompe en effectuant l'action. Mon code dans functions.php:

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

    ?>
<div id="archive-modal" class="modal fade" role="dialog">
    <div class="modal-dialog">
        <div class="box_title">
            <?php printf(__("Do you want archive this",'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 }

J'appelle cette fonction dans ma boucle pour passer le $post->id à archiver comme ceci:

do_action('archive_post', $pid);

Ce que j'ai essayé jusqu'à présent:

  • formulaire action="" vide pour actualiser la page, comme dans le code: ne fonctionne pas , la publication demeure et si elle est réactualisée, elle disparaît;
  • wp_redirect(get_permalink()); dans la fonction $_POST: idem avant ;
  • echo '<meta http-equiv="refresh" content="0.5;url='.$mylink.'" />'; ça marche mais, encore une fois, ça rafraîchit la page deux fois, c'est comme avant, seulement automatisé.

Y a-t-il une autre solution? Qu'est-ce qui me manque, s'il vous plaît?

2
huraji

Si votre page a été soumise, vous pouvez être sûr que $_SERVER['HTTP_REFERER'] est disponible.

Donc, vous pouvez faire: wp_redirect($_SERVER['HTTP_REFERER']); ou header('Location: ' . $_SERVER['HTTP_REFERER'])

Cela fera une redirection vers la même page que celle sur laquelle vous êtes déjà.

4
DarkNeuron

En cherchant autour de moi et en ne pouvant pas mettre en œuvre l'action via le crochet init, j'ai trouvé cette solution de contournement qui, à coup sûr, n'est pas la meilleure mais fait parfaitement l'affaire.

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

à la fin des instructions $_POST. Si quelqu'un a une meilleure solution, bienvenue à partager.

2
huraji

C'est parce que votre fonction archive_action est exécutée alors que la boucle était déjà faite. Essayez d’accrocher votre fonction à l’action init afin qu’elle soit exécutée avant la boucle.

Une autre approche plus jolie consisterait à utiliser ajax. Donc, vous envoyez la demande via Ajax à archiver et utilisez simplement javascript pour supprimer la publication du DOM.

0
Bruno Cantuaria