函数文档

add_option()

💡 云策文档标注

概述

add_option() 函数用于向 WordPress 数据库中添加一个新选项。它自动处理值的序列化,并检查选项是否已存在或受保护,确保数据安全插入。

关键要点

  • 函数用于添加新选项,不会更新已存在的选项。
  • 参数包括选项名(必填)、值(可选,非标量需可序列化)、已弃用的参数和 autoload 设置。
  • autoload 参数控制选项是否在 WordPress 启动时加载,默认 null 由 WordPress 决定,'yes' 和 'no' 已弃用。
  • 函数返回布尔值,成功添加返回 true,否则返回 false。
  • 内部使用 Hook 如 add_option 和 added_option 来触发动作,并包含缓存机制优化性能。

代码示例

// 基本用法:添加一个选项
add_option( 'my_option_name', 'my_value' );

// 设置 autoload 为 true,以便在每次页面请求时自动加载
add_option( 'frequently_used_option', 'some_value', '', true );

// 添加一个数组选项,值会自动序列化
add_option( 'my_array_option', array( 'key' => 'value' ) );

注意事项

  • 选项名应避免与受保护的 WordPress 选项重复,否则添加会失败。
  • 资源类型不能作为选项值添加,因为它们无法序列化。
  • autoload 设置过多选项可能导致性能问题,建议仅对频繁访问的选项启用。
  • 函数内部处理了已弃用选项键的重定向,如 'blacklist_keys' 到 'disallowed_keys'。

📄 原文内容

Adds a new option.

Description

You do not need to serialize values. If the value needs to be serialized, then it will be serialized before it is inserted into the database.
Remember, resources cannot be serialized or added as an option.

You can create options without values and then update the values later.
Existing options will not be updated and checks are performed to ensure that you aren’t adding a protected WordPress option. Care should be taken to not name options the same as the ones which are protected.

Parameters

$optionstringrequired
Name of the option to add. Expected to not be SQL-escaped.
$valuemixedoptional
Option value. Must be serializable if non-scalar.
Expected to not be SQL-escaped.
$deprecatedstringoptional
Description. Not used anymore.
$autoloadbool|nulloptional
Whether to load the option when WordPress starts up.
Accepts a boolean, or null to leave the decision up to default heuristics in WordPress. For backward compatibility 'yes' and 'no' are also accepted, though using these values is deprecated.
Autoloading too many options can lead to performance problems, especially if the options are not frequently used. For options which are accessed across several places in the frontend, it is recommended to autoload them, by using true.
For options which are accessed only on few specific URLs, it is recommended to not autoload them, by using false.
Default is null, which means WordPress will determine the autoload value.

Default:null

Return

bool True if the option was added, false otherwise.

Source

function add_option( $option, $value = '', $deprecated = '', $autoload = null ) {
	global $wpdb;

	if ( ! empty( $deprecated ) ) {
		_deprecated_argument( __FUNCTION__, '2.3.0' );
	}

	if ( is_scalar( $option ) ) {
		$option = trim( $option );
	}

	if ( empty( $option ) ) {
		return false;
	}

	/*
	 * Until a proper _deprecated_option() function can be introduced,
	 * redirect requests to deprecated keys to the new, correct ones.
	 */
	$deprecated_keys = array(
		'blacklist_keys'    => 'disallowed_keys',
		'comment_whitelist' => 'comment_previously_approved',
	);

	if ( isset( $deprecated_keys[ $option ] ) && ! wp_installing() ) {
		_deprecated_argument(
			__FUNCTION__,
			'5.5.0',
			sprintf(
				/* translators: 1: Deprecated option key, 2: New option key. */
				__( 'The "%1$s" option key has been renamed to "%2$s".' ),
				$option,
				$deprecated_keys[ $option ]
			)
		);
		return add_option( $deprecated_keys[ $option ], $value, $deprecated, $autoload );
	}

	wp_protect_special_option( $option );

	if ( is_object( $value ) ) {
		$value = clone $value;
	}

	$value = sanitize_option( $option, $value );

	/*
	 * Make sure the option doesn't already exist.
	 * We can check the 'notoptions' cache before we ask for a DB query.
	 */
	$notoptions = wp_cache_get( 'notoptions', 'options' );

	if ( ! is_array( $notoptions ) || ! isset( $notoptions[ $option ] ) ) {
		/** This filter is documented in wp-includes/option.php */
		if ( apply_filters( "default_option_{$option}", false, $option, false ) !== get_option( $option ) ) {
			return false;
		}
	}

	$serialized_value = maybe_serialize( $value );

	$autoload = wp_determine_option_autoload_value( $option, $value, $serialized_value, $autoload );

	/**
	 * Fires before an option is added.
	 *
	 * @since 2.9.0
	 *
	 * @param string $option Name of the option to add.
	 * @param mixed  $value  Value of the option.
	 */
	do_action( 'add_option', $option, $value );

	$result = $wpdb->query( $wpdb->prepare( "INSERT INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)", $option, $serialized_value, $autoload ) );
	if ( ! $result ) {
		return false;
	}

	if ( ! wp_installing() ) {
		if ( in_array( $autoload, wp_autoload_values_to_autoload(), true ) ) {
			$alloptions            = wp_load_alloptions( true );
			$alloptions[ $option ] = $serialized_value;
			wp_cache_set( 'alloptions', $alloptions, 'options' );
		} else {
			wp_cache_set( $option, $serialized_value, 'options' );
		}
	}

	// This option exists now.
	$notoptions = wp_cache_get( 'notoptions', 'options' ); // Yes, again... we need it to be fresh.

	if ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) {
		unset( $notoptions[ $option ] );
		wp_cache_set( 'notoptions', $notoptions, 'options' );
	}

	/**
	 * Fires after a specific option has been added.
	 *
	 * The dynamic portion of the hook name, `$option`, refers to the option name.
	 *
	 * @since 2.5.0 As `add_option_{$name}`
	 * @since 3.0.0
	 *
	 * @param string $option Name of the option to add.
	 * @param mixed  $value  Value of the option.
	 */
	do_action( "add_option_{$option}", $option, $value );

	/**
	 * Fires after an option has been added.
	 *
	 * @since 2.9.0
	 *
	 * @param string $option Name of the added option.
	 * @param mixed  $value  Value of the option.
	 */
	do_action( 'added_option', $option, $value );

	return true;
}

Hooks

do_action( ‘added_option’, string $option, mixed $value )

Fires after an option has been added.

do_action( ‘add_option’, string $option, mixed $value )

Fires before an option is added.

do_action( “add_option_{$option}”, string $option, mixed $value )

Fires after a specific option has been added.

apply_filters( “default_option_{$option}”, mixed $default_value, string $option, bool $passed_default )

Filters the default value for an option.

Changelog

Version Description
6.7.0 The autoload values 'yes' and 'no' are deprecated.
6.6.0 The $autoload parameter’s default value was changed to null.
1.0.0 Introduced.

User Contributed Notes

  1. Skip to note 3 content

    The `autoload` option means that WordPress will automatically fetch this option and its value on every page request.

    If your code relies on the option value on every, or close to every, page request, setting this value to `yes` will save a database query from being triggered when you request the option.

    Take note that the value of your option entry will add to the overall memory consumed by the website, so keep this in mind when autoloading large datasets.