Сортировка категорий частая задача при формировании каталога. Разберемся в тонкостях данного явления.
Сортировка категорий WP
Сортировка категорий на wordpress реализована не очень детально. Сходу категории сортируются по алфавиту, но бывает нужно отсортировать их в произвольном порядке.
Для этих целей подходит плагин Category Order.
После установки в меню Записи появляется раздел с функционалом сортировки категорий, нужно расставить категории как следует. В коде менять ничего не надо.
Если у настраиваемых категорий есть дочерние, то они могут тоже начать выводиться. Для этого в шаблоне вывода категорий
<?php $current_cat = get_query_var('cat');
global $ancestor;
$childcats = get_categories('child_of='.$current_cat.'&hide_empty=0');
foreach ($childcats as $childcat) : ?>
надо заменить child_of на parent.
Category Order and Taxonomy Terms Order
Еще один замечательный плагин для пользовательской сортировки категорий — Category Order and Taxonomy Terms Order (300 000). Также этим плагином можно назначать порядок терминов таксономии.
Одним недостатком является, то, что в автоматическом режиме начинает сортировать все термины, где это и не требуется. Чтобы этого избежать, нужно отключить в настройках автоматическую сортировку и где необходимо прописывать вручную, примеры:
$childcats = get_categories('child_of=3&hide_empty=1&orderby=term_order');
или
$argv = array( 'orderby' => 'term_order' );
get_terms('category', $argv);
Custom Taxonomy Order (40 000)
Еще один отличный плагин. Особенностью является то что он сортирует все имеющиеся таксономии (категории, метки, пользовательские). Категории сортирует по отдельности, можно назначить порядок у родительских, а потом в любой из дочерних категорий. Это удобно если категорий много.
Сортировку, например в метках, нужно прописывать так: ‘orderby’ => ‘term_order’
Сортировка категорий и товаров WC
В woocommerce произвольная сортировка уже реализована. Для изменения порядка категорий достаточно перетащить категорию в нужную позицию. Если категорий много нужно включить отображение бОльшего количества категорий на страницу (сверху справа — Настройки экрана).
Таким же образом можно сортировать и товары WC. В настройках WC (Товары/Отображение/) исходная сортировка товаров должна быть Сортировка по умолчанию (произвольный порядок + имя). В архиве товаров сверху слева нажимаем кнопку Сортировка, с этого момента товары можно перетягивать. Произвольной сортировки без перетягивания можно добиться заполнением у товара поля Порядок (в самом товаре или при быстром редактировании).
Скрываем дочерние категории
Если на сайте заведено множество категорий и подкатегорий, то их уже не удобно сортировать, перетаскивая через множество дочерних категорий. На сайте wp-kama есть отличное решение, создающее в категориях переключатель — Показывать все уровни/Только родители.
// Переключатель уровня категорий в админке
$taxonomy = 'product_cat';
add_action( "{$taxonomy}_add_form", function($taxonomy){
ob_start();
} );
add_action( "after-{$taxonomy}-table", function($taxonomy){
$html = ob_get_clean();
$__preg_replace_callback = function( $match ){
$val = @ $_GET['parent_only'];
ob_start();
?>
<div class="alignleft actions">
<select name="parent_only" onchange="window.add_param_to_URL(this)">
<option value="">Все уровни...</option>
<option value="yes" <?php selected('yes', $val) ?> >Только родители</option>
</select>
</div>
<script>
window.add_param_to_URL = function(el){
var href = window.location.href, sep = /[?]/.test(href) ? "&" : "?", name = el.name.replace(/[^a-z_-]/i,'');
window.location = (new RegExp(name+'=?')).test(href) ? href.replace( (new RegExp('([?&]'+name+'=?)[^&]*')), (el.value ? "$1"+ el.value : '') ) : (href + sep + name + "="+ el.value);
}
</script>
<?php
return $match[1] . ob_get_clean();
};
echo preg_replace_callback('~(id="doaction[^<]+</div>)~', $__preg_replace_callback, $html );
} );
add_filter('get_terms_args', 'my_terms_filter_handler');
function my_terms_filter_handler( $query ){
if( empty($_GET['parent_only']) || ! is_admin() ) return $query;
if( ! ( $query['fields'] == 'count' || isset($query['page']) ) )
return $query;
$query['parent'] = 0; // только родители
return $query;
}
[site-socialshare]
Форма комментариев выглядит просто нелепо, слишком широко. Спец херовый