Запрос menu_order для произвольных типов записей

22 июн. 2011 г., 20:38:19
Просмотры: 44.3K
Голосов: 7

Я добавил '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 ));
?>
4
Комментарии

Уточните, что значит не упорядочиваются правильно? Как они сортируются в этом случае?

Rarst Rarst
23 июн. 2011 г. 00:18:40

Такое ощущение, что запрос не может найти 'menu_order' для пользовательских записей. В текущем состоянии запрос игнорирует этот аргумент.

cnotethegr8 cnotethegr8
23 июн. 2011 г. 01:15:45

Это запрос для нескольких типов записей? Если сделать такой же запрос для стандартных страниц, применяется ли menu_order?

Rarst Rarst
23 июн. 2011 г. 01:18:32

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

cnotethegr8 cnotethegr8
23 июн. 2011 г. 01:28:08
Все ответы на вопрос 3
4
16

Мне тоже пришлось решать аналогичную задачу, вот что я сделал, чтобы всё заработало:

'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. Поэтому любые записи без установленного порядка будут отображаться первыми.

25 июл. 2011 г. 19:48:17
Комментарии

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

cnotethegr8 cnotethegr8
25 июл. 2011 г. 23:09:43

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

jessica jessica
25 июл. 2012 г. 02:17:48

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

acorncom acorncom
22 авг. 2012 г. 19:12:24

Могу подтвердить - март 2018, всё ещё не работает без части 'order' => 'ASC', а также без условия orderby. Странно, но вот так вот.

Eric Eric
22 мар. 2018 г. 16:01:08
0

В моем файле 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();

Это то, что сработало у меня. Пока

24 окт. 2012 г. 16:16:04
0

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;
22 мая 2013 г. 17:56:55