/ Плагины / Woocommerce основы

Woocommerce основы

HIT

19.02.2017

2962

Наиболее часто встречающиеся и необходимые вызовы при использовании плагина woocommerce, а так же прочие хитрости при работе с woocommerce.

<?php echo $_product->get_sku( $cart_item ); ?> // Вывести артикул в корзине

echo get_the_title( $product->id ); // вывести название товара

global $product; 
echo $product->get_sale_price(); // вывести акционную цену

echo the_excerpt(); // вывести краткое описание

echo $product->get_stock_quantity(); // вывести количество товара в наличии

echo $product->get_price();  // вывести цену

//Вывести даты начала / окончания акционной цены
global $post;
echo get_post_meta($post->ID, '_sale_price_dates_to', true);
echo get_post_meta($post->ID, '_sale_price_dates_from', true);

Интерпритация даты в нормальный вид
global $post;
$sales_price_to = get_post_meta($post->ID, '_sale_price_dates_to', true);
$sales_price_date_to = date("j M y", $sales_price_to);
echo $sales_price_date_to

Параметры заказа

Получить метод оплаты:

get_post_meta( $order->id, '_payment_method', true );

или с версии 3.0

$order->get_payment_method();

Получить заказ (object со всеми данными) по id заказа:

$order = wc_get_order( $order_id );

Проверки

Проверка на распродажный товар

global $product;
if ( $product->is_on_sale() ) {
    do_something();
}

Проверка на товар, которого нет в наличии

global $product;
if (!$product->is_in_stock()) {
    do_something();
}

Альтернативная проверка наличия

if ($product->get_stock_quantity() == 0) {}
Глобально запретить предзаказы на сайте

Рекомендованные товары

Featured является термином таксономии product_visibility, т.е. если товар «рекомендуемый», то он привязан (в таблице БД wp_term_relationships) к термину featured.

Товар всегда в наличии и наоборот

Если по каким бы то ни было причинам (например обмен с 1С) нам нужно сделать принудительно товары какой-то категории всегда в наличии или наоборот, можно это сделать так:

Для категории с подкатегориями (чтобы применить правило и в них):

// Отключаем возможность заказа Товары для дома и сада
function wc_сonditions_domsad() {
	$args = array(
		'child_of'           => 954, //категория Товары для дома и сада
		'hide_empty'         => 1,
		'depth'              => -1,
		'taxonomy'           => 'product_cat',
	);

	$list_product_categoryes = get_categories( $args );

	$category_ids = array();

	foreach($list_product_categoryes as $product_category) $category_ids[] = $product_category->term_id;

	global $product;
	$cur_term = get_the_terms($product->id, 'product_cat');

	if (in_array($cur_term[0]->term_id, $category_ids)) {
		update_post_meta($product->id, '_stock_status', 'outstock');
	}
}
add_filter( 'woocommerce_single_product_summary', 'wc_сonditions_domsad', 6 );
add_filter( 'woocommerce_after_shop_loop_item_title', 'wc_сonditions_domsad', 6 );

Для категории без подкатегорий:

// Отключаем возможность заказа Изоляционные материалы
function wc_сonditions_izolation() {

	global $product;
	$cur_term = get_the_terms($product->id, 'product_cat');

	if ($cur_term[0]->term_id == 719) {
		update_post_meta($product->id, '_stock_status', 'outstock');
	}
}
add_filter( 'woocommerce_single_product_summary', 'wc_сonditions_izolation', 6 );
add_filter( 'woocommerce_after_shop_loop_item_title', 'wc_сonditions_izolation', 6 );

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

Тяжелые запросы

На одном из сайтов на Главной странице выводились последние 10 товаров. Но страница загружалось довольно долго, около 8 секунд. При этом товаров в базе было около 1000 и небольшая часть из них вариативные. Я изменил вывод, добавив выборку по типу товаров (type=simple) и вывел только простые (не вариативные товары), время загрузки страницы стало быстрее.

Чтобы это реализовать нужно выводить товары с помощью функции wc_get_products и последующей версткой товаров.

<h2>Новинки</h2>
<div class="carousel woocommerce">
	<ul class="multiple-items products">
		<?php $args = array(
			'type' => 'simple',
			'limit' => 10,
			'post_status' => 'publish',
		);
		$products = wc_get_products( $args );
		foreach( $products as $product_object ):

		$product_id = $product_object->get_id();
		$product = wc_get_product($product_id); ?>

		<li <?php wc_product_class(); ?>><span>
			<a href="<?php echo get_permalink( $product->get_id() ); ?>" class="woocommerce-LoopProduct-link woocommerce-loop-product__link"> 

				<div class="percentage">
					<div class="inside"><div class="inside-text">
						<?php $percentage = round( ( ( $product->get_regular_price() - $product->get_sale_price() ) / $product->get_regular_price() ) * 100 );
						echo $price . sprintf( __('-%s', 'woocommerce' ), $percentage . '%' ); ?>
					</div></div>
				</div>	

				<div class="label">
					<?php if ( $product->is_on_sale() ) : ?>
					<?php echo apply_filters( 'woocommerce_sale_flash', '<span class="onsale">' . __( 'Sale!', 'woocommerce' ) . '</span>', $post, $product ); ?>
					<?php endif; ?>
				</div>	

				<?php $image = wp_get_attachment_image_src( get_post_thumbnail_id( $product->get_id() ), 'shop_catalog' );?>
				<div class="imagewrapper"><img src="<?php  echo $image[0]; ?>" data-id="<?php echo $product->get_id(); ?>"></div>
				<h2 class="woocommerce-loop-product__title"><?php echo $product->get_title(); ?></h2>
				<span class="price"><?php echo $product->get_price_html(); ?></span>
			</a>

			<?php if ( ! $product->is_sold_individually() && 'variable' != $product->get_type() && $product->is_purchasable() && $product->is_in_stock() ) {
woocommerce_quantity_input( array( 'min_value' => 1, 'max_value' => $product->backorders_allowed() ? '' : $product->get_stock_quantity() ) );
} ?>

			<a href="/?add-to-cart=<?php echo $product->get_id(); ?>" data-quantity="1" class="button product_type_simple add_to_cart_button ajax_add_to_cart" data-product_id="<?php echo $product->get_id(); ?>" rel="nofollow">В корзину</a>

			</span></li>

		<?php endforeach; ?>			
	</ul>			
</div>

Формирование мета-данных товара

Эти данные выводятся хуком woocommerce_template_single_meta, но возможно пригодится как их сформировать:


function enter_product_info() {
	global $product;
	echo '<div class="product-info">';
	echo '<p>Артикул: '.$product->get_sku().'</p>';
	echo '<p>Категория: '.wc_get_product_category_list( $product->get_ID(), ', ').'</p>';
	echo '<p>Бренд: '.wc_get_product_tag_list( $product->get_ID(), ', ').'</p>';
	echo '</div>';
}
add_action( 'woocommerce_single_product_summary', 'enter_product_info', 55 );

Условные теги Woocommerce

Страница WooCommerce

is_woocommerce() Возвращает true, если на странице используются шаблоны WooCommerce (корзина и касса являются стандартными страницами с короткими кодами и поэтому не включены).

Главная страница магазина

is_shop() Возвращает истину, когда находится на странице архива продукта (магазин).

Страница категории товаров

  • is_product_category()Возвращает true при просмотре архива категории продуктов.
  • is_product_category( 'shirts' )Когда отображается страница категории продукта для категории «рубашки».
  • is_product_category( array( 'shirts', 'games' ) )Когда отображается страница категории продукта для категории «рубашки» или «игры».

Страница с тегом продукта

  • is_product_tag() Возвращает true при просмотре архива тегов продукта
  • is_product_tag( 'shirts' ) Когда отображается страница тега продукта для тега «рубашки».
  • is_product_tag( array( 'shirts', 'games' ) ) Когда отображается страница тега продукта для тегов «рубашки» или «игры».

Страница одного продукта

is_product() Возвращает истину на одной странице продукта. Обертка для is_singular.

Страница корзины

is_cart() Возвращает true на странице корзины.

Страница оформления заказа

is_checkout() Возвращает true на странице оформления заказа.

Страницы учетной записи клиента

is_account_page()Возвращает true на страницах учетной записи клиента.

Конечная точка

  • is_wc_endpoint_url() Возвращает true при просмотре конечной точки WooCommerce.
  • is_wc_endpoint_url( 'order-pay' ) Когда отображается страница конечной точки для оплаты заказа.
  • is_wc_endpoint_url( 'order-received' ) Когда отображается страница конечной точки для полученного заказа.
  • is_wc_endpoint_url( 'view-order' ) Когда отображается страница конечной точки для порядка просмотра.
  • is_wc_endpoint_url( 'edit-account' ) Когда отображается страница конечной точки для редактирования учетной записи.
  • is_wc_endpoint_url( 'edit-address' ) Когда отображается страница конечной точки для редактирования адреса.
  • is_wc_endpoint_url( 'lost-password' ) Когда отображается страница конечной точки для потерянного пароля.
  • is_wc_endpoint_url( 'customer-logout' ) Когда отображается страница конечной точки для выхода клиента из системы.
  • is_wc_endpoint_url( 'add-payment-method' ) Когда отображается страница конечной точки для добавления метода оплаты.

Запрос Ajax

is_ajax()Возвращает true, когда страница загружается через ajax.

[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
WooCommerce and 1C:Enterprise

WooCommerce and 1C:Enterprise

Разбираем на элементы плагин WooCommerce and 1C:Enterprise/1С:Предприятие Data Exchange. Плагин дает функционал обмена данными между сайтом и программой 1С: Предприятие. Некоторые моменты синхронизации сайта с 1С описаны в статье Интеграция Читать далее »

Поле для вариативного товара

Поле для вариативного товара

Как делать произвольные (пользовательские) поля для товаров Woocommerce описано здесь. Но теперь пойдем дальше — сделаем поле для вариативного товара. Это должно открыть горизонты для интересных решений. Но я предвижу Читать далее »

Переход на WC 3.0

Переход на WC 3.0

Когда видишь в панели плагинов обновление woocommerce до версии 3.0 — ощущение как будто резко наступил Новый год! Что же нового в версии 3.0: изучаем, тестим, разбираемся. Галерея изображений Теперь Читать далее »

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

Пока нет комментариев. Будь первым!

Woocommerce основы
Предварительная стоимость (товар + количество)
Рекомендации для васПредварительная стоимость (товар + количество)Opttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.