Динамическая навигация для пользовательских типов записей (страниц)
У меня есть набор пользовательских типов записей с аргументом capability_type
, равным 'page'
Я хочу включить их в wp_list_pages()
или аналогичные, чтобы я мог использовать динамические классы (такие как .current_page_item
и тому подобное).
Я прочитал этот пост , но я не уверен, что это именно то, что я ищу, может ли кто-нибудь помочь мне с примером кода/более подробным объяснением.
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;
}
Примечание: в основном он скопирован из исходного кода. Там, конечно, осталось несколько аргументов, которые ничего не делают, и вполне могут быть некоторые варианты использования, которых у меня нет мысль об этом сломала бы его. Удивительно, но это работает как с иерархическими, так и с неиерархическими типами сообщений, хотя...
@золотые яблоки: Отличный пост! Я искал это и попал сюда. Одна вещь, которую я заметил, - это то, что orderby работал неправильно, и исправил это, добавив следующую строку к аргументам по умолчанию:
'order' => 'ASC',
Спасибо, Камило