É possível desativar o cache de uma opção ao usar o cache total do w3?

4

um plug-in em que estou trabalhando tem um conflito com o cache total do w3. Para ser mais específico, no meu código eu tenho

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

O problema está no self::$_instance = get_option( 'ai1ec_settings' ); porque um objeto incompleto é retornado (isso acontece apenas quando se usa o cache total w3, eu declarei um autoloader, mas fazendo alguma depuração, parece que o objeto incompleto está armazenado no cache)

Esta é a mensagem de erro

  

Ai1ec_Settings :: get_instance (): O script tentou executar um método   ou acessar uma propriedade de um objeto incompleto. Por favor, certifique-se de que   definição de classe "Ai1ec_Settings" do objeto que você está tentando   operar em foi carregado antes unserialize () é chamado ou fornecer um   função __autoload () para carregar a definição de classe

1) Existe uma maneira de informar ao cache total do w3 para não armazenar em cache essa opção?
2) Se não, seria correto lidar com coisas assim?

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();
        }
    }   
}
    
por Nicola Peluchetti 24.04.2012 / 10:50

2 respostas

2

tudo bem, aqui vamos nós. tente isto: no seu functions.php modifique o comportamento do ai1ec_options:

$ai1ec_options = get_option('ai1ec_options');
delete_option('ai1ec_options');
add_option('ai1ec_options', $ai1ec_options, '', 'no'); // thanks for your suggestion :)

tenha cuidado, pois você pode perder suas opções de configuração, portanto, certifique-se de obtê-las primeiro do banco de dados. ou crie uma opção de backup. depois, limpe os caches e tente novamente.

    
por fischi 04.05.2012 / 11:42
0

Eu estava apenas lutando com isso na page.ly, que usa o W3TC e, em seguida, o Memcached para o cache de objetos.

Procurando como o ai1ec tem resolvido a solução parece ser:

wp_cache_delete( 'alloptions', 'options' );

Isso foi confirmado por page.ly encontrado no ticket de suporte no qual eu estava discutindo o assunto.

    
por lkraav 06.04.2013 / 22:59