函数文档

delete_expired_transients()

💡 云策文档标注

概述

delete_expired_transients() 函数用于删除所有已过期的瞬态数据。当使用外部对象缓存时,默认不会执行数据库操作,除非通过参数强制。

关键要点

  • 函数删除所有已过期的瞬态数据,包括普通瞬态和站点瞬态。
  • 如果启用了外部对象缓存,函数默认不执行任何操作,除非设置 $force_db 参数为 true。
  • 使用多表删除语法从 options 表或 sitemeta 表中删除瞬态记录和对应的超时记录。
  • 处理逻辑根据是否为多站点环境以及是否为主站点/主网络而有所不同。

代码示例

function delete_expired_transients( $force_db = false ) {
    global $wpdb;

    if ( ! $force_db && wp_using_ext_object_cache() ) {
        return;
    }

    $wpdb->query(
        $wpdb->prepare(
            "DELETE a, b FROM {$wpdb->options} a, {$wpdb->options} b
            WHERE a.option_name LIKE %s
            AND a.option_name NOT LIKE %s
            AND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) )
            AND b.option_value < %d",
            $wpdb->esc_like( '_transient_' ) . '%',
            $wpdb->esc_like( '_transient_timeout_' ) . '%',
            time()
        )
    );

    if ( ! is_multisite() ) {
        // 单站点在 options 表中存储站点瞬态
        $wpdb->query(
            $wpdb->prepare(
                "DELETE a, b FROM {$wpdb->options} a, {$wpdb->options} b
                WHERE a.option_name LIKE %s
                AND a.option_name NOT LIKE %s
                AND b.option_name = CONCAT( '_site_transient_timeout_', SUBSTRING( a.option_name, 17 ) )
                AND b.option_value < %d",
                $wpdb->esc_like( '_site_transient_' ) . '%',
                $wpdb->esc_like( '_site_transient_timeout_' ) . '%',
                time()
            )
        );
    } elseif ( is_main_site() && is_main_network() ) {
        // 多站点在 sitemeta 表中存储站点瞬态
        $wpdb->query(
            $wpdb->prepare(
                "DELETE a, b FROM {$wpdb->sitemeta} a, {$wpdb->sitemeta} b
                WHERE a.meta_key LIKE %s
                AND a.meta_key NOT LIKE %s
                AND b.meta_key = CONCAT( '_site_transient_timeout_', SUBSTRING( a.meta_key, 17 ) )
                AND b.meta_value < %d",
                $wpdb->esc_like( '_site_transient_' ) . '%',
                $wpdb->esc_like( '_site_transient_timeout_' ) . '%',
                time()
            )
        );
    }
}

注意事项

  • 函数在 WordPress 4.9.0 版本中引入。
  • 相关函数包括 wpdb::esc_like()、wp_using_ext_object_cache()、is_main_site()、is_main_network()、wpdb::query()、is_multisite() 和 wpdb::prepare()。
  • 被 populate_options() 和 upgrade_network() 等函数使用。

📄 原文内容

Deletes all expired transients.

Description

Note that this function won’t do anything if an external object cache is in use.

The multi-table delete syntax is used to delete the transient record from table a, and the corresponding transient_timeout record from table b.

Parameters

$force_dbbooloptional
Force cleanup to run against the database even when an external object cache is used.

Default:false

Source

function delete_expired_transients( $force_db = false ) {
	global $wpdb;

	if ( ! $force_db && wp_using_ext_object_cache() ) {
		return;
	}

	$wpdb->query(
		$wpdb->prepare(
			"DELETE a, b FROM {$wpdb->options} a, {$wpdb->options} b
			WHERE a.option_name LIKE %s
			AND a.option_name NOT LIKE %s
			AND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) )
			AND b.option_value < %d",
			$wpdb->esc_like( '_transient_' ) . '%',
			$wpdb->esc_like( '_transient_timeout_' ) . '%',
			time()
		)
	);

	if ( ! is_multisite() ) {
		// Single site stores site transients in the options table.
		$wpdb->query(
			$wpdb->prepare(
				"DELETE a, b FROM {$wpdb->options} a, {$wpdb->options} b
				WHERE a.option_name LIKE %s
				AND a.option_name NOT LIKE %s
				AND b.option_name = CONCAT( '_site_transient_timeout_', SUBSTRING( a.option_name, 17 ) )
				AND b.option_value < %d",
				$wpdb->esc_like( '_site_transient_' ) . '%',
				$wpdb->esc_like( '_site_transient_timeout_' ) . '%',
				time()
			)
		);
	} elseif ( is_main_site() && is_main_network() ) {
		// Multisite stores site transients in the sitemeta table.
		$wpdb->query(
			$wpdb->prepare(
				"DELETE a, b FROM {$wpdb->sitemeta} a, {$wpdb->sitemeta} b
				WHERE a.meta_key LIKE %s
				AND a.meta_key NOT LIKE %s
				AND b.meta_key = CONCAT( '_site_transient_timeout_', SUBSTRING( a.meta_key, 17 ) )
				AND b.meta_value < %d",
				$wpdb->esc_like( '_site_transient_' ) . '%',
				$wpdb->esc_like( '_site_transient_timeout_' ) . '%',
				time()
			)
		);
	}
}

Changelog

Version Description
4.9.0 Introduced.