Я уже писал об использовании файлов cookie в WordPress раньше, но одна из особенностей этого заключается в том, что они обычно после этого срабатывают в контексте хука инициализации .
При работе в объектно-ориентированном стиле и попытке отделить определенные части логики, чтобы вы могли использовать их, не полагаясь на другие ловушки, важно найти способы справиться с этим.
В противном случае код становится тесно связанным, и вы можете повсюду использовать хуки, вызовы do_action или анонимные функции.
Чтобы имитировать природу файлов cookie и срок их действия, использование переходных процессов WordPress через API Transients с соответствующим названием может быть жизнеспособным решением.
Использование переходных процессов WordPress
Если вы знакомы с любым из API метаданных, которые есть в WordPress, то вы, вероятно, знакомы с функциями, которые они используют. Сюда входят стандартные операции, такие как добавление, получение, обновление и удаление.
А с WordPress вы можете во многих местах упростить обновление, получение и удаление, потому что update сначала увидит, существует ли часть информации, и, если нет, добавит ее.
Проектирование интерфейса класса
Таким образом, интерфейс класса, обертывающего Transients API, можно сократить до:
- установлен,
- получить,
- Удалить.
Где set заменяет add и update. Кроме того, хорошо иметь вспомогательные функции, такие как has, которые позволяют нам писать условные операторы в коде, который вызывает библиотеку.
Например, если вы хотите сделать что-то вроде «если это не имеет значения, то верните».
Таким образом, интерфейс для кода может выглядеть примерно так:
<?php
/**
* A wrapper for the Transients API. Because using `setcookie` only works in the `init`
* hook of WordPress, then we need a way to simulate it. That's what the purpose of this class
* does.
*
* It will use the ID of the user who is currently logged in (or the PHP's get_current_user value if
* they are not logged in).
*
* @author Tom McFarlin <tom@tommcfarlin.com>
*/
interface DataStore {
/**
* Determines if a transient value already exists identified with the incoming key.
*
* @param string $key The key used to identify the key in the database.
*
* @return bool True if a transient exists; otherwise, false.
*/
public function has( string $key );
/**
* Saves the specified value for 24 hours.
*
* @param string $key The key used to identify the key in the database.
* @param string $value The value to save for 24 hours.
*/
public function set( string $key, string $value );
/**
* Retrieves the transient value from the database.
*
* @param string $key The key used to identify the key in the database.
*
* @return string The value associated with the incoming transient.
*/
public function get( string $key );
/**
* Deletes the transient data.
*
* @param string $key The key used to identify the key in the database.
*/
public function delete( string $key );
}
Есть некоторые предостережения, которые следует учитывать при работе с подобным кодом. То есть как насчет аутентифицированных и неаутентифицированных пользователей?
Когда это произойдет, может потребоваться другой способ обработки временных данных (в зависимости от вашего метода реализации, описанного выше).
Я могу рассказать об этом в следующем посте.
Слово предостережения
Однако следует помнить одну вещь: не стоит загрязнять таблицу параметров WordPress. И именно здесь хранятся переходные процессы.
Поэтому, если вы собираетесь использовать переходные процессы WordPress, убедитесь, что вы не добавляете массу значений в базу данных.
Как раз то, что нужно. А если нужно много данных, то, возможно, вам стоит посмотреть на архитектуру вашего кода или рассмотреть другой тип базы данных.
