web-dev-qa-db-fra.com

Obtenir l'erreur "Impossible de modifier les informations d'en-tête - les en-têtes déjà envoyés" sur wp-admin uniquement lorsqu'un plug-in est activé

J'ai eu ce problème dans cette question et j'ai essayé de déterminer d'où venait le problème, mais je suis plus confus maintenant.

J'essaie de mettre à jour mon site à partir de la version actuelle de WordPress 4.5.5. , mais d’abord, je veux résoudre toutes les erreurs causées par les thèmes et les plugins.

Dans wp-config.php, je règle WP_DEBUG et WP_DEBUG_LOG sur true.

J'ai désactivé tous les plugins et activé le thème Twenty Fifteen.

Dans ces conditions, je ne reçois que l'erreur suivante et uniquement sur les pages wp-admin, pas sur le front-end:

PHP Warning:  An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>. (WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.) in /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php on line 306

De plus, il semble que lorsque j'active un plugin (ce qui se passe avec les trois premiers que j'ai essayés, un à la fois), j'obtiens également d'autres erreurs, notamment:

PHP Warning:  Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php:306) in /Applications/MAMP/htdocs/site-url.com/wp-includes/pluggable.php on line 1167

J'ai eu cette erreur avec chacun des plugins suivants, chacun activé de manière isolée, avec le thème Twenty Fifteen actif:

  • AFC FLV-Player
  • Système de prise AFC
  • Akismet (qui semblait être un plugin très sûr)

chacun de ces plugins est à sa version la plus récente.

Voici un fichier journal détaillé en notant ce que j'ai fait et les erreurs à chaque étape.

Cela semble être un comportement étrange que je reçois l’erreur "En-têtes déjà envoyés" lorsqu’un plug-in est activé, apparemment quelle qu’en soit l’extension.

Quelles sont les prochaines étapes pour résoudre cette erreur? Je trouve que les messages de débogage manquent de spécificité, comme je comprends quand il est dit que le problème est dans functions.php, il est en réalité causé par autre chose la plupart du temps.

4
Mike Eng

Diagnostic d'erreur:

La première erreur:

PHP Warning:  An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>. (WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.) in /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php on line 306

Il s’agit essentiellement de WordPress qui tente de se connecter à api.wordpress.org pour vérifier les mises à jour liées au noyau, aux plugins, aux thèmes ou à la traduction. Même si vous désactivez la mise à jour automatique, WordPress effectuera ces vérifications, car la vérification de la mise à jour est également requise pour les mises à jour manuelles.

La deuxième erreur:

PHP Warning:  Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php:306) in /Applications/MAMP/htdocs/site-url.com/wp-includes/pluggable.php on line 1167

C'est probablement le résultat de la première erreur (ou d'une autre erreur) envoyée à la sortie avant que WordPress puisse générer des en-têtes HTTP. En fait, si vous générez quoi que ce soit (avec print, echo etc.) avant d'envoyer des en-têtes HTTP, vous obtiendrez cette erreur headers already sent.

Autres erreurs:

La seule autre erreur que j'ai vue dans votre vidage debug.log concerne des plug-ins utilisant des appels de fonction WordPress obsolètes. Si ces plugins ont une version mise à jour, ces erreurs ne persisteront pas après la mise à jour, elles ne sont donc pas vraiment sérieuses.

Une meilleure gestion des erreurs:

Lors du débogage, il est préférable d’envoyer ces erreurs uniquement dans le fichier debug.log et de désactiver l’affichage des erreurs au navigateur à l’aide des éléments suivants dans wp-config.php:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

Lorsque ce qui précède est défini, au lieu d’imprimer les erreurs dans le tampon de sortie (c.-à-d. Le navigateur), WordPress imprimera les erreurs only dans le fichier debug.log situé dans votre répertoire wp-content (s’il est accessible en écriture sur le Web). serveur). L'avantage de ceci est:

  1. Il est plus facile de vérifier les erreurs (erreurs, avertissements, avis, etc.) dans le fichier debug.log que dans le navigateur.

  2. Une erreur de sortie sur le navigateur rompt le code HTML du site.

  3. En enregistrant l'erreur only dans le fichier debug.log, vous éviterez également l'erreur headers already sent connectée dans son ensemble.

Arrêtez la vérification de la mise à jour de WordPress:

Même après avoir adopté la méthode de débogage ci-dessus, WordPress continue à générer la première erreur dans votre fichier debug.log. C'est ennuyeux car le fichier debug.log se remplira très rapidement et vous n'avez vraiment pas besoin de rechercher continuellement les mises à jour lorsque vous développez dans localhost (surtout lorsque vous êtes hors ligne).

Heureusement, vous pouvez arrêter cette vérification de mise à jour en utilisant le crochet de filtre pre_http_request. Utilisez le code suivant dans le fichier functions.php de votre thème ou, mieux encore, dans un plugin personnalisé et utilisez-le pour arrêter les vérifications de mises à jour de WordPress lorsque vous êtes hors ligne ou que vous développez dans localhost:

add_filter( 'pre_http_request', 'wp_update_check_short_circuit', 20, 3 );
function wp_update_check_short_circuit( $preempt = false, $args, $url ) {
    if ( stripos( $url, 'https://') === 0 ) {
        $url = substr( $url, 8 );
    }
    else {
        $url = substr( $url, 7 );
    }

    // stop other URL(s) requests as well (if you need to) in the same manner
    if ( stripos( $url, 'api.wordpress.org') === 0 ) {
        // WP is trying to get some info, short circuit it with a dummy response
        return array(
            'headers'   => null,
            'body'      => '',
            'response'  => array(
                'code'      => 503,
                'message'   => 'SERVICE_UNAVAILABLE'
                ),
            'cookies'   => array(),
            'filename'  => ''
            );
    }
    // returning false will let the normal procedure continue
    return false;
}

Après cela, WordPress ne générera plus aucune erreur liée à la vérification de la mise à jour, car ce CODE court-circuite essentiellement la requête HTTP envoyée à api.wordpress.org à l’aide de l’API HTTP WordPress. Si vous devez également court-circuiter d'autres requêtes HTTP internes, modifiez simplement le code ci-dessus pour le faire.

Remarque: N'oubliez pas de désactiver ce CODE lorsque vous téléchargez vos modifications sur le serveur Live. Pour vous assurer que vous n'arrêtez pas accidentellement la vérification de la mise à jour sur le serveur live, il est préférable d'utiliser le CODE ci-dessus dans un plugin personnalisé. De cette façon, vous ne pouvez activer le plug-in que lorsque vous développez dans localhost.

1
Fayaz