62 lines
2.5 KiB
PHP
62 lines
2.5 KiB
PHP
<?php
|
|
namespace AskTamMCP\Tools;
|
|
defined('ABSPATH') || exit;
|
|
|
|
class TransientTools {
|
|
|
|
public static function getTransient(array $args): array {
|
|
$key = sanitize_key($args['key']);
|
|
$value = get_transient($key);
|
|
return ['key'=>$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."];
|
|
}
|
|
}
|