Динамическая навигация для пользовательских типов записей (страниц)


У меня есть набор пользовательских типов записей с аргументом capability_type, равным 'page'

Я хочу включить их в wp_list_pages() или аналогичные, чтобы я мог использовать динамические классы (такие как .current_page_item и тому подобное).

Я прочитал этот пост , но я не уверен, что это именно то, что я ищу, может ли кто-нибудь помочь мне с примером кода/более подробным объяснением.

Author: Community, 2010-10-24

2 answers

Функция wp_list_pages() вызывает функцию get_pages(), которую нелегко переопределить другим типом записи. Вот базовая модификация этой функции, которая вместо этого вызывает get_posts(). Это принимает в основном те же аргументы, что и wp_list_pages, с одним дополнительным: *post_type* (устанавливается в качестве имени вашего типа записи).

function wp_list_post_types( $args ) {
    $defaults = array(
        'numberposts'  => -1,
        'offset'       => 0,
        'orderby'      => 'menu_order, post_title',
        'order'      => 'ASC',
        'post_type'    => 'page',
        'depth'        => 0,
        'show_date'    => '',
        'date_format'  => get_option('date_format'),
        'child_of'     => 0,
        'exclude'      => '',
            'include'      => '',
        'title_li'     => __('Pages'),
        'echo'         => 1,
        'link_before'  => '',
        'link_after'   => '',
        'exclude_tree' => '' );

    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );

    $output = '';
    $current_page = 0;

    // sanitize, mostly to keep spaces out
    $r['exclude'] = preg_replace('/[^0-9,]/', '', $r['exclude']);

    // Allow plugins to filter an array of excluded pages (but don't put a nullstring into the array)
    $exclude_array = ( $r['exclude'] ) ? explode(',', $r['exclude']) : array();
    $r['exclude'] = implode( ',', apply_filters('wp_list_post_types_excludes', $exclude_array) );

    // Query pages.
    $r['hierarchical'] = 0;
    $pages = get_posts($r);

    if ( !empty($pages) ) {
        if ( $r['title_li'] )
            $output .= '<li class="pagenav">' . $r['title_li'] . '<ul>';

        global $wp_query;
        if ( ($r['post_type'] == get_query_var('post_type')) || is_attachment() )
            $current_page = $wp_query->get_queried_object_id();
        $output .= walk_page_tree($pages, $r['depth'], $current_page, $r);

        if ( $r['title_li'] )
            $output .= '</ul></li>';
    }

    $output = apply_filters('wp_list_pages', $output, $r);

    if ( $r['echo'] )
        echo $output;
    else
        return $output;
}

Примечание: в основном он скопирован из исходного кода. Там, конечно, осталось несколько аргументов, которые ничего не делают, и вполне могут быть некоторые варианты использования, которых у меня нет мысль об этом сломала бы его. Удивительно, но это работает как с иерархическими, так и с неиерархическими типами сообщений, хотя...

 9
Author: goldenapples, 2012-02-16 16:48:16

@золотые яблоки: Отличный пост! Я искал это и попал сюда. Одна вещь, которую я заметил, - это то, что orderby работал неправильно, и исправил это, добавив следующую строку к аргументам по умолчанию:

'order' => 'ASC',

Спасибо, Камило

 2
Author: Camilo Delvasto, 2011-12-01 19:13:17