Cum să reîmprospătezi corect pagina după acțiunea unui formular?

8 iun. 2016, 17:00:34
Vizualizări: 50K
Voturi: 5

Am o pagină de listare unde sunt afișate toate postările. Pentru fiecare rând al postării pot efectua acțiuni precum ștergere, arhivare etc. Așadar, imaginați-vă că:

  • Am un buton "arhivează";
  • Apăs pe el și primesc o modalitate (formular) care spune "Doriți să arhivați această postare?"
  • În modal am butonul de trimitere, care ar trebui să execute acțiunea formularului și să reîmprospăteze pagina, ascunzând postarea tocmai arhivată.

Problema mea: Postarea mea este arhivată, dar trebuie să reîmprospătez pagina de 2 ori înainte să o văd dispărută din pagina mea. Când doar apăs pe trimitere, pagina se reîmprospătează dar încă văd postarea care este ascunsă abia la a doua reîncărcare.

Presupun că fac ceva greșit în executarea acțiunii. Codul meu din functions.php:

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

    ?>
<div id="archive-modal" class="modal fade" role="dialog">
    <div class="modal-dialog">
        <div class="box_title">
            <?php printf(__("Doriți să arhivați aceasta",'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 }

Apelez această funcție în bucla mea pentru a transmite $post->id pentru arhivare astfel:

do_action('archive_post', $pid);

Ce am încercat până acum:

  • formular cu action="" gol pentru reîmprospătarea paginii, ca în cod: nu funcționează, postarea rămâne și doar dacă reîmprospătez din nou dispare;
  • wp_redirect(get_permalink()); în funcția $_POST: la fel ca înainte;
  • echo '<meta http-equiv="refresh" content="0.5;url='.$mylink.'" />'; funcționează dar, din nou, reîmprospătează pagina de două ori, este la fel ca înainte, doar că automatizat.

Există vreo altă soluție? Ce îmi scapă vă rog?

1
Toate răspunsurile la întrebare 3
1

Căutând și neputând implementa acțiunea prin intermediul hook-ului init, am găsit această soluție temporară care, cu siguranță, nu este cea mai bună, dar își face treaba.

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

la sfârșitul instrucțiunilor $_POST. Dacă cineva are o soluție mai bună, sunt binevenite sugestii.

9 iun. 2016 13:09:44
Comentarii

A fost aproape de această abordare, dar nu am reușit să-mi dau seama cum să o declanșez din funcția mea. Ceva îmi spune că poate ar trebui să rezolv asta mai devreme în pipeline.

sturlabragason sturlabragason
3 iun. 2019 14:55:22
0

Dacă pagina ta a fost trimisă, atunci poți fi destul de sigur că $_SERVER['HTTP_REFERER'] este disponibil.

Deci poți face fie: wp_redirect($_SERVER['HTTP_REFERER']); sau header('Location: ' . $_SERVER['HTTP_REFERER'])

Aceasta va face o redirecționare către aceeași pagină pe care ești deja.

30 nov. 2016 12:00:10
5

Acest lucru se întâmplă deoarece funcția ta archive_action este executată după ce bucla a fost deja realizată. Încearcă să conectezi funcția ta la acțiunea init, astfel încât să fie executată înainte de buclă.

O abordare mai elegantă ar fi utilizarea Ajax. Deci, trimiteți cererea prin Ajax pentru a arhiva și utilizați doar JavaScript pentru a elimina postarea din DOM.

8 iun. 2016 17:31:12
Comentarii

Mulțumesc! Dar cum aș putea transmite o variabilă folosind init? Adică ar trebui să țintesc un rând specific. Acum trimit post_id prin do_action('archive_action', $pid);. Poți să-mi explici? Nu e foarte clar pentru mine.

middlelady middlelady
8 iun. 2016 17:41:36

Am editat întrebarea și am explicat că funcția mea este în functions.php și transformată într-o acțiune. Am omis acest detaliu. Apoi apelez această acțiune în loop-ul meu transmitând $post->id către archive. Cum aș putea face asta cu init?

middlelady middlelady
8 iun. 2016 17:51:58

Va trebui să separi această funcție și să o pui pe hook-ul init

Bruno Cantuaria Bruno Cantuaria
9 iun. 2016 01:01:04

Mulțumesc Bruno, apreciez foarte mult. Dar dacă întreb, e pentru că nu știu cum să o fac. Ai vreun link cu exemple? Nu găsesc nicio referință pe nicăieri. Mulțumesc din nou.

middlelady middlelady
9 iun. 2016 10:39:47

Următoarea ei întrebare este aici: https://wordpress.stackexchange.com/questions/229228/init-action-and-refresh-page-after-form-action

Jesse Nickles Jesse Nickles
24 iul. 2022 21:53:41