wp_redirect nu funcționează după trimiterea formularului

22 dec. 2012, 19:28:32
Vizualizări: 19.2K
Voturi: 8

Folosesc această redirecționare după inserarea unui post. Nu funcționează, doar reîmprospătează pagina pe care se află formularul. Știu că $pid primește ID-ul postului, deci care este problema? Acesta este sfârșitul codului meu PHP pentru gestionarea trimiterii formularului.

$pid = wp_insert_post($new_post);

update_post_meta($pid,'domain',$domain);
update_post_meta($pid,'keywords',$keywords);

wp_redirect( get_permalink($pid) );
exit();

Aici este un pastebin al codului complet

Folosind Better HTTP Redirects, rezultatul este, iar cuvântul here este legat la noul post publicat corect.

302 Found
The document has moved here.
5
Comentarii

Greu de dedus ceva din aceste informații, ai încercat să depanezi pentru mai multe detalii? Plugin-ul Better HTTP Redirects este un instrument bun pentru a investiga problemele de redirecționare.

Rarst Rarst
22 dec. 2012 19:32:09

Te rog postează acest cod în context.

s_ha_dum s_ha_dum
22 dec. 2012 19:33:47

@s_ha_dum Am actualizat întrebarea pentru a include un link pastebin

Anagio Anagio
22 dec. 2012 19:38:08

@Rarst Am actualizat întrebarea cu un link pastebin către întregul cod

Anagio Anagio
22 dec. 2012 19:38:24

@Rarst Am instalat plugin-ul, te rog verifică postul meu actualizat. Afișează un cod 302 și face link către noul post, dar nu se reîmprospătează acolo

Anagio Anagio
22 dec. 2012 19:44:55
Toate răspunsurile la întrebare 2
5
15

Poți folosi wp_redirect doar înainte ca conținutul să fie trimis către browser. Dacă ai activa depanarea în PHP, ai vedea o eroare "headers already sent" din cauza apelului get_header() de pe prima linie.

În loc să procesezi formularul în template, poți atașa la o acțiune mai timpurie, cum ar fi wp_loaded, și să economisești câteva interogări la baza de date dacă intenționezi doar să redirecționezi utilizatorul.

EDITARE, exemplu-

add_action( 'wp_loaded', 'wpa76991_process_form' );
function wpa76991_process_form(){
    if( isset( $_POST['my_form_widget'] ) ):
        // procesează formularul, apoi
        wp_redirect( get_permalink( $pid ) );
        exit();
    endif;
}

Folosind o acțiune, poți separa codul de template-uri. Combină acest lucru cu un shortcode pentru a afișa formularul și încadrează totul într-o clasă pentru a păstra starea între procesare și afișare, astfel poți realiza totul fără a modifica template-urile front-end.

22 dec. 2012 19:53:07
Comentarii

@Miloe da, acum am văzut mesajul despre antetele deja trimise cu depanarea activată și pluginul better http redirect pornit. Nu sunt familiarizat cu utilizarea hook-urilor, poți să-mi arăți unde pot găsi un tutorial sau să-mi arăți un exemplu de cod te rog

Anagio Anagio
22 dec. 2012 19:55:46

@Anagio - am adăugat un exemplu

Milo Milo
22 dec. 2012 21:53:52

Mulțumesc, deci sugerezi să pun formularul într-un shortcode apoi să folosesc do_shortcode() în template pentru a afișa formularul. Hook-ul ar trebui să fie adăugat în functions.php. Ce ar trebui să fie acțiunea formularului pentru a declanșa funcția/hook-ul?

Anagio Anagio
23 dec. 2012 09:36:29

nu ar trebui să folosești do_shortcode, ideea mea era că poți să-l adaugi prin shortcode în conținutul unui articol/pagină, apoi toată logica de procesare și randare este separată de șablon, astfel formularul ar putea funcționa pe orice pagină unde plasezi shortcode-ul formularului în conținut. acțiunea poate fi direcționată către pagina curentă cu un #, sau poate fi lăsată goală, deoarece prinși toate cererile pentru a verifica dacă formularul a fost trimis, va funcționa de pe/pe orice pagină.

Milo Milo
23 dec. 2012 19:54:48

@Milo ai rezolvat perfect pentru mine. "headers already sent" a fost problema în cazul meu. Mulțumesc

henrywright henrywright
24 sept. 2013 18:38:34
4

Mutarea get_header(); la sfârșitul acelui cod ar trebui să rezolve problema. Codul tău se va executa înainte ca vreun antet să fie trimis și redirecționarea va funcționa.

// ...
wp_redirect( get_permalink($pid) );
exit();
//inserare taxonomii
} 
get_header(); ?>

Presupun că există mai mult cod pe pagină sub ceea ce ai postat? Dacă nu, nu văd nevoia de get_header() deloc.

Singurul beneficiu pe care îl văd în utilizarea unui hook așa cum sugerează Milo este că ai putea evita unele overhead-uri dacă alegi un hook suficient de devreme. Ai putea reduce timpul de procesare cu o fracțiune de secundă.

22 dec. 2012 20:20:14
Comentarii

Da, există niște HTML și câteva funcții WordPress precum get_sidebars(), get_footer() etc. Nu sunt deloc familiarizat cu utilizarea hook-urilor, dar aș dori foarte mult să văd un exemplu. Deja caut pe Google și văd oameni vorbind despre add_action('wp_loaded', 'your_function'), dar nu sunt sigur cum să-l folosesc. Orice exemplu este apreciat, mulțumesc.

Anagio Anagio
22 dec. 2012 20:22:35

Voi aștepta puțin și voi vedea dacă @Milo postează un exemplu folosind un hook, deoarece acesta este răspunsul său. Dacă nu, voi edita răspunsul meu.

s_ha_dum s_ha_dum
22 dec. 2012 20:25:03

Mulțumesc, mutarea get_header() sub codul de gestionare a formularului și redirecționarea a funcționat. Aș dori totuși să văd cum să folosesc hook-ul.

Anagio Anagio
22 dec. 2012 20:31:41

@s_ha_dum acel sfat este ca o diamant într-un cui. :) A explicat totul. Am încercat o mulțime de metode - toate lucrurile cu wp_loaded, template_redirect, dar nu am reușit să fac lucrurile să funcționeze. Mulțumesc mult.

Mayeenul Islam Mayeenul Islam
27 apr. 2015 08:44:10