Cum să reîmprospătezi corect pagina după acțiunea unui formular?
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">×</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?

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.

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.

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.

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.

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
?

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

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.

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