¿Es posible deshabilitar el almacenamiento en caché de una opción cuando se usa w3 total cache?

4

un complemento en el que estoy trabajando tiene un conflicto con w3 total cache. Para ser más específicos, en mi código tengo

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

El problema radica en self::$_instance = get_option( 'ai1ec_settings' ); porque se devuelve un objeto incompleto (esto ocurre solo cuando se usa el caché total de w3, he declarado un autoloader, pero al realizar una depuración parece que el objeto incompleto se almacena en el caché)

Este es el mensaje de error

  

Ai1ec_Settings :: get_instance (): la secuencia de comandos intentó ejecutar un método   o acceder a una propiedad de un objeto incompleto. Por favor, asegúrese de que el   definición de clase "Ai1ec_Settings" del objeto que está intentando   la operación se cargó antes de que se llame unserialize () o proporcione un   Función __autoload () para cargar la definición de clase

1) ¿Hay una manera de decirle a w3 total cache que no almacene esa opción?
2) Si no, ¿sería correcto manejar cosas como esta?

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

2 respuestas

2

bien, aquí vamos. prueba esto: en tus funciones.php modifica el comportamiento de ai1ec_options:

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

tenga cuidado, ya que podría perder sus opciones de configuración, así que asegúrese de obtenerlas primero de la base de datos. o crear una opción de copia de seguridad. después, borre los cachés e inténtelo de nuevo.

    
respondido por el fischi 04.05.2012 - 11:42
0

Estaba luchando con esto en page.ly, quien usa W3TC y luego Memcached para su caché de objetos.

Mirando cómo ha tenido ai1ec resuelto la solución parece ser:

wp_cache_delete( 'alloptions', 'options' );

Esto fue confirmado por page.ly que se encuentra en el ticket de soporte en el que estaba discutiendo el problema.

    
respondido por el lkraav 06.04.2013 - 22:59

Lea otras preguntas en las etiquetas