PHP и контент WooCommerce: эффективные подходы к разработке

Раздел: Веб-разработка -> CMS WordPress

Основные способы взаимодействия с контентом WooCommerce в PHP

Как получить товар WooCommerce и изменить его свойства программно?

Наиболее эффективный способ работы с товарами, заказами и корзиной WooCommerce в PHP заключается в использовании встроенных классов: WC_Product, WC_Order, WC_Cart. Эти объекты предоставляют все необходимые методы для чтения и записи данных, а также учитывают внутреннюю логику WooCommerce (кэширование, типы товаров, валюту и т.д.).


// Получение товара по ID
$product = wc_get_product(123);
if ($product) {
    $price = $product->get_price();
    $name = $product->get_name();
}

Function php wp (функции wordpress php)

Для изменения цены перед отображением используется фильтр woocommerce_product_get_price:


add_filter('woocommerce_product_get_price', function($price, $product) {
    if ($product->is_on_sale()) {
        return $price * 0.9; // скидка 10%
    }
    return $price;
}, 10, 2);

Php woocommerce content (работа с контентом woocommerce в php)

Типичная ошибка: изменение цены через прямой запрос к базе данных (UPDATE wp_postmeta) может нарушить кэширование объектов и привести к несоответствию данных. Решение – всегда использовать методы объекта (set_price()) и вызывать save().

Как получить список товаров определённой категории без использования WP_Query?

Альтернативный вариант – использование WC_Product_Query. Это специализированный класс для выборки товаров с учётом их типов и метаданных.


$query = new WC_Product_Query(array(
    'category' => array('term_id' => 15),
    'limit'    => 10,
));
$products = $query->get_products();
foreach ($products as $product) {
    echo $product->get_name();
}

Admin pages php (страницы админки на php)

Ошибка: если передать неверный таксономический слаг, запрос вернёт пустой результат. Всегда проверяйте существование категории через term_exists().

Как изменить содержимое корзины перед оформлением заказа?

Для модификации корзины используйте хуки woocommerce_before_calculate_totals и woocommerce_cart_item_price.


add_action('woocommerce_before_calculate_totals', function($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    foreach ($cart->get_cart() as $cart_item) {
        $product = $cart_item['data'];
        $product->set_price(100); // установка фиксированной цены
    }
});

Предостережение: изменение цены в корзине должно происходить только в этом хуке, иначе изменения не будут учтены при пересчёте. Не рекомендуется менять объект товара напрямую вне хука.

Расширенные примеры работы с контентом WooCommerce

Как добавить произвольное поле к товару и отобразить его на странице?

Пример

// Добавление мета-поля через интерфейс (пример для functions.php)
add_action('woocommerce_product_options_general_product_data', function() {
    woocommerce_wp_text_input(array(
        'id'          => '_custom_field',
        'label'       => 'Произвольное поле',
        'description' => 'Введите значение',
        'desc_tip'    => true,
    ));
});

// Сохранение мета-поля
add_action('woocommerce_process_product_meta', function($post_id) {
    if (isset($_POST['_custom_field'])) {
        update_post_meta($post_id, '_custom_field', sanitize_text_field($_POST['_custom_field']));
    }
});

// Отображение на фронтенде
add_action('woocommerce_single_product_summary', function() {
    global $product;
    $value = $product->get_meta('_custom_field');
    if ($value) {
        echo '

Дополнительно: ' . esc_html($value) . '

'; } }, 25);
Результат: на странице товара под заголовком появится строка с введённым значением.

Как через PHP создать заказ программно с несколькими товарами?

Пример

$order = wc_create_order();
$order->set_customer_id(1); // ID пользователя
$order->set_address(array(
    'first_name' => 'Иван',
    'last_name'  => 'Петров',
    'email'      => 'ivan@example.com',
    'phone'      => '+79001234567',
    'address_1'  => 'ул. Ленина, 1',
    'city'       => 'Москва',
    'country'    => 'RU',
));

// Добавление товаров
$product1 = wc_get_product(100);
$order->add_product($product1, 2); // количество 2
$product2 = wc_get_product(200);
$order->add_product($product2, 1);

$order->calculate_totals();
$order->update_status('processing');
Результат: создан заказ с номером (ID), статусом «В обработке», общей суммой.

Как получить все заказы пользователя с фильтрацией по дате?

Пример

$orders = wc_get_orders(array(
    'customer_id' => 1,
    'date_created' => '>=' . date('Y-m-d', strtotime('-30 days')),
    'limit'       => -1,
));
foreach ($orders as $order) {
    echo 'Заказ #' . $order->get_order_number() . ' - ' . $order->get_date_created()->date_i18n('d.m.Y') . '
'; }
Результат: выводится список заказов текущего пользователя за последние 30 дней.

Как изменить цену товара динамически в зависимости от роли пользователя?

Пример

add_filter('woocommerce_product_get_price', function($price, $product) {
    if (current_user_can('wholesale_customer')) {
        return $price * 0.8; // оптовая скидка 20%
    }
    return $price;
}, 10, 2);
Результат: для пользователей с ролью wholesale_customer цена уменьшается на 20%.

Как обновить количество товара на складе после изменения заказа?

Пример

add_action('woocommerce_order_status_completed', function($order_id) {
    $order = wc_get_order($order_id);
    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if ($product && $product->managing_stock()) {
            $new_stock = $product->get_stock_quantity() - $item->get_quantity();
            $product->set_stock_quantity($new_stock);
            $product->save();
        }
    }
});
Результат: при переводе заказа в статус «Выполнен» остатки товаров списываются.

Работа с контентом WooCommerce в PHP - comments

En
Php woocommerce content (php)