From 899fb2f7f6435f3e471f2d660b5f7ca4579bd47a Mon Sep 17 00:00:00 2001 From: Dion Hulse Date: Sat, 21 Oct 2017 13:21:24 +0000 Subject: [PATCH] Transients: Clear expired transients from the database in a daily cron task. Fixes #41699 git-svn-id: https://develop.svn.wordpress.org/trunk@41963 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/schema.php | 23 ++---------- src/wp-admin/includes/upgrade.php | 17 ++------- src/wp-includes/default-filters.php | 11 +++--- src/wp-includes/option.php | 55 +++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 40 deletions(-) diff --git a/src/wp-admin/includes/schema.php b/src/wp-admin/includes/schema.php index c9cee07527..374e9d465c 100644 --- a/src/wp-admin/includes/schema.php +++ b/src/wp-admin/includes/schema.php @@ -584,27 +584,8 @@ function populate_options() { // Delete obsolete magpie stuff. $wpdb->query("DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f]{32}(_ts)?$'"); - /* - * Deletes all expired transients. The multi-table delete syntax is used - * to delete the transient record from table a, and the corresponding - * transient_timeout record from table b. - */ - $time = time(); - $sql = "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->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_transient_' ) . '%', $wpdb->esc_like( '_transient_timeout_' ) . '%', $time ) ); - - if ( is_main_site() && is_main_network() ) { - $sql = "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->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_site_transient_' ) . '%', $wpdb->esc_like( '_site_transient_timeout_' ) . '%', $time ) ); - } + // Clear expired transients + delete_expired_transients( true ); } /** diff --git a/src/wp-admin/includes/upgrade.php b/src/wp-admin/includes/upgrade.php index f439bcf6da..d393052b33 100644 --- a/src/wp-admin/includes/upgrade.php +++ b/src/wp-admin/includes/upgrade.php @@ -1746,21 +1746,8 @@ function upgrade_460() { function upgrade_network() { global $wp_current_db_version, $wpdb; - // Always. - if ( is_main_network() ) { - /* - * Deletes all expired transients. The multi-table delete syntax is used - * to delete the transient record from table a, and the corresponding - * transient_timeout record from table b. - */ - $time = time(); - $sql = "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->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_site_transient_' ) . '%', $wpdb->esc_like ( '_site_transient_timeout_' ) . '%', $time ) ); - } + // Always clear expired transients + delete_expired_transients( true ); // 2.8. if ( $wp_current_db_version < 11549 ) { diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index 44df59f667..f615444ab0 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -317,14 +317,17 @@ add_action( 'publish_post', '_publish_post_hook', add_action( 'transition_post_status', '_transition_post_status', 5, 3 ); add_action( 'transition_post_status', '_update_term_count_on_transition_post_status', 10, 3 ); add_action( 'comment_form', 'wp_comment_form_unfiltered_html_nonce' ); -add_action( 'wp_scheduled_delete', 'wp_scheduled_delete' ); -add_action( 'wp_scheduled_auto_draft_delete', 'wp_delete_auto_drafts' ); add_action( 'admin_init', 'send_frame_options_header', 10, 0 ); -add_action( 'importer_scheduled_cleanup', 'wp_delete_attachment' ); -add_action( 'upgrader_scheduled_cleanup', 'wp_delete_attachment' ); add_action( 'try_gutenberg_panel', 'wp_try_gutenberg_panel' ); add_action( 'welcome_panel', 'wp_welcome_panel' ); +// Cron tasks +add_action( 'wp_scheduled_delete', 'wp_scheduled_delete' ); +add_action( 'wp_scheduled_auto_draft_delete', 'wp_delete_auto_drafts' ); +add_action( 'importer_scheduled_cleanup', 'wp_delete_attachment' ); +add_action( 'upgrader_scheduled_cleanup', 'wp_delete_attachment' ); +add_action( 'delete_expired_transients', 'delete_expired_transients' ); + // Navigation menu actions add_action( 'delete_post', '_wp_delete_post_menu_item' ); add_action( 'delete_term', '_wp_delete_tax_menu_item', 10, 3 ); diff --git a/src/wp-includes/option.php b/src/wp-includes/option.php index 5b450515a4..fb115d30b2 100644 --- a/src/wp-includes/option.php +++ b/src/wp-includes/option.php @@ -816,6 +816,61 @@ function set_transient( $transient, $value, $expiration = 0 ) { return $result; } +/** + * Deletes all expired transients. + * + * The multi-table delete syntax is used to delete the transient record + * from table a, and the corresponding transient_timeout record from table b. + + * + * @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 + 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() ) { + // non-Multisite 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_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 + 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() + ) ); + } +} + /** * Saves and restores user interface settings stored in a cookie. *