Подключить действие, когда временный объект удаляется? Не могу заставить это работать!

Вопрос или проблема

Я работаю над плагином, который кэширует удаленную страницу по запросу.
Файл создается с помощью 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 транзиентов. Ваша цель заключается в том, чтобы удалить файл кэша в тот момент, когда соответствующий транзиент удаляется из базы данных.

Существующие ограничения

  1. Хук deleted_transient: Этот хук срабатывает после того, как транзиент уже был удален, что не позволяет вам получить информацию о кэшируемом файле в момент удаления.

  2. Имя транзиента: Вы используете случайные имена для транзиентов, что усложняет использование других доступных хуков, таких как delete_transient_{$transient}, так как вы не можете заранее узнать имя транзиента, который удаляется.

Решения

  1. Используйте хук 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;
    });
  2. Слушайте хук 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; // Верните оригинальное значение
    });
  3. Динамическое управление транзиентами: Если ваши транзиенты имеют случайные имена, вы можете хранить пути к кэшированным файлам в опциях WordPress или использовать массив для отслеживания соответствий между транзиентами и их файлами. Это позволит вам более эффективно управлять удалением.

Заключение

Чтобы успешно удалять связанные файлы кэша при удалении транзиентов, используйте хуки pre_transient или pre_option__transient_timeout. Помните, что правильное управление транзиентами и информированность о их состоянии являются ключевыми факторами для успешного выполнения вашей задачи. Не забывайте также тестировать ваш код, чтобы убедиться, что он работает в соответствии с ожиданиями.

Оцените материал
Добавить комментарий

Капча загружается...