Errore "headers already sent" con wp_redirect dopo form di invio front-end
Sto provando a creare un form per l'invio di post dal front-end e ricevo questo errore:
Warning: Cannot modify header information - headers already sent by (output started at /home/sadlight/public_html/members/wp-content/themes/default-child/announcement-submit.php:1) in /home/sadlight/public_html/members/wp-includes/pluggable.php on line 876
announcement-submit.php è il mio template mostrato di seguito.
Ho provato questa soluzione, ma senza successo.
Inoltre, quando uso wp_redirect nel mio codice qui sotto, vengono inseriti DUE post invece di uno. Se lo rimuovo, ne inserisce solo uno. Qualsiasi aiuto sarebbe fantastico!
Per completezza: sto usando buddypress con il tema predefinito di buddypress.
<?php
/*
* Template Name: Invio Annuncio
*/
$postTitleError = '';
if ( isset( $_POST['submitted'] ) ) {
if ( trim( $_POST['postTitle'] ) === '' ) {
$postTitleError = 'Inserisci un titolo.';
$hasError = true;
}
}
get_header(); ?>
<div id="content">
<div class="padder">
<form action="" id="primaryPostForm" method="POST">
<fieldset>
<label for="postTitle"><?php _e('Titolo Post:', 'framework') ?></label>
<input type="text" name="postTitle" id="postTitle" class="required" value="<?php if ( isset( $_POST['postTitle'] ) ) echo esc_attr( stripslashes( $_POST['postTitle'] ) ); ?>" />
</fieldset>
<fieldset>
<?php wp_editor( 'Test contenuto', 'postcontent'); ?>
</fieldset>
<fieldset>
<?php wp_nonce_field( 'post_nonce', 'post_nonce_field' ); ?>
<input type="hidden" name="submitted" id="submitted" value="true" />
<button type="submit"><?php _e('Aggiungi Post', 'framework') ?></button>
</fieldset>
</form>
<?php if ( $postTitleError != '' ) { ?>
<span class="error"><?php echo $postTitleError; ?></span>
<div class="clearfix"></div>
<?php } ?>
<?php
if ( isset( $_POST['submitted'] ) && isset( $_POST['post_nonce_field'] ) && wp_verify_nonce( $_POST['post_nonce_field'], 'post_nonce' ) ) {
if ( trim( $_POST['postTitle'] ) === '' ) {
$postTitleError = 'Inserisci un titolo.';
$hasError = true;
}
$post_information = array(
'post_title' => wp_strip_all_tags( $_POST['postTitle'] ),
'post_content' => wp_kses_post( $_POST['postcontent'] ),
'post_type' => 'post',
'post_status' => 'pending'
);
$post_id = wp_insert_post( $post_information );
if ( $post_id ) {
wp_redirect( home_url() );
exit;
}
}
?>
</div><!-- .padder -->
</div><!-- #content -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Come ha sottolineato Otto, stai inviando dati al browser prima di chiamare wp_redirect()
.
get_header()
produrrà l'HTML<head>
della pagina- Stai stampando l'intero modulo nella pagina prima di elaborarlo.
Per risolvere il problema degli "headers already sent", devi spostare tutta l'elaborazione del modulo dalla parte inferiore alla parte superiore della pagina. Se devi chiamare wp_redirect()
, questa chiamata deve avvenire prima di stampare qualsiasi cosa - HTML o altro - sulla pagina.
Per quanto riguarda il duplicato dell'articolo, hai wp_insert_post()
due volte nel tuo codice:
if ( isset( $_POST['submitted'] ) && isset( $_POST['post_nonce_field'] ) && wp_verify_nonce( $_POST['post_nonce_field'], 'post_nonce' ) ) {
if ( trim( $_POST['postTitle'] ) === '' ) {
$postTitleError = 'Inserisci un titolo.';
$hasError = true;
}
$post_information = array(
'post_title' => wp_strip_all_tags( $_POST['postTitle'] ),
'post_content' => wp_kses_post( $_POST['postcontent'] ),
'post_type' => 'post',
'post_status' => 'pending'
);
wp_insert_post( $post_information );
}
$post_id = wp_insert_post( $post_information );
Quindi stai tentando di inserire un articolo ad ogni caricamento della pagina, ma se non è stato inviato nulla, la variabile $post_information
non sarà impostata e non verrà inserito nulla. Tuttavia, quando invii il modulo, stai creando un nuovo articolo sia all'interno del controllo booleano che al di fuori di esso.

Inoltre, sarebbe meglio spostare l'intera elaborazione del form nel file delle funzioni e agganciarlo a qualche azione come template_redirect
, dove sei sicuro che nulla è stato ancora inviato al browser.

Grazie! Questa è una cosa che preferirei fare per mantenere le cose separate. Tuttavia, ho cercato per un'ora cercando di capire meglio come usare template_redirect o cosa faccia effettivamente. Sono perplesso.

headers già inviati da (output iniziato in /home/sadlight/public_html/members/wp-content/themes/default-child/announcement-submit.php:1)
Il messaggio di errore ti dice esattamente ciò che devi sapere.
Il file "announcement-submit.php" è dove si trova il problema.
Il numero "1" indica la riga del problema.
Quindi, in realtà hai qualcosa prima della tua riga iniziale <?php
che sta causando output. Forse una riga vuota. O forse il BOM UTF-8.
Carica il file in un editor di testo semplice. Niente di elaborato. Notepad, per esempio. O VIM. Assicurati che non ci sia nulla prima del tag PHP iniziale. Salva il file. Oppure, nel tuo editor preferito, controlla le opzioni di salvataggio e assicurati che non sia impostato per salvare un BOM (Byte-Order-Marker) all'inizio del file.

non è solo lo spazio prima dell'apertura <?php
, c'è l'intero get_header
e tutto il markup generato prima della riga wp_redirect
a metà del template.

Grazie per la tua risposta. Ho provato ciò che hai suggerito usando solo notepad. Mi sono anche assicurato che Notepad++ (il mio editor di codice) stesse salvando in UTF-8 senza BOM. Ho ricaricato il file... e ora ho questo errore: Warning: Cannot modify header information - headers already sent by (output started at /home/sadlight/public_html/members/wp-content/plugins/buddypress/bp-themes/bp-default/header.php:2) in /home/sadlight/public_html/members/wp-includes/pluggable.php on line 876
.... La linea 2 di header.php è <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>

@Milo Ho rimosso tutto lo spazio bianco che potevo e che aveva senso... tra le righe e dopo le righe. Stesso errore.

Questo può avere molteplici cause. Gli header possono essere inviati solo quando non c'è alcun output prima di essi. E con output intendo qualsiasi output. Quindi nessuno spazio bianco prima dei tag di apertura PHP, nessun echo
, nessun carattere BOM.
Fondamentalmente quel messaggio di errore ti dice esattamente dove inizia l'output, quindi è lì che sta accadendo una delle cose sopra menzionate.
Per una lista completa delle cose che dovresti controllare e anche come prevenire questo errore, consulta questo ottimo post su Stack Overflow.
