Woocomerce 3.0. Что нового и как с этим бороться?

Обновился Woocomerce и теперь на момент записи видео и написания этой статьи актуальная версия 3.0.1. Давайте разбираться, что в нем нового.

к содержанию

Новые галереи

Полностью обновилась галерея, теперь она отлично работает на мобильных устройствах и несет на борту сразу три функционала: зум, слайдер, лайтбокс. Данную галреею требуется подключать в поддержку темы, просто так работать не будет. Достаточно добавить в файл functions.php

add_theme_support( 'wc-product-gallery-zoom' );
add_theme_support( 'wc-product-gallery-lightbox' );
add_theme_support( 'wc-product-gallery-slider' );

Добавлять просто так нельзя! Надо вешать на хук after_setup_theme.  Правильно будет так

add_action( 'after_setup_theme', 'artabr_theme_setup' );
function artabr_theme_setup() {
   add_theme_support( 'wc-product-gallery-zoom' );
   add_theme_support( 'wc-product-gallery-lightbox' );
   add_theme_support( 'wc-product-gallery-slider' );
}

Можно подключать не всё сразу, а только нужное. Например, только слайдер или только лайтбокс. Смотря какой проект

к содержанию

Заголовки в H2

После обновления на страницах: магазин, архивы, рубрики, похожие записи в заголовках товаров изменились заголовки с H3 на H2. Может поплыть верстка. Если для вас это критично, то достаточно в файл functions.php добавить измененную функцию, чтобы переопределить то, что есть

function woocommerce_template_loop_product_title() {
    echo '<h3 class="woocommerce-loop-product__title">' . get_the_title() . '</h3>';
}

Предупреждение: функция product_type вызвана неправильно

Для разработчиков

Теперь нельзя напрямую вызывать тип продукта, только через метод get_type(). Проверяйте свой код и меняйте.

$product->product_type

на

$product->get_type()

Предупреждение: функция id вызвана неправильно

Для разработчиков

Теперь нельзя напрямую вызывать ID продукта, только через метод get_ID(). Проверяйте свой код и меняйте.

$product->id

на

$product->get_ID()

Введение CRUD

Вольный перевод этой статьи и этой с моими примечаниями)

До этого релиза (имеется ввиду Woocommerce 3.0), было несколько способов для разработчиков записывать данные в базу данных для заказов, продуктов и так далее. Получение данных также может быть сделано несколькими способами. Все это требует от разработчика знать, какой тип данных , они пытаются изменить, и это было не идеально: отнимало много времени и было сложным процессом.

Для оптимизации хранения данных, мы (разработчики Woocommerce) должны убедиться , что разработчики используют единый метод написания и извлечение данных . Вот почему вводится класс CRUD с этом релизе.

CRUD (СПОУ) обозначает Create, Read, Update, Delete (Создать, Прочитать, Обновить, Удалить)- четыре основные операции , которые можно сделать. С классами CRUD добавлеными в WooCommerce 3,0, вы можете изменять заказы, товары, клиенты, зоны достави, платежные системы и купоныс меньшим количеством кода через единую систему .

Преимущества этого дополнения:

  • Определяем данные для каждого ресурса и контролируем его поток и проверку
  • Вам нужно только знать имена данных с которыми вы работает, а не из типов или внутренних деталей
  • Эти данные могут быть перемещены в другом месте  (например , пользовательские таблицы) , не затрагивая существующий код
  • Меньше кода означает меньше изменений, плюс дополнительные тесты
к содержанию

Примеры использования CRUD

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

$order_id = 100;
update_post_meta( $order_id, '_billing_first_name', 'Fred' );
update_post_meta( $order_id, '_billing_last_name', 'Flintstone' );

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

Теперь пример CRUD:

$order = wc_get_order( 100 );
$order->set_billing_first_name( 'Fred );
$order->set_billing_last_name( 'Flintstone' );
$order->save();

Я знаю, что у заказа есть свойство первого и последнего имени, но мне не нужно знать, что это пост-мета, или что ключи — это _billing_first_name и _billing_last_name. Если эти ключи изменились в будущем, этот код не будет затронут.

Получение данных из базы данных следует аналогичной схеме. Старый:

$order_id = 100;
$billing_name = get_post_meta( $order_id, '_billing_first_name', true ) . ' ' . get_post_meta( $order_id, '_billing_last_name', true );

Новое:

$order = wc_get_order( 100 );
$billing_name = $order->get_billing_first_name() . ' ' . $order->get_billing_last_name();

Когда это возможно, классы CRUD должны обрабатывать в основном чтение и запись данных. Любой связанный шаблон, такой как получение HTML, должен быть перемещен в функцию шаблона.

к содержанию

Примеры запросов к ресурсам

Поскольку в дальнейшем мы намерены переместить данные в пользовательскую таблицу, важно, чтобы мы предложили способ запроса данных, не проходя сам WordPress. Опять же, разработчику не нужно знать, что заказы — это пользовательский тип записи с именем shop_order — это не имеет значения.

Было

$customer_orders = get_posts( array(
    'numberposts' => 10,
    'meta_key'    => '_customer_user',
    'meta_value'  => get_current_user_id(),
    'post_type'   => wc_get_order_types( 'view-orders' ),
    'post_status' => array_keys( wc_get_order_statuses() )
) );</code>

Стало

$customer_orders = wc_get_orders( array( 
    'customer' => get_current_user_id(), 
    'limit'    => 10,
) );

Вот, это то что нашел и смог исправить. Пишите в коментах, что увидели и с чем столкнулись. Будем разбираться.

Всем успехов!

Об авторе
Артем Абрамович

Автор и ведущий проекта «Финты WordPress». WordPress & WooCommerce разработчик. Четыре года создаю плагины и темы. В свободное время пишу статьи, видеообзоры, гайды.