Make WordPress Core

Opened 4 weeks ago

Closed 3 weeks ago

#62845 closed defect (bug) (duplicate)

Deprecated: str_replace() - Passing null as $subject in PHP 8.x

Reported by: madum's profile madum Owned by:
Milestone: Priority: normal
Severity: normal Version:
Component: General Keywords: dev-feedback
Focuses: administration, template, php-compatibility Cc:

Description (last modified by sabernhardt)

Résumé du problème
Lors de l'utilisation de PHP 8.2, une alerte "Deprecated" apparaît dans le fichier wp-includes/functions.php, à plusieurs endroits.

L'alerte se produit parce que la fonction str_replace() reçoit une valeur null pour le paramètre $subject. Dans PHP 8.2, passer null à un paramètre attendu comme array|string génère une alerte de dépréciation.

Étapes pour reproduire

  1. Installer WordPress sur un environnement local ou un serveur exécutant PHP 8.2.
  2. Activer le mode débogage dans wp-config.php :
      define('WP_DEBUG', true);
      define('WP_DEBUG_DISPLAY', true);
    
  3. Naviguer vers une page d'administration ou effectuer une action utilisant wp-includes/functions.php.
  4. Observer le message d'erreur "Deprecated" dans les logs ou dans la sortie HTML.

Message d'erreur exact

Deprecated: str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in wp-includes/functions.php on line 2189

Deprecated: str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in wp-includes/functions.php on line 1234 (exemple pour un deuxième cas similaire)

Corrections apportées
Pour chaque occurrence de str_replace() recevant une variable qui pourrait être null, il est nécessaire de vérifier et d'initialiser la variable avant de l'utiliser.

Correction pour la ligne 2189 :
Bloc original :
$haystack = str_replace( $needle, $replace, $haystack );

Bloc corrigé avec numéros de ligne (2185-2191) :

2185: if ( ! is_array( $haystack ) && ! is_string( $haystack ) ) {
2186:     return $haystack;
2187: }
2188: 
2189: if ( null === $haystack ) {
2190:     $haystack = ''; // Ou [] si nécessaire
2191: }
$haystack = str_replace( $needle, $replace, $haystack );

Correction pour la ligne 1234 (autre occurrence) :
Bloc original :
$result = str_replace( $search, $replace, $subject );

Bloc corrigé avec numéros de ligne (1230-1235) :

1230: if ( null === $subject ) {
1231:     $subject = ''; // Initialiser avec une chaîne vide
1232: }
1233: 
1234: $result = str_replace( $search, $replace, $subject );

Impact
Ces corrections garantissent la compatibilité avec PHP 8.2 en évitant les alertes "Deprecated". Elles ne modifient pas le comportement attendu des fonctions et améliorent la robustesse du code.

Recommandation
Pour résoudre ce problème de manière définitive :

  1. Appliquer le correctif dans les versions futures de WordPress.
  2. Identifier et corriger toutes les occurrences similaires dans le code source de WordPress.
  3. Ajouter des tests automatisés pour détecter les valeurs null passées à des fonctions incompatibles avec PHP 8.2.

Attachments (1)

functions.php (276.8 KB) - added by madum 4 weeks ago.
file corrected

Download all attachments as: .zip

Change History (4)

@madum
4 weeks ago

file corrected

#1 @sabernhardt
4 weeks ago

  • Description modified (diff)
  • Version 6.7.1 deleted

Related: #57580, #57581

#2 @knutsp
4 weeks ago

Since it is documented that $path must be a string, it's wrong to just silence out such error from the caller. Either the function should emit an error, throw exception itself, or let str_replace handle it.

If some code calls a function with incorrect parameters, an error must be expected. If not serious errors may happen somewhere without being noticed.

To avoid the error message, fix the code calling it with bad parameters.

#3 @sabernhardt
3 weeks ago

  • Milestone Awaiting Review deleted
  • Resolution set to duplicate
  • Severity changed from major to normal
  • Status changed from new to closed

I'll close this ticket as a duplicate, and #57581 seems to be more appropriate for the general idea of checking types in these functions.

Note: See TracTickets for help on using tickets.