WPML
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();
    	}
    }
Hinweis: Diese Funktionalität ist erforderlich, um einen Teil des Caches anstelle des gesamten Caches zu leeren. Wenn Sie diese Problemumgehung verwenden, erfolgt die Leerung global, weshalb die Performance beeinträchtigt werden könnte. Dieser spezielle Code wird jedoch nur ausgeführt, wenn String-Pakete gelöscht oder aktualisiert werden (z. B. mit Layouts oder Gravity Forms).

Alle bekannten Probleme →