Вопрос или проблема
Я работаю над плагином, который кэширует удаленную страницу по запросу.
Файл создается с помощью tempnam().
Я сохраняю путь к этому кэшированному файлу в временном (transient), используя API временных данных.
Как только временные данные удаляются WordPress, я хотел бы удалить и свою кэшированную страницу.
Я пробовал добавить действие на хук deleted_transient, но похоже, что он не срабатывает. Может быть, он срабатывает только при использовании delete_transient(), а не когда WP выполняет эту работу автоматически.
Моя другая проблема в том, что чтобы удалить мой файл, мне нужно получить путь к кэшированному файлу ДО удаления временных данных…
…Но хук deleted_transient срабатывает после удаления.
Есть другой хук до удаления (‘delete_transient_’ . $transient), но…
Мне нужно знать имя временных данных, чтобы его вызвать.
А у моих временных данных случайные имена…
Есть идеи по этому поводу?
Временные данные обычно очищаются при чтении. Если вы хотите проверить этот общий случай, вы можете поймать pre_transient_transientname и посмотреть, истек ли он, так же, как это делает WP:
function get_transient( $transient ) {
/**
* Фильтрует значение существующих временных данных.
*
* Динамическая часть имени хуки, `$transient`, относится к имени временных данных.
*
* Передача истинного значения фильтру эффективно прекращает извлечение
* временных данных, возвращая переданное значение вместо этого.
*
* @since 2.8.0
*
* @param mixed $pre_transient Значение по умолчанию для возврата, если временные данные не существуют.
* Любое значение, отличное от false, будет прекращать извлечение
* временных данных и возвращать возвращенное значение.
*/
$pre = apply_filters( 'pre_transient_' . $transient, false );
if ( false !== $pre )
return $pre;
if ( wp_using_ext_object_cache() ) {
$value = wp_cache_get( $transient, 'transient' );
} else {
$transient_option = '_transient_' . $transient;
if ( ! defined( 'WP_INSTALLING' ) ) {
// Если опция отсутствует в alloptions, она не загружается автоматически и, следовательно, имеет тайм-аут
$alloptions = wp_load_alloptions();
if ( !isset( $alloptions[$transient_option] ) ) {
$transient_timeout="_transient_timeout_" . $transient;
if ( get_option( $transient_timeout ) < time() ) {
delete_option( $transient_option );
delete_option( $transient_timeout );
$value = false;
}
}
}
if ( ! isset( $value ) )
$value = get_option( $transient_option );
}
/**
* Фильтрует значение существующих временных данных.
*
* Динамическая часть имени хуки, `$transient`, относится к имени временных данных.
*
* @since 2.8.0
*
* @param mixed $value Значение временных данных.
*/
return apply_filters( 'transient_' . $transient, $value );
}
Вы также можете подключить фильтр pre_option__transient_timeout_<transientname>
, чтобы поймать этот get_option, который происходит непосредственно перед удалением, и проверить это условие, чтобы узнать, истек ли он. Просто убедитесь, что вы возвращаете первый аргумент в функциях, которые вы используете для фильтрации этих данных.
Ответ или решение
Как подключить действие при удалении транзиента в WordPress
В вашем вопросе описывается задача, связанная с удалением кэшированной страницы, когда транзиент в WordPress удаляется. Давайте разберем эту задачу подробно и рассмотрим возможные подходы для её решения.
Проблема
Вы создали плагин, который кэширует удаленную страницу. Путь к кэшируемому файлу сохраняется в транзиенте, созданном с помощью API транзиентов. Ваша цель заключается в том, чтобы удалить файл кэша в тот момент, когда соответствующий транзиент удаляется из базы данных.
Существующие ограничения
-
Хук
deleted_transient
: Этот хук срабатывает после того, как транзиент уже был удален, что не позволяет вам получить информацию о кэшируемом файле в момент удаления. -
Имя транзиента: Вы используете случайные имена для транзиентов, что усложняет использование других доступных хуков, таких как
delete_transient_{$transient}
, так как вы не можете заранее узнать имя транзиента, который удаляется.
Решения
-
Используйте хук
pre_transient_{$transient}
: Когда вы запрашиваете значение транзиента, WordPress проверяет, не истек ли он. Вы можете использовать хукpre_transient_{$transient}
для переопределения логики получения транзиента и проверки, истек ли он или нет. Это позволит вам выполнить необходимые действия перед тем, как транзиент будет удален.add_filter('pre_transient_my_transient', function($pre) { // Здесь вы можете добавить логику для проверки истечения транзиента // и при необходимости удалить кэшированный файл. if ($pre === false) { $cached_file_path = get_option('my_transient_cache_path'); // Получите путь к файлу из опции if (file_exists($cached_file_path)) { unlink($cached_file_path); // Удалите кэшированный файл } } return $pre; });
-
Слушайте хук
pre_option__transient_timeout_{$transient}
: Вы можете использовать этот хук, чтобы перехватить процесс перед удалением транзиента. Если вы будете проверять время истечения, то сможете выполнить действия по удалению файла кэша.add_filter('pre_option__transient_timeout_my_transient', function($timeout) { // Логика проверки времени истечения транзиента if ($timeout < time()) { $cached_file_path = get_option('my_transient_cache_path'); // Получите путь к файлу из опции if (file_exists($cached_file_path)) { unlink($cached_file_path); // Удалите кэшированный файл } } return $timeout; // Верните оригинальное значение });
-
Динамическое управление транзиентами: Если ваши транзиенты имеют случайные имена, вы можете хранить пути к кэшированным файлам в опциях WordPress или использовать массив для отслеживания соответствий между транзиентами и их файлами. Это позволит вам более эффективно управлять удалением.
Заключение
Чтобы успешно удалять связанные файлы кэша при удалении транзиентов, используйте хуки pre_transient
или pre_option__transient_timeout
. Помните, что правильное управление транзиентами и информированность о их состоянии являются ключевыми факторами для успешного выполнения вашей задачи. Не забывайте также тестировать ваш код, чтобы убедиться, что он работает в соответствии с ожиданиями.