Рекомендую хостингПеренос сайтов и месяц на тестирование - бесплатно!

Как вывести категории и подкатегории товаров wp woocommerce

393

Вывести категории и подкатегории товаров woocommerce wordpress можно несколькими способами: функцией wp_list_categories или через цикл.

Вывод с помощью функции wp_list_categories()

$args = array(
'orderby' => 'name', //сортировка по имени категории. Возможна сортировка по id, slug, description count — по количеству записей в категории term_group;
'order' => 'ASC',// сортировка
'style' => 'list', // стиль списка. list - вывод ul списком. none - вывод строкой
'show_count' => 1, //показывать (1) или нет (0) количество записей в категории
'hide_empty' => 1, // скрывать пустые категории
'child_of' => 0, // id категории, родительские категории которой нужно показывать. 0 - показ для всех категорий
'exclude' => '', // исключить категории (id категорий через запятую)
'include' => '', // вывести только указанные категории
'hierarchical' => true, // показывать категории как дерево (true). 0 - показывать сплошным списком
'title_li' => __( 'Categories' ), // заголовок списка. 0 - не отображать
'number' => NULL, // максимальное количество отображаемых категорий
'separator' => '--', // разделитель категорий (точка, зааятая и пр). По умолчанию <br />. Работает только при выводе строкой: 'style' => 'none'
'echo' => 1, // выодить на экран или нет. По умолчанию 1 (выводить)
'depth' => 0, // глубина вложенностии подкатегорий. 0 по умолчанию.
'pad_counts' => 0, // подсчет общего количества постов во вложенных категориях и показ этого числа. 0 по умолчанию
'feed' => 0, //Показ рядом с категорией ссылки на RSS фид
'taxonomy' => 'product_cat', // таксономия. Для вывода кастомной таксономии здесь указывается ее название
'walker' => new CustomWalker(), // расширение класса, которое позволяет вносить изменения в список категорий
);
wp_list_categories($args);

Оrderby - сортировка списка. Сортировать можно по id категории, name — по названию, slug — ярлыку, count — по количеству записей в категории, term_group — по группе.

Order - порядок сортировки
ASC - от меньшего к большему;
DESC - от большего к меньшему.

Style - стиль отображения категорий. list - вывод списком <ul>. none - вывод только ссылок на категории

Show_count - показывать (1) или нет (0) количество записей в категории

Hide_empty - скрывать (1) или нет (0) пустые категории

child_of - id категории, родительские категории которой нужно показывать. 0 - показ для всех категорий

exclude - исключить категории (id категорий через запятую)

include - вывести только указанные категории

hierarchical - показывать категории как дерево (true). 0 - показывать сплошным списком

taxonomy - таксономия. Для товаров woocommerce таксономия - product_cat. Для постов - category

Вывести основные категории товаров woocommerce циклом (без подкатегорий)

<?php
$args = array(
'taxonomy' => 'product_cat',
'orderby' => 'name',
'show_count' => 1,
'hide_empty' => true,
'parent' => 0
);
$product_categories = get_terms($args);
foreach ($product_categories as $product_category) {
$thumbnail_id = get_term_meta($product_category->term_id, "thumbnail_id", true); // id обложки категории
?>
<img src="<?php echo wp_get_attachment_url($thumbnail_id); ?>"> // обложка
<a href="<?php echo get_term_link($product_category) ?>"><?php echo $product_category->name;?></a><?php echo $product_category->count; ?> // счетчик товаров
<?php } ?>

Вывести все категории woocommerce вместе с подкатегориями

Чтобы вывести все категории woocommerce вместе с подкатегориями, нужно убрать из массива $args параметр 'parent' => 0

<?php
$args = array(
'taxonomy' => 'product_cat',
'orderby' => 'name',
'show_count' => 1,
'hide_empty' => true,
);
$product_categories = get_terms($args);
foreach ($product_categories as $product_category) {
$thumbnail_id = get_term_meta($product_category->term_id, "thumbnail_id", true); // id обложки категории
?>
<img src="<?php echo wp_get_attachment_url($thumbnail_id); ?>"> // обложка
<a href="<?php echo get_term_link($product_category) ?>"><?php echo $product_category->name;?></a><?php echo $product_category->count; ?> // счетчик товаров
<?php } ?>

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

<?php
$args = array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'parent' => 0
);
$product_cat = get_terms( $args );
foreach ($product_cat as $parent_product_cat) {
echo '<ul>
<li><a href="'.get_term_link($parent_product_cat->term_id).'">'.$parent_product_cat->name.'</a>
<ul>';
$child_args = array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'parent' => $parent_product_cat->term_id
); $child_product_cats = get_terms( $child_args );
foreach ($child_product_cats as $child_product_cat) {
echo '<li><a href="'.get_term_link($child_product_cat->term_id).'">'.$child_product_cat->name.'</a></li>';
}
echo '</ul>';
echo '</li>';
echo '</ul>';
}
?>

Сортировка категорий по мета полю

Если нужно сделать нестандартную сортировку категорий, то можно добавить категориям произвольное мета поле и сделать сортировку по нему.

Для добавления кастомного мета поля категории woocommerce можно воспользоваться плагином ACF (Advanced Custom Fields) или добавить его через код файла functions.php вашей темы:

// добавить код в конец functions.php
function product_taxonomy_add_sort_meta_field() {
?>
// добавление мета поля
<div class="form-field">
<label for="term_meta[sort_meta]">Сортировка</label>
<input type="text" name="term_meta[sort_meta]" id="term_meta[sort_meta]" value="">
<p class="description">Поле для сортировки категорий</p>
</div>
<?php
}
add_action( 'product_cat_add_form_fields', 'product_taxonomy_add_sort_meta_field', 10, 2 );
// добавление мета поля в форму редактирования категории
function custom_product_taxonomy_edit_meta_field($term) {
$t_id = $term->term_id;
$term_meta = get_option( "taxonomy_$t_id" ); ?>
<tr class="form-field">
<th scope="row" valign="top"><label for="term_meta[sort_meta]">Сортировка</label></th> <td>
<input type="text" name="term_meta[sort_meta]" id="term_meta[sort_meta]" value="<?php echo esc_attr( $term_meta['sort_meta'] ) ? esc_attr( $term_meta['sort_meta'] ) : ''; ?>">
<p class="description">Поле для сортировки категорий</p>
</td>
</tr>
<?php
} add_action( 'product_cat_edit_form_fields', 'custom_product_taxonomy_edit_meta_field', 10, 2 );
// сохранение значения мета поля
function save_taxonomy_custom_meta( $term_id ) {
if ( isset( $_POST['term_meta'] ) ) {
$t_id = $term_id;
$term_meta = get_option( "taxonomy_$t_id" );
$cat_keys = array_keys( $_POST['term_meta'] );
foreach ( $cat_keys as $key ) {
if ( isset ( $_POST['term_meta'][$key] ) ) {
$term_meta[$key] = $_POST['term_meta'][$key];
}
}
update_option( "taxonomy_$t_id", $term_meta );
}
}
add_action( 'edited_product_cat', 'save_taxonomy_custom_meta', 10, 2 );
add_action( 'create_product_cat', 'save_taxonomy_custom_meta', 10, 2 );

После этого у категорий появится новое поле (sort_meta) и категории можно отсортировать по его значению

<?php
$args = array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'parent' => 0,
'orderby' => 'meta_value', // сортировка по значению мета поля
'meta_key' => 'sort_meta', // название мета поля. Для примера sort_meta
'order' => 'ASC' // сортировка по возрастанию
);
$product_cat = get_terms( $args );
foreach ($product_cat as $parent_product_cat) {
echo '<ul>
<li><a href="'.get_term_link($parent_product_cat->term_id).'">'.$parent_product_cat->name.'</a>
<ul>';
$child_args = array(
'taxonomy' => 'product_cat',
'hide_empty' => false,
'parent' => $parent_product_cat->term_id
); $child_product_cats = get_terms( $child_args );
foreach ($child_product_cats as $child_product_cat) {
echo '<li><a href="'.get_term_link($child_product_cat->term_id).'">'.$child_product_cat->name.'</a></li>';
}
echo '</ul>';
echo '</li>';
echo '</ul>';
}
?>

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

Ваш адрес email не будет опубликован.

*
code