Я делаю боковую панель, которая будет отображать родственные страницы, если текущая страница является дочерним элементом самого глубокого уровня, и только дочерние страницы, если это не так. Насколько я понял, я не смог понять логику, чтобы завершить это. Любые идеи? Заранее спасибо.
global $post;
if ( is_page() && $post->post_parent )
$childpages = wp_list_pages( 'sort_column=menu_order&title_li=&child_of=' . $post->post_parent . '&echo=0' );
else
$childpages = wp_list_pages( 'sort_column=menu_order&title_li=&child_of=' . $post->ID . '&echo=0' );
if ( $childpages ) {
$interior_sidebar = '<ul class = "child-pages">' . $childpages . '</ul>';
}






Используйте wp_list_pages () со своими параметрами, чтобы получить дочерние элементы текущего сообщения. Если он возвращается пустым, отобразить wp_list_pages () родительского элемента текущего сообщения; если не пусто, отобразить то, что было возвращено.
Ты на правильном пути.
global $post небезопасно использовать (это может быть сообщение Кроме как страницы, которую вы просматриваете), особенно на боковой панели - я бы рекомендовал сделать что-то вроде get_queried_item ().
И для простоты, вместо того, чтобы вызывать wp_list_pages несколько раз, я бы рекомендовал настроить аргументы в каждом из условий, а затем иметь один вызов wp_list_pages в конце.
// safer method to get the page you are viewing
$post = get_queried_object();
// will be TRUE if there's any child pages, FALSE if not
$has_children = (0 != get_pages( [ 'child_of' => $post->ID ] ) );
// set to prevent notices
$child_pages = FALSE;
if ( is_page( $post->ID ) && $post->post_parent ) {
$args = [
'sort_column' => 'menu_order',
'title_li' => '',
'echo' => 0,
// this is a ternary operation, that assigns $post->ID if $has_children, or $post_parent if not
'child_of' => ( $has_children ) ? $post->ID : $post->post_parent
];
$childpages = wp_list_pages( $args );
}
if ( $childpages ) {
$interior_sidebar = '<ul class = "child-pages">' . $childpages . '</ul>';
}
ПРИМЕЧАНИЕ: я использовал сокращенную версию для объявлений массивов (например, [ 'child_of' => $post->ID ] вместо array( 'child_of' => $post->ID ) - это работает для версий PHP 5.4+ - если вы используете более старую версию PHP, обновите ее - она больше не поддерживается.
Приведенный выше код должен делать то, что вы просили. Какой список появляется, когда вы находитесь на самом глубоком уровне? (Когда вы говорите «самый глубокий уровень», вы имеете в виду, что детей больше нет, верно?). ОБРАТИТЕ ВНИМАНИЕ, что предоставленный вами код показывает ТОЛЬКО что-либо, если есть «родительские страницы» - поэтому, если вы хотите, чтобы это ТАКЖЕ для элементов навигации «верхнего уровня», вам нужно уточнить это, чтобы я мог настроить.
Решено с помощью:
function wpb_list_child_pages() {
global $post;
$childpages = wp_list_pages(array(
'child_of' => $post->ID,
'depth' => 1,
'echo' => '0',
'sort_column' => 'menu_order',
'title_li' => ''
));
if ( $childpages ) {
$string =$childpages;
} else {
$childpages = wp_list_pages(array(
'child_of' => $post->post_parent,
'depth' => 1,
'exclude' => $post->ID,
'title_li' => ''
));
$string = $childpages;
}
echo $string; }
Затем я просто вызвал функцию в своем шаблоне: <ul class = "child-pages"><?php wpb_list_child_pages(); ?></ul>
Спасибо! После изменения
get_queried_itemнаget_queried_objectэто работало для страниц, которые не являются дочерними элементами самого глубокого уровня. Тем не менее, мне все еще нужно показывать родственные страницы в списке на страницах, которые являются дочерними элементами самого глубокого уровня. Вы знаете, как этого добиться?