Как создать пользовательскую сортировку для категорий WordPress
У меня возникла следующая проблема. Я пытаюсь отсортировать мои категории так, чтобы они отображались в нужном мне порядке. Я изучил документацию WordPress по всем параметрам сортировки. Однако там нет указаний, как выбрать категории и заставить их отображаться в желаемом порядке.
Вот что предлагает Codex:
orderby (строка) Сортировка категорий по алфавиту или по уникальному ID категории. По умолчанию сортировка по ID категории. Допустимые значения:
- id
- name - по умолчанию
- slug
- count
- term_grouporder (строка) Порядок сортировки категорий (по возрастанию или убыванию). По умолчанию по возрастанию. Допустимые значения:
- asc - по умолчанию
- desc
Однако, как я уже сказал, это не помогает, потому что мне нужно, чтобы они отображались в том порядке, который я выберу.
Вот код, который я использую в данный момент. Он отображает категории в нужном мне порядке.
<?php
$args = array(
'orderby' => 'ID',
'order' => 'ASC',
'include' => '5,6,7,8,29,9,10,11,12,13,14,15,16'
);
$categories = get_categories($args);
foreach($categories as $category) {
echo '<li><a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "Просмотреть все записи в %s" ), $category->name ) . '" ' . '>' . $category->name . '</a>' . ' ' . '(' . $category->count . ')' . '</li> ';
}
?>

Если вы уже используете Advanced Custom Fields (а вы должны использовать!), вы можете создать поле порядка для ваших категорий, с помощью которого можно задать их порядок вручную в числовом виде.
Затем все, что вам нужно сделать:
$categories = get_categories( $args );
usort($categories, function($a, $b) {
return get_field("category_order", "category_".$a->term_id) - get_field("category_order", "category_".$b->term_id);
});
foreach ($categories as $category){
...
Где category_order
— это имя поля, которое вы создали с помощью ACF.
Примечание: Используется способ usort из PHP 5.3.

Отлично, я нашел плагин, который делает именно то, что мне нужно. Я не хотел использовать плагины, но этот оказался достаточно легковесным и идеально справился с задачей. http://wordpress.org/plugins/taxonomy-terms-order/

Исходный код будет работать, если изменить аргументы на: 'orderby' => 'include'
$args = array(
'orderby' => 'include', // Сортировка по порядку в параметре include
'order' => 'ASC', // Порядок сортировки - по возрастанию
'include' => '5,6,7,8,29,9,10,11,12,13,14,15,16' // ID включаемых категорий
);
$categories = get_categories($args);
foreach($categories as $category) {
echo '<li><a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "Просмотреть все записи в %s" ), $category->name ) . '" ' . '>' . $category->name . '</a>' . ' ' . '(' . $category->count . ')' . '</li> ';
}
