WordPress как на ладони
wordpress jino

get_option() WP 1.5.0

Получает значение указанной настройки (опции).

Функция получает данные из кэша, если это возможно, если нет, то данные берутся из Базы Данных.

✈ 1 раз = 0.000018с = очень быстро | 50000 раз = 0.17с = очень быстро PHP 7.0.5, WP 4.5.2
Хуки из функции:
Возвращает

Разное/false. Значение опции или false, если указанной опции не существует или не удалось получить её значение

Использование

get_option( $option, $default );
$option(строка) (обязательный)

Название опции, значение которой нужно получить. Некоторые из доступных опций:

  • admin_email - E-mail администратора блога.
  • blogname - название блога. Устанавливается в настройках.
  • blogdescription - описание блога. Устанавливается в настройках.
  • blog_charset - Кодировка блога. Устанавливается в настройках.
  • date_format - формат даты. Устанавливается в настройках.
  • default_category - категория постов по умолчанию. Устанавливается в настройках.
  • home - Адрес домашней страницы блога. Устанавливается в основных настройках.
  • siteurl - Адрес WordPress. Устанавливается в основных настройках.

    Заметка: siteurl отличается от get_bloginfo('siteurl') (который возвращает url домашней страницы блога). И не отличается от get_bloginfo('wpurl').

  • template - название текущей темы.
  • start_of_week - день с которого начинается неделя. Устанавливается в основных настройках.
  • upload_path - каталог загрузки по умолчанию.  Устанавливается в настройках.
  • posts_per_page - максимальное число постов на странице.  Устанавливается в настройках чтения.
  • posts_per_rss -  максимальное число постов выводимых в фид.  Устанавливается в настройках чтения.

    Полный список опций смотрите в кодексе WordPress.

По умолчанию: нет

$default(строка/число/логический)
Значение по умолчанию, которое нужно вернуть, если опции в БД не существует.
По умолчанию: false

Примеры

#1. Выведем название блога в теге H1:

<h1><?php echo get_option('blogname'); ?></h1>

#2. Выведем кодировку блога:

<p>Текущая кодировка: <?php echo get_option('blog_charset'); ?> </p>

#3. Получим email администратора сайта в переменную $admin_email:

$admin_email = get_option('admin_email');

Код get option: wp-includes/option.php WP 4.8.2

<?php
function get_option( $option, $default = false ) {
	global $wpdb;

	$option = trim( $option );
	if ( empty( $option ) )
		return false;

	/**
	 * Filters the value of an existing option before it is retrieved.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * Passing a truthy value to the filter will short-circuit retrieving
	 * the option value, returning the passed value instead.
	 *
	 * @since 1.5.0
	 * @since 4.4.0 The `$option` parameter was added.
	 *
	 * @param bool|mixed $pre_option Value to return instead of the option value.
	 *                               Default false to skip it.
	 * @param string     $option     Option name.
	 */
	$pre = apply_filters( "pre_option_{$option}", false, $option );
	if ( false !== $pre )
		return $pre;

	if ( defined( 'WP_SETUP_CONFIG' ) )
		return false;

	// Distinguish between `false` as a default, and not passing one.
	$passed_default = func_num_args() > 1;

	if ( ! wp_installing() ) {
		// prevent non-existent options from triggering multiple queries
		$notoptions = wp_cache_get( 'notoptions', 'options' );
		if ( isset( $notoptions[ $option ] ) ) {
			/**
			 * Filters the default value for an option.
			 *
			 * The dynamic portion of the hook name, `$option`, refers to the option name.
			 *
			 * @since 3.4.0
			 * @since 4.4.0 The `$option` parameter was added.
			 * @since 4.7.0 The `$passed_default` parameter was added to distinguish between a `false` value and the default parameter value.
			 *
			 * @param mixed  $default The default value to return if the option does not exist
			 *                        in the database.
			 * @param string $option  Option name.
			 * @param bool   $passed_default Was `get_option()` passed a default value?
			 */
			return apply_filters( "default_option_{$option}", $default, $option, $passed_default );
		}

		$alloptions = wp_load_alloptions();

		if ( isset( $alloptions[$option] ) ) {
			$value = $alloptions[$option];
		} else {
			$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
					if ( ! is_array( $notoptions ) ) {
						 $notoptions = array();
					}
					$notoptions[$option] = true;
					wp_cache_set( 'notoptions', $notoptions, 'options' );

					/** This filter is documented in wp-includes/option.php */
					return apply_filters( "default_option_{$option}", $default, $option, $passed_default );
				}
			}
		}
	} else {
		$suppress = $wpdb->suppress_errors();
		$row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );
		$wpdb->suppress_errors( $suppress );
		if ( is_object( $row ) ) {
			$value = $row->option_value;
		} else {
			/** This filter is documented in wp-includes/option.php */
			return apply_filters( "default_option_{$option}", $default, $option, $passed_default );
		}
	}

	// If home is not set use siteurl.
	if ( 'home' == $option && '' == $value )
		return get_option( 'siteurl' );

	if ( in_array( $option, array('siteurl', 'home', 'category_base', 'tag_base') ) )
		$value = untrailingslashit( $value );

	/**
	 * Filters the value of an existing option.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 1.5.0 As 'option_' . $setting
	 * @since 3.0.0
	 * @since 4.4.0 The `$option` parameter was added.
	 *
	 * @param mixed  $value  Value of the option. If stored serialized, it will be
	 *                       unserialized prior to being returned.
	 * @param string $option Option name.
	 */
	return apply_filters( "option_{$option}", maybe_unserialize( $value ), $option );
}

Cвязанные функции

Из раздела: Опции сайта (настройки)

get_option 14 комментариев
Полезные 1 Все
  • art

    мультисайт wordpress

    Подскажи пожалуйста, какая функция выводит наименование сайта/подсайта – те сам суффикс (site1) Например, есть multisite.ru/site1 Нужно вытянуть site1

    В результате я хотел использовать данную функцию в header.php – где для каждого подсайта (site1) в шапке выгружалась картинка (site1.jpg) из папки upload – те картинка с аналогичным названием подсайта

    вывод картики думаю как то так: src="/wp-content/upload/.jpg"

    Ответить6.1 лет назад #
    • Kama4486

      Можно регуляркой:

      $url = 'multisite.ru/asd/site1';
      $site = preg_replace('@.*/(.*?)@', '\1', $url);
      echo $site; // выведет site1
      Ответить6.1 лет назад #
      • art

        Kama - спасибо огромное!!

        <?php
        $url = get_option('home');  
        $site = preg_replace('@.*/(.*?)@', '\1', $url);  
        echo $site;
        ?>
        Ответить6.1 лет назад #
  • Николай @

    А если в option массив?
    $data = array(1,2,3,4);
    В этом случае $opt = get_option('data'); в $opt что получим?

    Ответить5.1 лет назад #
    • Kama4486

      get_option автоматически сериализует массивы. Т.е. в $opt получим массив:

      $data = array(1,2,3,4);
      
      add_option('tmpppp', $data );
      
      $r = get_option( 'tmpppp' );
      
      var_dump( $r );
      
      /*
      array(4) {
        [0]=>
        int(1)
        [1]=>
        int(2)
        [2]=>
        int(3)
        [3]=>
        int(4)
      }
      */
      1
      Ответить5.1 лет назад #
  • Александр

    Привет, Тимур!
    Столкнулся с проблемой вывода массива опции темы. Переносил сайт на другой хостинг, все хорошо, кроме опций темы - они стали по-умолчанию. Вручную вставляю в phpMyAdmin значение строки, отвечающей за опции темы, но после просмотра страницы сайта - значение в бд опять становится по-умолчанию. Полазил по функциям, нашел где вызывается вставка и обновление (insert, update). После $options = get_option('название темы') вывел значение option - там уже опции по-умолчанию. Но ведь get_option берет значение из БД. Тогда почему так. Или берется не из БД, а из кэша?
    Если поможете - буду очень рад! Заранее спасибо.

    Ответить3.1 года назад #
    • Александр

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

      Ответить3.1 года назад #
    • Kama4486

      Изначально берется из БД, один раз, затем берется из кэша буфера. Если есть кэширующий плагин, то берется из кэша, кэш может храниться в файлах, но это все временно. Обнулите кэши кэширующих плагинов. Руками в БД лазить не рекомендую. Меняйте тему в админке.

      Ответить3.1 года назад #
  • Виталий @

    Помогите получить значение опций
    Группирую опции в одну секцию
    При получении значения получаю ошибку: Notice: Undefined index: theme_option_body in W:...\options-theme.php on line 101 в строке 101 input метода theme_body_cb() с выводом echo esc_attr($option['theme_option_body']
    аналогичная ошибка и по методу theme_header_cb()

    В методе theme_body_cb() я проверяю а что у меня в $option

    print_r($option);
    
    //Результат выполнения print_r();
    Array
    (
    	['theme_option_body'] => 123
    	['theme_option_header'] => 321
    )
    echo $option['theme_option_body'];//Notice: Undefined index: theme_option_body ...

    Значит массив у меня есть тогда почему получается Notice: Undefined index: theme_option_body

    В методе theme_body_cb() ради эксперимента создал простой массив

    $array = array("a1"=>"123","a2"=>"321");
    echo $array['a1'];//Получаю 123 а не Notice: Undefined index: a1

    вот мой листинг

    <?php
    add_action( 'admin_init', 'theme_options' );
    
    function theme_options() {
    
    	register_setting(
    			'general', 'theme_options'
    	);
    
    	add_settings_section(
    			"theme_section_id", 
    			"Опции темы", 
    			"theme_option_section_cb", 
    			"general" 
    	);
    
    	add_settings_field(
    			"theme_option_body",
    			"Цвет фона",
    			"theme_body_cb",
    			"general",
    			"theme_section_id"
    	);
    
    	add_settings_field(
    			"theme_option_header",
    			'Цвет header',
    			"theme_header_cb",
    			"general",
    			"theme_section_id"
    	);
    }
    function theme_option_section_cb() {
    
    }
    
    function theme_body_cb() {
    	$option = (get_option('theme_options'));
    
    	print_r($option);
    
    //Результат выполнения print_r();
    Array
    (
    	['theme_option_body'] => 123
    	['theme_option_header'] => 321
    )
    echo $option['theme_option_body'];//Notice: Undefined index: theme_option_body ...
    
    	?>
    
    <input type="text" name="theme_options['theme_option_body']" id="theme_options_body" 
    value="<?php  echo esc_attr($option['theme_option_body']) ?>" class="regular-text">
    
    	<?php
    }
    
    function theme_header_cb() {
    	$option = get_option('theme_options');
    	?>
    	<input type="text" id="theme_option_header" name="theme_options['theme_option_header']" 
    value="<?php  echo esc_attr($option['theme_option_header']) ?>" class="regular-text"/> 
    	<?php
    }
    Ответить2.7 года назад #
    • Виталий @

      Как говорится "а ларчик просто открывался" dash2
      вся беда оказалась в атрибуте

      name="theme_options['theme_option_body']"

      нужно убрать одинарные кавычки из

      ['theme_option_body']

      или обрашаться к индексу

      ['theme_option_body']

      обернув его в двойные кавычки

      echo esc_attr($option["'theme_option_body'"])
      Ответить2.7 года назад #
  • Максим

    Здравствуйте.

    Подскажите, пожалуйста, можно ли убрать из кода?

    Вы вошли, как <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>` запрос `<?php echo get_option('siteurl'); ?>

    И с ним, и без него переход осуществляется по нужному адресу, а если убрать этот запрос, по логике снизится кол-во обращений к БД... Но не до конца представляю, на что подобное действие может повлиять.

    Ответитьгод назад #
    • stepan1187 cайт: www.weblancer.net/users/stepanko/?affili... @

      "запрос `" - запрос нагрузку на БД не делает.
      При таком вызове он берет данные из кеша, потому что некоторые данные из таблицы wp_options при первом обращение кешируются. И последующие вызовы уже идут к кешу, а не к БД.

      1
      Ответитьгод назад #

Здравствуйте, !

Ваш комментарий