$key,'exists'=>$value!==false,'value'=>$value!==false?$value:null]; } public static function setTransient(array $args): array { $key = sanitize_key($args['key']); $value = $args['value']; $expiration = (int)($args['expiration'] ?? HOUR_IN_SECONDS); set_transient($key, $value, $expiration); return ['key'=>$key,'set'=>true,'expires_in'=>$expiration,'expires_at'=>date('Y-m-d H:i:s', time()+$expiration)]; } public static function deleteTransient(array $args): array { $key = sanitize_key($args['key']); $result = delete_transient($key); return ['key'=>$key,'deleted'=>$result]; } public static function listTransients(array $args): array { global $wpdb; $search = $args['search'] ?? ''; $like = '%_transient_' . $wpdb->esc_like($search) . '%'; $rows = $wpdb->get_results($wpdb->prepare( "SELECT option_name, LENGTH(option_value) as val_size FROM {$wpdb->options} WHERE option_name LIKE %s AND option_name NOT LIKE '%_transient_timeout_%' ORDER BY option_name LIMIT 100", $like ), ARRAY_A); $result = []; foreach ($rows as $r) { $key = str_replace('_transient_', '', $r['option_name']); $exp = get_option('_transient_timeout_' . $key); $result[] = [ 'key' => $key, 'size' => (int)$r['val_size'], 'expires' => $exp ? date('Y-m-d H:i:s', (int)$exp) : 'no expiry', 'expired' => $exp && (int)$exp < time(), ]; } return ['transients'=>$result,'count'=>count($result)]; } public static function flushExpiredTransients(array $args): array { global $wpdb; $count = $wpdb->query($wpdb->prepare( "DELETE a, b FROM {$wpdb->options} a INNER JOIN {$wpdb->options} b ON b.option_name = REPLACE(a.option_name, '_transient_timeout_', '_transient_') WHERE a.option_name LIKE '_transient_timeout_%%' AND a.option_value < %d", time() )); return ['flushed'=>(int)$count,'message'=>"Deleted $count expired transient entries."]; } }