PHP и контент WooCommerce: эффективные подходы к разработке
Основные способы взаимодействия с контентом 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();
}
}
});
Результат: при переводе заказа в статус «Выполнен» остатки товаров списываются.