- Status
- Gelöst
- Gemeldet für
- WPML Multilingual CMS 3.2.7
- Gelöst in
- 3.3.2
Übersicht über das Problem
Bei der Verwendung der Caching-Implementierung von WPEngine oder anderen benutzerdefinierten Implementierungen kann ein schwerwiegender Fehler wie dieser auftreten:
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
Dies wird dadurch verursacht, dass WPML versucht, Caches nach Gruppen zu leeren.
Bei der Verwendung des von WordPress bereitgestellten Standard-Cachings ist dies kein Problem, da dieses die magische Methode `WP_Object_Cache::__get()` verwendet.
Diese Methode wird jedoch verwendet, um die Eigenschaft `cache` zu lesen, die eigentlich privat ist.
Bei benutzerdefinierten Implementierungen dieser Klasse ist die magische Methode möglicherweise nicht verfügbar, daher der schwerwiegende Fehler.
Problemumgehung
Als vorübergehende Problemumgehung können Sie diese Schritte befolgen (bitte lesen Sie den Hinweis unten):
- Öffnen Sie die Datei unter `wp-content/plugins/wpml-string-translation/inc/package-translation/inc/wpml-package-translation-helper.class.php`
- Suchen Sie nach der Methode `flush_cache` etwa in Zeile 369. Sie sollten diesen Code sehen:
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 ); } } } - Ersetzen Sie diese Zeilen durch:
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(); } }