un plugin sur lequel je travaille a un conflit avec le cache total w3. Pour être plus précis, dans mon code j'ai
static function get_instance()
{
if( self::$_instance === NULL ) {
// get the settings from the database
self::$_instance = get_option( 'ai1ec_settings' );
// if there are no settings in the database
// save default values for the settings
if( ! self::$_instance ) {
self::$_instance = new self();
delete_option( 'ai1ec_settings' );
add_option( 'ai1ec_settings', self::$_instance );
} else {
self::$_instance->set_defaults(); // set default settings
}
}
return self::$_instance;
}
Le problème réside dans self::$_instance = get_option( 'ai1ec_settings' );
car un objet incomplet est renvoyé (cela ne se produit que lorsque vous utilisez le cache total w3, j'ai déclaré un autochargeur, mais en procédant à un débogage, il semble que l'objet incomplet soit stocké dans le cache).
C'est le message d'erreur
Ai1ec_Settings :: get_instance (): Le script a essayé d'exécuter une méthode ou d'accéder à une propriété d'un objet incomplet. Assurez-vous que la définition de classe "Ai1ec_Settings" de l'objet que vous essayez d'opérer a été chargée avant l'appel de unserialize () ou fournissez une fonction __autoload () pour charger la définition de classe.
1) Y a-t-il un moyen de dire à w3 total cache de ne pas mettre cette option en cache?
2) Dans le cas contraire, serait-il correct de gérer de telles choses?
try {
self::$_instance = self::getOptionsFromDb();
} catch (Exception $e) {
//Show a friendly error page
}
private static function getOptionsFromDb(){
$ai1ec_settings = get_option( 'ai1ec_settings' );
if ( ! $ai1ec_settings instanceof self ) {
if (false === $ai1ec_settings) {
return false; //option was not set in the db
} elseif( class_exists('W3_Plugin_TotalCacheAdmin') ){
//let's clear thew cache and try again
$plugin_totalcacheadmin = & w3_instance('W3_Plugin_TotalCacheAdmin');
$plugin_totalcacheadmin->flush_all();
$ai1ec_settings = get_option( 'ai1ec_settings' );
if ( $ai1ec_settings instanceof self ) {
return $ai1ec_settings;
} else {
throw new Exception();
}
} else {
throw new Exception();
}
}
}
ok, on y va. essayez ceci: dans votre functions.php, modifiez le comportement de ai1ec_options:
$ai1ec_options = get_option('ai1ec_options');
delete_option('ai1ec_options');
add_option('ai1ec_options', $ai1ec_options, '', 'no'); // thanks for your suggestion :)
soyez prudent cependant, car vous risquez de perdre vos options définies, assurez-vous de les obtenir d'abord dans la base de données. ou créer une option de sauvegarde. ensuite, effacez les caches et réessayez.
Je luttais juste avec ceci sur page.ly, qui utilise W3TC, puis Memcached pour leur cache d’objets.
En regardant comment ai1ec a résolu le problème , la solution semble être la suivante:
wp_cache_delete( 'alloptions', 'options' );
Ceci a été confirmé par page.ly dans le ticket d’assistance dans lequel je discutais de la question.