- 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(); } }