Hi @sylvsteph,
Transients should be periodically deleted from the database after they expire. If you want, however, you can always use a plugin like this one to clear out the expired ones manually.
Hi Jen,
It seems they’re deleted only once a day after my database have double size. I use wp-optimize.
Is it possible to clean them 4 or 5 times a day with a cron task (my host provider gives me a cron function in the workflow, I don’t know how to use it)?
Hi @sylvsteph,
Is it possible to clean them 4 or 5 times a day with a cron task (my host provider gives me a cron function in the workflow, I don’t know how to use it)?
That sounds like a good option to try out. I’m not very much familiar with that cron function, so I’d suggest reaching out to your host again to know how to use the script.
Alternatively, you can ask for more support from our community by opening a new thread here: https://wordpress.org/support/forum/miscellaneous/
Hi Stef,
Thanks for your answer.
I see in Jetpack’s plugin, in Modules / Protect, a transient-cleanup.php file with:
<?php
/*
Adapted from Purge Transients by Seebz
https://github.com/Seebz/Snippets/tree/master/Wordpress/plugins/purge-transients
*/
if ( ! function_exists( 'jp_purge_transients' ) ) {
/**
* Jetpack Purge Transients.
*
* @access public
* @param string $older_than (default: '1 hour') Older Than.
* @return void
*/
function jp_purge_transients( $older_than = '1 hour' ) {
global $wpdb;
$older_than_time = strtotime( '-' . $older_than );
if ( $older_than_time > time() || $older_than_time < 1 ) {
return false;
}
$sql = $wpdb->prepare( "
SELECT REPLACE(option_name, '_transient_timeout_jpp_', '') AS transient_name
FROM {$wpdb->options}
WHERE option_name LIKE '\_transient\_timeout\_jpp\__%%'
AND option_value < %d
", $older_than_time );
$transients = $wpdb->get_col( $sql );
$options_names = array();
foreach ( $transients as $transient ) {
$options_names[] = '_transient_jpp_' . $transient;
$options_names[] = '_transient_timeout_jpp_' . $transient;
}
if ( $options_names ) {
$option_names_string = implode( ', ', array_fill( 0, count( $options_names ), '%s' ) );
$delete_sql = "DELETE FROM {$wpdb->options} WHERE option_name IN ($option_names_string)";
$delete_sql = call_user_func_array( array( $wpdb, 'prepare' ), array_merge( array( $delete_sql ), $options_names ) );
$result = $wpdb->query( $delete_sql );
if ( ! $result ) {
return false;
}
}
return;
}
}
/**
* Jetpack Purge Transients Activation.
*
* @access public
* @return void
*/
function jp_purge_transients_activation() {
if ( ! wp_next_scheduled( 'jp_purge_transients_cron' ) ) {
wp_schedule_event( time(), 'daily', 'jp_purge_transients_cron' );
}
}
add_action( 'admin_init', 'jp_purge_transients_activation' );
add_action( 'jp_purge_transients_cron', 'jp_purge_transients' );
I’m not sure it works because I see hundreds of _transient_timeout_jpp_ in the database. And thousands of stats transients (200 pages in the wp_options db).
Maybe the transient_cleanup.php file would need a more efficient cleaning?
Hi @sylvsteph
Another plugin you could try is the Transients Manager.
It should allow you to see if transients are correctly being deleted on your site, or if they remain after their expiration, which could narrow down what’s happening here.