La fonction get_option est-elle mise en cache?

13

Dans mon plugin, j'utilise le code suivant pour récupérer une option de la base de données:

$options = get_option('my_plugin_options');

Si j'utilise ceci 10 fois dans diverses fonctions de mon plugin, WordPress effectue-t-il 10 requêtes vers la base de données, ou ne fait-il qu'un seul appel à la base de données par requête HTTP et met-il en cache les résultats?

Ben Miller - Rétablir Monica
la source

Réponses:

25

En cas de doute, regardez le code source.

En creusant get_option(), vous verrez (en abrégé):

 $value = wp_cache_get( $option, 'options' );

if ( false === $value ) {
    $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );

    // Has to be get_row instead of get_var because of funkiness with 0, false, null values
    if ( is_object( $row ) ) {
        $value = $row->option_value;
        wp_cache_add( $option, $value, 'options' );
    } else { // option does not exist, so we must cache its non-existence
        $notoptions[$option] = true;
        wp_cache_set( 'notoptions', $notoptions, 'options' );
        return apply_filters( 'default_option_' . $option, $default );
    }
}

Tout d'abord, WordPress vérifie s'il a déjà l'option en mémoire. Par défaut, wp_cache_get()récupérera les valeurs d'un magasin de données en mémoire (généralement juste une variable PHP). Mais certaines installations utilisent un cache d'objets plus avancé qui stocke les données ailleurs.

Dans les deux cas, wp_cache_get()retournera la valeur de votre option si WordPress le sait déjà.

Sinon, WordPress essaiera de le récupérer dans la base de données. Si l'option existe dans la base de données, WordPress la mettra en cache dans la mémoire, puis la restituera, ce qui accélérera les recherches ultérieures.

Si l'option n'existe pas dans la base de données, WordPress la marque dans un tableau interne "ces options n'existent pas" afin de ne pas essayer de la rechercher plus tard et de renvoyer une valeur par défaut à la place.

Donc, pour répondre à votre question initiale:

Si j'utilise ceci 10 fois dans diverses fonctions de mon plugin, WordPress effectue-t-il 10 requêtes vers la base de données, ou ne fait-il qu'un seul appel à la base de données par requête HTTP et met-il en cache les résultats?

WordPress fera 1 appel à la base de données par requête HTTP et mettra en cache les résultats.

EAMann
la source
2

Oui, il est mis en cache. Regardez la source de la fonction. Il appelle wp_load_alloptions()en arrière-plan, pour récupérer toutes les options, et cette fonction ajoute le résultat au cache:

wp_cache_add( 'alloptions', $alloptions, 'options' );

Si vous regardez la classe WP_Object_Cachedans wp-includes/cache.php, vous verrez, il est possible pour chaque plugin d'appeler la méthode publique flush().

Dans ce cas, la valeur de l'option n'est plus mise en cache et get_option()déclenchera une nouvelle recherche de base de données. Les plugins ne devraient pas faire cela, mais pour être sûr que vous n'êtes pas affecté, n'appelez pas le cache directement, utilisez toujours juste get_option().

fuxia
la source
De plus, les options qui ne sont pas chargées automatiquement seront mises en cache après la première recherche. Voir ma réponse pour une description complète.
EAMann
@EAMann Correct, je l'ai édité.
fuxia