web-dev-qa-db-fra.com

Est-il possible de désactiver la mise en cache d'une option lors de l'utilisation du cache total w3?

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

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.

2
fischi

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.

0
lkraav