WordPress Version: 6.2
/**
* Deletes all expired transients.
*
* 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.
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @since 4.9.0
*
* @param bool $force_db Optional. Force cleanup to run against the database even when an external object cache is used.
*/
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\n\t\t\tWHERE a.option_name LIKE %s\n\t\t\tAND a.option_name NOT LIKE %s\n\t\t\tAND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) )\n\t\t\tAND 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\n\t\t\t\tWHERE a.option_name LIKE %s\n\t\t\t\tAND a.option_name NOT LIKE %s\n\t\t\t\tAND b.option_name = CONCAT( '_site_transient_timeout_', SUBSTRING( a.option_name, 17 ) )\n\t\t\t\tAND b.option_value < %d", $wpdb->esc_like('_site_transient_') . '%', $wpdb->esc_like('_site_transient_timeout_') . '%', time()));
} elseif (is_multisite() && 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\n\t\t\t\tWHERE a.meta_key LIKE %s\n\t\t\t\tAND a.meta_key NOT LIKE %s\n\t\t\t\tAND b.meta_key = CONCAT( '_site_transient_timeout_', SUBSTRING( a.meta_key, 17 ) )\n\t\t\t\tAND b.meta_value < %d", $wpdb->esc_like('_site_transient_') . '%', $wpdb->esc_like('_site_transient_timeout_') . '%', time()));
}
}