wp_redirect non funziona dopo l'invio del modulo

22 dic 2012, 19:28:32
Visualizzazioni: 19.2K
Voti: 8

Sto utilizzando questo reindirizzamento dopo l'inserimento di un post. Non funziona, si limita a ricaricare la pagina del modulo. So che $pid sta ottenendo l'ID del post, quindi qual è il problema? Questo è proprio alla fine del mio codice PHP per la gestione dell'invio del modulo.

$pid = wp_insert_post($new_post);

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

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

Ecco un pastebin del codice completo

Utilizzando Better HTTP Redirects l'output è, e collega la parola here al nuovo post pubblicato correttamente.

302 Found
The document has moved here.
5
Commenti

Difficile indovinare qualcosa da queste informazioni, hai provato a eseguire il debug per ottenere maggiori dettagli? Il plugin Better HTTP Redirects è un buon strumento per analizzare i problemi di reindirizzamento.

Rarst Rarst
22 dic 2012 19:32:09

Per favore, posta questo codice nel contesto.

s_ha_dum s_ha_dum
22 dic 2012 19:33:47

@s_ha_dum Ho aggiornato la mia domanda includendo un pastebin

Anagio Anagio
22 dic 2012 19:38:08

@Rarst Ho aggiornato la domanda con un pastebin dell'intero codice

Anagio Anagio
22 dic 2012 19:38:24

@Rarst Ho installato il plugin, per favore guarda il mio post aggiornato. Mostra un 302 e collega al nuovo post ma non si aggiorna lì

Anagio Anagio
22 dic 2012 19:44:55
Tutte le risposte alla domanda 2
5
15

Puoi utilizzare wp_redirect solo prima che il contenuto venga inviato al browser. Se abilitassi il debug di PHP, vedresti un errore "headers already sent" a causa di get_header() sulla prima riga.

Invece di elaborare il form nel template, puoi agganciare un'azione precedente, come wp_loaded, e risparmiare alcune query al database se stai per reindirizzare altrove.

MODIFICA, esempio-

add_action( 'wp_loaded', 'wpa76991_process_form' );
function wpa76991_process_form(){
    if( isset( $_POST['my_form_widget'] ) ):
        // elabora il form, e poi
        wp_redirect( get_permalink( $pid ) );
        exit();
    endif;
}

Utilizzando un'azione, puoi mantenere il codice separato dai tuoi template. Combina questo con uno shortcode per generare il form e racchiudi tutto in una classe per salvare lo stato tra elaborazione/output, e potresti fare tutto senza toccare i template front-end.

22 dic 2012 19:53:07
Commenti

@Miloe sì, ho appena visto il messaggio "headers already sent" ora con il debug attivato e il plugin better http redirect attivo. Non ho familiarità con l'uso degli hook, puoi indicarmi qualche tutorial o mostrarmi del codice di esempio per favore

Anagio Anagio
22 dic 2012 19:55:46

@Anagio - ho aggiunto un esempio

Milo Milo
22 dic 2012 21:53:52

Grazie, quindi mi stai suggerendo di inserire il form in uno shortcode e poi usare do_shortcode() all'interno del template per visualizzare il form. L'hook andrebbe nel mio functions.php. A cosa diventa l'action del form per attivare la funzione/hook?

Anagio Anagio
23 dic 2012 09:36:29

non dovresti usare do_shortcode, il mio punto era che potresti aggiungerlo tramite uno shortcode al contenuto di un post/pagina, così tutto il tuo codice di elaborazione e rendering è separato dal template, in questo modo il modulo potrebbe funzionare su qualsiasi pagina in cui inserisci lo shortcode del modulo all'interno del contenuto. L'azione può semplicemente puntare alla pagina corrente con un #, o essere vuota, visto che stai agganciando tutte le richieste per verificare se il tuo modulo è stato inviato, funzionerà da/per qualsiasi pagina.

Milo Milo
23 dic 2012 19:54:48

@Milo hai centrato il problema per me. "headers already sent" era il problema nel mio caso. Grazie

henrywright henrywright
24 set 2013 18:38:34
4

Spostare get_header(); in fondo al codice dovrebbe risolvere il problema. Il tuo codice verrà eseguito prima che vengano inviati gli header e il reindirizzamento funzionerà.

// ...
wp_redirect( get_permalink($pid) );
exit();
//inserisci tassonomie
} 
get_header(); ?>

Presumo che ci sia altro codice nella pagina oltre a quello che hai postato? Altrimenti non vedo la necessità di get_header() del tutto.

L'unico vantaggio che posso vedere nell'usare un hook come suggerisce Milo è che potresti evitare qualche overhead se scegli un hook abbastanza precoce. Potresti risparmiare una frazione di secondo nel processing.

22 dic 2012 20:20:14
Commenti

Sì, c'è del codice HTML, e alcune funzioni di WordPress come get_sidebars(), get_footer() ecc. Non ho familiarità con l'uso degli hook, ma mi piacerebbe vedere un esempio. Sto già cercando su Google e vedo che si parla di add_action('wp_loaded', 'your_function') ma non sono sicuro di come usarlo. Apprezzerei qualsiasi esempio, grazie.

Anagio Anagio
22 dic 2012 20:22:35

Aspetterò un po' per vedere se @Milo posta un esempio usando un hook, visto che è la sua risposta. Altrimenti, modificherò la mia risposta.

s_ha_dum s_ha_dum
22 dic 2012 20:25:03

Grazie, spostare get_header() dopo il codice di gestione del form e il redirect ha funzionato. Vorrei comunque vedere come usare l'hook.

Anagio Anagio
22 dic 2012 20:31:41

@s_ha_dum quel suggerimento è un diamante in poche parole. :) Ha spiegato tutto. Ho provato molti modi - tutte quelle cose con wp_loaded, template_redirect, ma non sono riuscito a far funzionare le cose. Grazie mille.

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