Загрузка...

WooCommerce HPOS. Адаптация кода

HPOS

HPOS (High-Performance Order Storage) или высокопроизводительное хранилище заказов

— относительно новая фишка в WooCommerce. Относительно, потому что ей уже больше года, но до версии WooCommerce 8.6 не было жесткого требования к адаптации своего кода для работы с этим функционалом.

В чем суть?

Как известно, WordPress предназначен в первую очередь для небольших блогов и не заточен под e-commerce проекты, поэтому реализация специфичного функционала может быть проблемной для высоконагруженных проектов. Особенно, если использовать стандартную систему хранения данных WordPress. Поэтому кода создавался WooCommerce его разработчики решили не учли, ( а может и не предполагали, что плагин окажется столь популярным), что при масштабировании проектов, могут быть серьезные проблемы с производительностью.
А масштабираются проекты (и их базы), только когда есть значительный поток покупателей и средств.
В общем случилось, так что крупные сайты, использующие движок стали жаловаться на проблемы с производительностью при работе с базой заказов. Не ответить на это разрабы WooCommerce не могли, поэтому выкати обнову и назвали ее HPOS.

На мой взгляд, это конечно решит какие-то проблемы, но код WooCommerce, ой как далек от хорошего, а потому переписывать его будут долго и с каждым изменением все так же нужно будет адаптировать к нему кучу нашего легаси, т.к. изначально плагин написан неправильно.
Было бы гораздо лучше переписать его с 0, а не заниматься переделкой запорожца в бмв.
Но делать это видимо не считают нужным, поэтому будем жить с тем, что есть..

Адаптация своего плагина

У меня есть плагин, и соответственно я столкнулся с проблемой, что Woo стал на него ругаться.

Что ж пришло время взяться за код. Первым делом идем читать блог Мишы, он умничка, расписал все подробно, что куда и как.

Итак адаптация проходит в 3 шага:

  1. Удаляем все вызовы get_post() или WP_Post() используемые для заказов и меняем их на wc_get_order()
  2. Аналогично поступаем с get_post_meta(), update_post_meta(), delete_post_meta(). Меняем на методы работы с объектом WC_Order(). $wc_order->get_meta() и т.д.
  3. Добавляем информация о совместимости:
    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__);
    });

    Могут быть так же другие условности, но это основное.

 

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *