/ Wordpress / Функция действующая на конкретный раздел

Функция действующая на конкретный раздел

HIT

16.09.2017

2149

Создадим функцию, которая будет действовать на конкретный раздел сайта, в частности на конкретную категорию woocommerce. Задачу разобьем на 2 этапа: выборка категорий необходимых для воздействия и непосредственно функция.

Вывод определенного раздела

Фактически на этом этапе нам нужно автоматизировать подбор категорий воздействия. Начиная от родительских категорий — получить дочерние разделы.

Выводим записи всех подкатегорий определенной категории woocommerce, с разделением по каждой подкатегории. 938 — это базовая категория с подкатегориями которой нам нужно работать.

<?php $terms = get_terms( 
array(    
'taxonomy' => 'product_cat',
'hide_empty' => false,
'pad_counts'=> true,
'orderby' => 'name',
'child_of' => 938
) ); ?>

<?php if($terms) : ?>    
<?php foreach($terms as $term) : ?>    

<?php echo $term->name;?><br>    

<?php $args = array(    
'post_type' => 'product',  
'posts_per_page' => -1,  
'orderby' => 'date',  
'order'   => 'ACS', 
'tax_query' => array( 
array( 
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => $term->term_id,  
) 
));

$postslist = get_posts( $args ); ?>  
<ul><?php foreach ($postslist as $post) : setup_postdata($post); 
?> <li><a href="<?php the_permalink(); ?>"><?php the_title();?></a></li> 
<?php endforeach; ?> </ul>  

<?php endforeach; ?>
<?php endif; ?>

Выводим записи всех подкатегорий определенной категории woocommerce, без разделения, только записи одна за одной.

<?php $terms = get_terms(
array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'pad_counts'=> true,
'orderby' => 'name',
'child_of' => 938
)
); ?>

<?php if($terms) : ?>
<?php foreach($terms as $term) : ?>

<?php echo $term->name;?><br>
<?php $all_term_ids[] = $term->term_id;?>

<?php endforeach; ?>
<?php endif; ?>

<?php $args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'orderby' => 'date',
'order'   => 'ACS',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => $all_term_ids
)
));

$postslist = get_posts( $args ); ?>

<ul><?php foreach ($postslist as $post) : setup_postdata($post); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title();?></a></li>
<?php endforeach; ?></ul>

Формировать массив записей можно более коротким способом. Таксономия становиться одним из параметров, причем таким образом можно прописывать несколько таксономий. Но в данном случае необходимо указывать не ID, а slug термина.

$postslist = get_posts( array(
	 'posts_per_page' => 5,
	 'orderby'        => 'rand',
	 'post_type'      => 'product',
	 'product_cat'    => $term->slug
) );

Можно просто получить список дочерних терминов:

<?php $args = array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'pad_counts'=> true,
'orderby' => 'name',
'child_of' => 767
);

$terms = get_terms( $args );  ?>

<?php foreach($terms as $term) : ?>
<?php echo $term->name;?> (<?php echo $term->term_id;?>)<br>
<?php endforeach; ?>

В функции get_terms в параметрах child_of и parent — может быть только одно число. А как быть если нам нужно получить дочерние категории двух и более элементов.

Пример: Вывод объявления перед товарами конкретной категории со всеми подкатегориями

// Кратность пачке
function wc_сonditions_multiplicity() {
	
$args = array(
	'child_of'           => 6, //категория ламинат
	'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)) {
  echo '<p class="multiplicity">Ламинат продается кратно упаковке.</p>';
}
	
}
add_filter( 'woocommerce_single_product_summary', 'wc_сonditions_multiplicity', 6 );

Несколько child_of категорий

В поиске как это сделать..

Функция с условием

Применяем функцию к подкатегориям определенной категории. В данном примере к товарам категории (с id 799) к цене добавиться «от …»

function bd_rrp_price_html( $price, $product ) {

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

if($cur_term[0]->term_id == 799) {
  $price = 'от ' . $price;
  return $price;
}

return $price;
  
}
add_filter( 'woocommerce_get_price_html', 'bd_rrp_price_html', 10, 2 );

Условие для нескольких категорий (+ доработан стиль вывода woocommerce):

function bd_rrp_price_html( $price, $product ) {

$os = array('1011','939','940','941','942','943','979','945','946');

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

if (in_array($cur_term[0]->term_id, $os)) {
  $price = '<span class="woocommerce-Price-amount amount"><span class="amount rubl">от </span></span>' . $price;
  return $price;
}

return $price;
}
add_filter( 'woocommerce_get_price_html', 'bd_rrp_price_html', 10, 2 );
Условие if (in_array($cur_term[0]->term_id, $os)) — если первый элемент равен второму (из массива) то. Если в конце через запятую добавить true — будет чувствителен к регистру

Еще один способ выборки по нескольким категориям (но более длинный):

// Кратность Сайдинг и фасадная доска
function wc_сonditions_multiplicity_saiding() {
	
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
		array(
		'taxonomy' => 'product_cat',
		'field' => 'id',
		'terms' => array(504, 505, 509, 508, 517, 515, 516, 513, 514, 512, 202, 203, 204)
		)
					)
);
$list_products = get_posts( $args );

foreach($list_products as $list_product) $list_ids[] = $list_product->ID;

global $product;

if (in_array($product->id, $list_ids)) {
  echo '<p class="multiplicity">Товар продается кратно упаковке.</p>';
}
	
}
add_filter( 'woocommerce_single_product_summary', 'wc_сonditions_multiplicity_saiding', 6 );

Стиль надписи про кратность упаковки:

p.multiplicity {
    margin-bottom: 15px;
    border: 2px solid #db5757;
    color: #db5757;
    font-weight: 600;
    text-align: center;
    padding: 12px;
    transform: rotate(-2deg);
}

Action внутри Action

Еще один пример функции зависящей от категории товара:

function chanes_archive_description( $product ) {

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

if ($cur_term[0]->term_id != 1018) {
	
remove_action( 'woocommerce_archive_description', 'woocommerce_taxonomy_archive_description', 10 );
add_action( 'woocommerce_after_shop_loop', 'woocommerce_taxonomy_archive_description', 100 );

}
  
}
add_action( 'body-after', 'chanes_archive_description', 10, 2 );

Мы проверяем если категория товара не 1018, то меняем местами товары и описание категории, если это категория 1018, то описание будет выше товаров. Функцию привязываем к любому доступному action (я создал пользовательский action после открывающего тэга body).

Цикл внутри функции

Создаем цикл записей непосредственно в функции

// Выводим Авторские изделия под Похожими товарами

function add_autor_product() {

$args = array(
  'posts_per_page' => 3,
  'cat' => 52
);
	
echo '<h3>Авторские изделия</h3>';
echo '<div id="posts-archive">';
	
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post);
	
	
echo '<div class="hentry" id="post-'.$post->ID.'">';

$thumb = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'has_post_thumbnail' );
$url = $thumb['0'];	

remove_filter( 'the_content', 'wpautop' );	
	
echo '<a href="'.$url.'">';
	
$thumb = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'rectangle' );
$url = $thumb['0'];
	
echo '<img src="'.$url.'" title="';
	the_content();
echo '">';
	
echo '</a>';
 
echo '<h3 class="post-title">';
	the_title();
echo '</h3>';
 	
echo '</div>';
	
endforeach;
	
echo '</div>';
	
wp_reset_postdata();

}; 

add_action( 'tab_woocommerce_related_products', 'add_autor_product', 25 );

В данной функции есть и другие интересные особенности:

  • the_content(); и the_title(); нужно выводить без echo
  • локальное отключение фильтра wpautop перед выводом the_content(); — remove_filter( ‘the_content’, ‘wpautop’ );
  • двойной вывод wp_get_attachment_image_src и перезапись переменной $thumb (сначала полное изображение, потом миниатюра)

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Модификация Woocommerce

Модификация Woocommerce

Продолжаем серию модификаций модуля интернет коммерции Woocommerce. Скрыть колонки редактирования товаров add_filter( 'manage_edit-product_columns', 'change_columns_filter',10, 1 ); function change_columns_filter( $columns ) { unset($columns['product_tag']); unset($columns['sku']); unset($columns['featured']); return $columns; } Тоже самое можно Читать далее »

/ /
Новинка (товар NEW полем)

Новинка (товар NEW полем)

Ранее были рассмотрены варианты добавления лэйбла New полуавтоматическим способом (последние созданные товары, либо по времени от текущего), либо назначением метки NEW. Здесь разберем как сделать данный функционал полем и какие Читать далее »

/
Купон на следующий заказ

Купон на следующий заказ

Проработаем функционал по отправке купона на следующий заказ. Дополнительные условия: Купон должен отправлять только при наличии в текущем заказе товара из определенной категории Номинал купона либо 30% если сумма следующей Читать далее »

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

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

Функция действующая на конкретный раздел
Gutenberg
Рекомендации для васGutenbergOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.