Запрос menu_order для произвольных типов записей
Я добавил 'supports' => 'page-attributes'
в мой произвольный тип записи, и теперь у меня есть мета-бокс для сортировки страниц.
Когда я использую аргумент 'sort_column' => 'menu_order'
с get_pages()
для моего произвольного типа записи, все сортируется правильно.
Почему же произвольные страницы не сортируются правильно, когда я делаю запрос с помощью query_posts(array('orderby' => 'menu_order'))
И что можно сделать, чтобы отсортировать их по menu_order?
Вот запрос, который я использую, если кто-то хочет посмотреть.
<?php
// Получаем текущий раздел или берем первый из массива меню
$current_term = ($wp_query->query_vars['section'] <> '') ? $wp_query->query_vars['section'] : $menu_arr[0];
query_posts(array( 'post_type' => 'module',
'orderby' => 'menu_order',
'tax_query' => array(array( 'taxonomy' => 'section',
'field' => 'slug',
'terms' => $current_term )),
'post_parent' => 0 ));
?>

Мне тоже пришлось решать аналогичную задачу, вот что я сделал, чтобы всё заработало:
'supports' => array('title', 'editor', 'thumbnail', 'page-attributes')
Зарегистрируйте тип записи с поддержкой page-attributes. Это добавит метабокс порядка меню на экран редактирования. Там вы сможете установить порядок.
Затем выполните мой пользовательский запрос:
$args = array(
'numberposts' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
'post_type' => 'staff'
);
$staff = get_posts($args);
Установите orderby
в menu_order и order
в ASC. Помните, если вы не зададите значение в menu_order, по умолчанию будет использоваться 0. Поэтому любые записи без установленного порядка будут отображаться первыми.

Спасибо, я уже давно решил эту проблему. Но я ценю вашу помощь! ;)

Если кто-то еще ломает голову над этим - для работоспособности необходим параметр 'order'. Я установил 'order_by' => 'menu_order'
, но это не работало, пока я не добавил 'order' => 'ASC'

У меня были проблемы с get_posts
в WordPress 3.4.1. Заработало только после перехода на использование query_posts

В моем файле functions.php я использовал это:
add_action( 'init', 'create_Videos' );
function create_Videos() {
register_post_type('videos', array(
'label' => __('Видео', 'текстовый_домен'), // Метка для множественного числа
'singular_label' => __('Видео', 'текстовый_домен'), // Метка для единственного числа
'public' => true, // Доступно публично
'show_ui' => true, // Показывать интерфейс в админке
'capability_type' => 'article', // Тип прав
'hierarchical' => true, // Иерархический тип (как страницы)
'rewrite' => false, // Отключить ЧПУ
'query_var' => true, // Разрешить использование в запросах
'supports' => array('title', 'editor', 'page-attributes') // Поддерживаемые поля
));
}
А в моей теме это:
$args = array(
'numberposts' => -1, // Все записи
'orderby' => 'menu_order', // Сортировка по порядку меню
'order' => 'ASC', // По возрастанию
'post_type' => 'videos' // Тип записи - видео
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
Это то, что сработало у меня. Пока

sort_column=menu_order
сортирует страницы только на основе их порядка в режиме редактирования, а не порядка, который вы установили в Внешний вид > Меню
. Если вам нужна сортировка как в меню, можно сделать так:
$children = get_pages('child_of='. $topID);
// 'sort_column=menu_order' <-- сортирует только по порядку страниц в режиме редактирования (Страницы > Редактировать), а не по порядку в меню (Внешний вид > Меню)
// wp_nav_menu содержит нужную нам сортировку, давайте отсортируем таким же образом.
$options = array(
'container' => '',
'echo' => false,
);
$nav = wp_nav_menu($options);
$nav = strip_tags($nav);
$nav = str_replace("\r", '', $nav);
$nav = explode("\n", $nav);
//print_r($nav);
$newChildren = array();
foreach ($nav as $item) {
$item = trim($item);
$run = true;
for ($c = 0; $c < count($children) && $run; $c++) {
$child = $children[$c];
if (strcmp($child->post_title, $item) == 0 && !in_array($child, $newChildren)) {
$newChildren[] = $child;
$run = false;
}
}
// Добавляем дочерние элементы, отсутствующие в nav_menu (непонятно, почему не все подчиненные элементы
// добавляются к первому дочернему элементу здесь.. (работает, но непонятно почему :/)
if ($run == true) {
for ($c = 0; $c < count($children) && $run; $c++) {
$child = $children[$c];
if (!in_array($child, $newChildren)) {
$newChildren[] = $child;
}
}
}
}
$children = $newChildren;
