Cum să opriți retrimiterea formularului la reîmprospătarea paginii
Salut! Am un formular care adaugă atașamente la o postare, însă când formularul este trimis, evident nu afișează postarea cu noul atașament ci doar mesajul "fișierul tău a fost încărcat". Când utilizatorul reîmprospătează pagina (pentru a încerca să vadă noul atașament) formularul este trimis din nou!
Este posibil să (1) oprim retrimiterea formularului la reîmprospătare, (2) să reîmprospătăm automat pagina pentru a afișa postarea cu noul atașament?? (varianta 2 ar fi mult mai bună)
<?php $post_id = $post->ID;
if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) {
require_once(ABSPATH . 'wp-admin/includes/admin.php');
$id = media_handle_upload('async-upload', $post_id); //id-ul postării pentru pagina Fișiere Client
unset($_FILES);
if ( is_wp_error($id) ) {
$errors['upload_error'] = $id;
$id = false;
}
if ($errors) {
echo "<p>A apărut o eroare la încărcarea fișierului.</p>";
} else {
echo "<p>Fișierul tău a fost încărcat.</p>";
}
}
?>
<form id="file-form" enctype="multipart/form-data" action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="POST">
<p id="async-upload-wrap"><label for="async-upload">încarcă</label>
<input type="file" id="async-upload" name="async-upload"> <input type="submit" value="Încarcă" name="html-upload"></p>
<p><input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id ?>" />
<?php wp_nonce_field('client-file-upload'); ?>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>" /></p>
<p><input type="submit" value="Salvează toate modificările" name="save" style="display: none;"></p>
</form>
Mulțumesc! :)
În loc de …
} else {
echo "<p>Fișierul dumneavoastră a fost încărcat.</p>";
}
… redirecționează către o altă adresă în caz de succes:
} else {
$new_url = add_query_arg( 'success', 1, get_permalink() );
wp_redirect( $new_url, 303 );
exit;
}
Codul de stare 303 declanșează o cerere GET:
Această metodă există în principal pentru a permite ieșirii unui script activat prin POST să redirecționeze agentul utilizator către o resursă selectată. Noul URI nu este o referință substitută pentru resursa solicitată inițial. Răspunsul 303 NU TREBUIE să fie cache-uit, dar răspunsul la a doua cerere (redirecționată) ar putea fi cache-abil.
În gestionarul formularului, verifică mai întâi dacă $_GET['success']
este setat și valoarea sa este 1
, apoi afișează un mesaj de succes. Vizitatorul poate reîncărca această pagină din nou și din nou – și nimic nu va fi trimis.

Din păcate, asta nu a funcționat și nu am nicio idee de ce, deoarece acel cod PHP se execută (doar pentru a confirma, tot ce trebuia să fac era să înlocuiesc echo?)

Trebuie să trimiți header-ul înainte ca orice output să fie trimis către browser.

@ameeromar Da. Toată procesarea datelor ar trebui să fie făcută înainte de a începe generarea rezultatelor.

Aceasta funcționează în WP și 303 este un cod de redirecționare corect în acest caz.

Practic, ideea generală este să redirecționezi utilizatorul către alte pagini după trimiterea formularului, ceea ce ar împiedica retrimiterea formularului la reîmprospătarea paginii. Dar dacă trebuie să ții utilizatorul pe aceeași pagină după trimiterea formularului, poți face acest lucru în mai multe moduri.
Anularea datelor formularului
O metodă de a împiedica retrimiterea formularului la reîmprospătarea paginii este să anulezi datele formularului după trimitere, astfel încât variabila care stochează datele formularului devine goală și să înfășori codul de procesare al formularului pentru a verifica dacă formularul este gol.
if(!empty($_POST) && $_SERVER['REQUEST_METHOD'] == 'POST'){ $data = // cod de procesare aici unset $data; }
Aceasta va face ca $data să fie goală după procesare, iar prima condiție va împiedica retrimiterea formularului la reîmprospătarea paginii.
Javascript
Această metodă este destul de ușoară și blochează fereastra care solicită retrimiterea formularului la reîmprospătare odată ce formularul a fost trimis. Pur și simplu plasează această linie de cod JavaScript în subsolul fișierului tău și vezi magia.
<script> if ( window.history.replaceState ) { window.history.replaceState( null, null, window.location.href ); } </script>
Pentru mai multe detalii despre astfel de întrebări, poți vizita acest link.

Am avut aceeași problemă și a fost "complicată" de faptul că redirecționez toate URL-urile către un singur fișier .php. S-a dovedit că tot ce trebuia să fac pentru a o rezolva a fost să inserez următorul fragment de cod înainte ca orice HTML să fie scris pe pagină.
<?php
if (isset($_POST['mypostvar']) && isset($_SERVER['REQUEST_URI']))
{
[procesează datele postate în 'mypostvar']
header ('Location: ' . $_SERVER['REQUEST_URI']);
exit();
}
?>
Acest lucru va redirecționa către aceeași pagină după ce datele postate sunt procesate, așa cum doriți. După redirecționare, datele postate inițiale dispar și nu vor declanșa retrimiterea. Funcția 'header()' va funcționa doar dacă o inserați înainte ca orice să fie scris pe pagină. exit() este necesar.
Trebuie să procesați datele postate înainte de a plasa header().

Am rezolvat această problemă folosind acțiunea template_redirect (fie într-un plugin, fie în fișierul functions.php al temei).
add_action('template_redirect','myfunction') ;
function myfunction() {
global $post;
$post_id = $post->ID;
if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) {
require_once(ABSPATH . 'wp-admin/includes/admin.php');
$id = media_handle_upload('async-upload', $post_id); //ID-ul postării paginii Fișiere Client
unset($_FILES);
if ( is_wp_error($id) ) {
$errors['upload_error'] = $id;
$id = false;
}
}
$error = ($errors) ? 1 : 0;
wp_redirect( "/?p={$post_id}?errors={$error}",301);
}
Apoi, pe pagina dvs. puteți verifica dacă există erori
if ($_GET['errors']) {
echo "<p>A apărut o eroare la încărcarea fișierului.</p>";
} else {
echo "<p>Fișierul dvs. a fost încărcat.</p>";
}
(Nu am testat acest cod.. ar trebui să vă ofere un punct de plecare bun).

o metodă mai ușoară este să eliminați acțiunea din formular și să aveți o acțiune ascunsă, de exemplu:
<html>
<form action="" method="post"><input type="text" name="name" />
<input type="submit" value="Trimite" />
<input type="hidden" name="action" value="Trimite" />
</form>
</html>
controlerul tău ar trebui să verifice validitatea și trimiterile pentru a verifica dacă formularul a fost trimis:
<?php
if (isset($_POST['action']) && $_POST['action'] == 'Trimite'){
//ar trebui să adaugi cod pentru validarea inputului utilizatorului aici
//dacă totul este în regulă, trimite formularul
header('Location: .'); //redirecționează către controler fără retrimitere
}
?>
această metodă este foarte utilă pentru scripturile în care adaugi sau elimini înregistrări pe o pagină de administrare, deoarece va reîncărca pagina fără retrimitere, iar înregistrarea eliminată sau adăugată va fi fie eliminată, fie adăugată pe pagină :)

Cea mai bună metodă pe care am găsit-o este utilizarea JavaScript și CSS. Metoda comună de redirecționare PHP header('Location: <a href="a0">http://www.yourdomain.com/url</a>);
va funcționa, dar poate cauza avertismentul "Warning: Cannot modify header information - headers already sent" în diferite framework-uri și CMS-uri precum WordPress, Drupal etc. Așadar, sugestia mea este să urmați codul de mai jos:
echo '<style>body{display:none;}</style>';
echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>';
exit;
Tag-ul <style>
este important, altfel utilizatorul poate avea senzația că pagina s-a încărcat de două ori. Dacă folosim tag-ul <style>
cu body { display: none; }
și apoi reîmprospătăm pagina, experiența utilizatorului va fi la fel ca în cazul header('Location: ....);
din PHP.
Sper că acest lucru vă va fi de ajutor :)

Soluția 1:
Dacă inserezi un post într-un tip de postare, atunci pur și simplu generează un cod aleator folosind funcția PHP rand()
și salvează codul în timpul inserării postului. De asemenea, setează același cod în variabila $_POST['uniqueid']
.
Apoi verifică la inserare dacă uniqueid-ul curent există deja în postări sau nu, poți face acest lucru folosind wp_query()
.
Soluția 2: Redirecționează către o altă pagină folosind JavaScript. Dar reține că utilizatorul poate să se întoarcă la pagină și la reîncărcare va salva din nou postarea. Pentru această problemă, prima soluție este cea mai bună.
Soluția 3: Folosește AJAX pentru a insera postarea - nu vor exista astfel de probleme. Dar dacă ai nevoie de vizualizări ale paginii, aceasta nu este o idee bună, poate doar pentru Google Adsense.
Am încercat doar să ajut din experiența mea. Dacă cineva are nevoie de cod pentru a rezolva problema, pur și simplu cere, voi împărtăși.

modul simplu și ușor de a face acest lucru în php.
exemplu aici:
nu uitați tag-urile html (acest formular nu le permite aici, așa că folosesc [acestea])
$firstname = $post[firstname]
$lastname = $post[lastname]
[form action="here.php" method="post"]
prenume [input type='firstname' name='firstname']
nume [input type='text' name='lastname']
[input type=submit value=trimite]
[/form]
if($firstname==""||$lastname=="")
{
echo "prenumele și numele sunt goale";
}
else
{
mysql_query("INSERT AICI ÎN BAZA DE DATE");
header("Location:here.php");
}
acesta este modul de a păstra datele introduse în baza de date și de a evita postarea acelorași date de două ori la reîmprospătarea paginii
