WordPress — Глобальная переменная с областью с сохранением состояния и проблемой кэширования параметров WP

Здесь проблема.

Мне нужно увеличивать доменный номер заказа каждый раз, когда заказ размещается в woocommerce.

Я попытался использовать функциональность wp_option, чтобы он присутствовал независимо от того, где и когда он работает. Я использовал следующие вспомогательные функции.

    $this->$order_number = get_option('next_order_number'); // To retrieve next number
update_option('next_order_number',$this->$order_number +1); // To update number

return $this->$order_number;

У меня проблема в том, что когда два ордера приходят вплотную, достаточно близко по времени, get_option возвращает один и тот же номер ордера.

Итак, обновление кэширования слишком медленное или слишком глупое, чтобы понять, что я обращаюсь к одной и той же переменной в обоих контекстах выполнения.

В мире .NET мы могли бы сделать много разных вещей, чтобы решить эту проблему. Тем не менее, я новичок в WordPress и не знаю, как справиться с этой аномалией.

Мои мысли заключались в том, чтобы создать класс Singleton, увеличить внутреннее число и вернуть целое число, а затем запустить обновление для wp_options.

Предполагая, что синглтон работает на все запросы WordPress, я мог бы добавить немного дополнительного клея, чтобы получить текущее значение, если оно было сброшено из-за перезагрузки сервера и т. Д.

Однако даже при создании статической переменной для использования в одноэлементном шаблоне значение не сохраняется в запросах.

Я начинаю думать, что PHP / WordPress не поддерживает любой тип состояния приложения, аналогичный Microsoft MVC.

Существуют ли какие-либо методы или методы, которые я могу использовать, когда я могу запустить глобальную переменную, которая сохраняет состояние и действует по всем запросам от всех пользователей, а также повторно инициирует себя, когда процесс перезапускается.

1

Решение

Вы правы — PHP не поддерживает состояние приложения между запросами, так как обычно он запускается с использованием веб-сервера, такого как Apache, который обычно настроен на запуск экземпляра PHP для каждого запроса.

Вместо этого вам нужно сохранить это в базе данных и запросить базу данных, чтобы получить номер. Очень похоже на то, что вы делаете сейчас, но в обход параметров кэширования. Теперь, как говорится, вы не захотите просто читать число и использовать его каждый раз, потому что два пользователя могут пытаться читать число одновременно, используя разные процессы PHP. Вместо этого рекомендуется вставлять в базу данных строку с номером заказа в качестве автоинкремента. Это резервирует этот номер заказа в базе данных. Затем, если в это же время придет другой пользователь и попытается получить номер заказа с помощью этой вставки, произойдет сбой, поэтому вы можете повторить попытку с одним номером выше.

Все это, как говорится, обычно выполняется по умолчанию с использованием любой системы, которая отслеживает заказы. У woocommerce уже нет первичного ключа для их заказов? Почему бы не использовать это? Если вам нужен номер, определенный для домена, почему бы просто не подсчитать, сколько заказов для этого домена до сих пор, и сохранить его в заказе после того, как он создан и имеет номер заказа по умолчанию woocommerce?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]