Функция кеширования get_option?

В моем плагине я использую следующий код для извлечения опции из базы данных:

$options = get_option('my_plugin_options'); 

Если я использую это 10 раз в различных функциях моего плагина, делает ли WordPress 10 запросов к базе данных или делает только один запрос на базу данных по HTTP-запросу и кэширует результаты?

Solutions Collecting From Web of "Функция кеширования get_option?"

В случае сомнений посмотрите исходный код.

get_option() в get_option() , вы увидите (сокращенно):

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

Во-первых, WordPress проверяет, есть ли у него опция в памяти. По умолчанию wp_cache_get() будет извлекать значения из хранилища данных в памяти (обычно это просто переменная PHP). Но в некоторых установках используется более продвинутый кеш объектов, который хранит данные в другом месте.

В любом случае wp_cache_get() вернет вам значение параметра, если WordPress уже это знает.

Если нет, то WordPress попытается извлечь его из базы данных. Если опция существует в БД, то WordPress будет кэшировать ее в памяти, а затем дать ей обратно – сделать последующий поиск быстрее.

Если этот параметр не существует в базе данных, WordPress помещает его во внутренний массив «эти параметры не существует», поэтому он не пытается искать его позже и возвращает значение по умолчанию.

Итак, чтобы ответить на ваш первоначальный вопрос:

Если я использую это 10 раз в различных функциях моего плагина, делает ли WordPress 10 запросов к базе данных или делает только один запрос на базу данных по HTTP-запросу и кэширует результаты?

WordPress будет делать 1 запрос базы данных по HTTP-запросу и кэшировать результаты.

Да, он кэшируется. Посмотрите на источник функции. Он вызывает wp_load_alloptions() в фоновом режиме, чтобы получить все параметры, и эта функция добавляет результат в кеш:

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

Если вы посмотрите на класс WP_Object_Cache в wp-includes/cache.php , вы увидите, что каждый плагин может вызывать открытый метод flush() .

В этом случае значение параметра больше не кэшируется, а get_option() запускает новый поиск базы данных. Плагины не должны этого делать, но чтобы убедиться, что вы не затронуты, не вызывайте кеш напрямую, всегда используйте только get_option() .