WPML
Statut
Résolu
Signalé pour
WPML Multilingual CMS 3.2.7
Résolu dans
3.3.2

Aperçu de l’anomalie

Lors de l’utilisation de l’implémentation de mise en cache de WPEngine ou d’autres implémentations personnalisées, une erreur fatale de ce type peut apparaître :

PHP Fatal error: Call to undefined method WP_Object_Cache::__get() in /nas/wp/www/cluster-40022/spms/wp-content/plugins/wpml-string-translation/inc/package-translation/inc/wpml-package-translation-helper.class.php on line 384

Cela est dû au fait que WPML tente de vider les caches par groupe.

Lors de l’utilisation de la mise en cache standard fournie par WordPress, cela ne pose pas de problème, car elle utilise la méthode magique `WP_Object_Cache::__get()`.

Cependant, cette méthode est utilisée pour lire la propriété `cache`, qui est en fait privée.

Les implémentations personnalisées de cette classe peuvent ne pas disposer de la méthode magique, d’où l’erreur fatale.

Solution de contournement

En guise de solution de contournement temporaire, vous pouvez suivre ces étapes (veuillez lire la note ci-dessous) :


  • Ouvrez le fichier `wp-content/plugins/wpml-string-translation/inc/package-translation/inc/wpml-package-translation-helper.class.php`

  • Recherchez la méthode `flush_cache` vers la ligne 369. Vous devriez voir ce code :
    final private function flush_cache() {
    	/** @var WP_Object_Cache $wp_object_cache */
    	global $wp_object_cache;
    	$cache = $wp_object_cache->__get( 'cache' );
    	if ( isset( $cache[ $this->cache_group ] ) ) {
    		foreach ( $cache[ $this->cache_group ] as $cache_key => $data ) {
    			wp_cache_delete( $cache_key, $this->cache_group );
    		}
    	}
    }

  • Remplacez ces lignes par :
    final private function flush_cache() {
    	/** @var WP_Object_Cache $wp_object_cache */
    	global $wp_object_cache;
    	$has_cache_property = method_exists( $wp_object_cache, '__get' );
    	if ( ! $has_cache_property && property_exists( $wp_object_cache, 'cache' ) ) {
    		$reflector          = new ReflectionClass( get_class( $wp_object_cache ) );
    		$cache_property     = $reflector->getProperty( 'cache' );
    		$has_cache_property = $cache_property->isPublic();
    	}
    	if ( $has_cache_property ) {
    		$cache = $wp_object_cache->cache;
    		if ( isset( $cache[ $this->cache_group ] ) ) {
    			foreach ( $cache[ $this->cache_group ] as $cache_key => $data ) {
    				wp_cache_delete( $cache_key, $this->cache_group );
    			}
    		}
    	} else {
    		wp_cache_flush();
    	}
    }
Remarque : Cette fonctionnalité est requise pour vider une partie du cache, plutôt que l’intégralité du cache. En utilisant cette solution de contournement, le vidage se fera de manière globale, ce qui pourrait affecter les performances. Cependant, ce code particulier n’est exécuté que lors de la suppression ou de la mise à jour de paquets de chaînes (par exemple avec Layouts ou Gravity Forms).

Toutes les anomalies connues →