HPOS (High-Performance Order Storage) или высокопроизводительное хранилище заказов
– относительно новая фишка в WooCommerce. Относительно, потому что ей уже больше года, но до версии WooCommerce 8.6 не было жесткого требования к адаптации своего кода для работы с этим функционалом.
В чем суть?
Как известно, WordPress предназначен в первую очередь для небольших блогов и не заточен под e-commerce проекты, поэтому реализация специфичного функционала может быть проблемной для высоконагруженных проектов. Особенно, если использовать стандартную систему хранения данных WordPress. Поэтому кода создавался WooCommerce его разработчики решили не учли, ( а может и не предполагали, что плагин окажется столь популярным), что при масштабировании проектов, могут быть серьезные проблемы с производительностью.
А масштабираются проекты (и их базы), только когда есть значительный поток покупателей и средств.
В общем случилось, так что крупные сайты, использующие движок стали жаловаться на проблемы с производительностью при работе с базой заказов. Не ответить на это разрабы WooCommerce не могли, поэтому выкати обнову и назвали ее HPOS.
На мой взгляд, это конечно решит какие-то проблемы, но код WooCommerce, ой как далек от хорошего, а потому переписывать его будут долго и с каждым изменением все так же нужно будет адаптировать к нему кучу нашего легаси, т.к. изначально плагин написан неправильно.
Было бы гораздо лучше переписать его с 0, а не заниматься переделкой запорожца в бмв.
Но делать это видимо не считают нужным, поэтому будем жить с тем, что есть..
Адаптация своего плагина
У меня есть плагин, и соответственно я столкнулся с проблемой, что Woo стал на него ругаться.
Что ж пришло время взяться за код. Первым делом идем читать блог Мишы, он умничка, расписал все подробно, что куда и как.
Итак адаптация проходит в 3 шага:
- Удаляем все вызовы get_post() или WP_Post() используемые для заказов и меняем их на wc_get_order()
- Аналогично поступаем с get_post_meta(), update_post_meta(), delete_post_meta(). Меняем на методы работы с объектом WC_Order(). $wc_order->get_meta() и т.д.
- Добавляем информация о совместимости:
add_action( 'before_woocommerce_init', function() { if( !class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) { return; } \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility('custom_order_tables',__FILE__); });
Могут быть так же другие условности, но это основное.