Предыдущая/Следующая дочерняя навигация для текущей страницы?

Как я могу получить Предыдущее / Следующая навигация, которая только перемещается по дочерним страницам текущей страницы?

Этим я имею в виду url.com/page/child1, url.com/page/child2 и так далее..

Я искал вокруг много, но я все еще потерян.

Кажется, что Вы не можете сделать этого согласно Wordpress (они рекомендуют плагины..)

3
07.06.2012, 03:31
6 ответов

Хорошо, здесь это, полностью рабочее:

<?php
$pagelist = get_pages("child_of=".$post->post_parent."&parent=".$post->post_parent."&sort_column=menu_order&sort_order=asc");
$pages = array();
foreach ($pagelist as $page) {
   $pages[] += $page->ID;
}

$current = array_search($post->ID, $pages);
$prevID = $pages[$current-1];
$nextID = $pages[$current+1];
?>

<div class="navigation">
<?php if (!empty($prevID)) { ?>
<div class="previous">
<a href="<?php echo get_permalink($prevID); ?>" title="<?php echo get_the_title($prevID); ?>">Previous</a>

</div>
<?php }
if (!empty($nextID)) { ?>
<div class="Next">
<a href="<?php echo get_permalink($nextID); ?>" title="<?php echo get_the_title($nextID); ?>">Next</a>
</div>
<?php } ?>
</div>

Одна небольшая косметическая вещь должна быть починена, и это - то, что "Предыдущие" и "Следующие" ссылки всегда нужно показывать, существуют ли больше страницы...

6
19.02.2020, 22:15

Вы могли использовать, находят родительскую страницу текущего сообщения, использующего пост-> parent_page, затем включают это в get_page_children, получая все одноуровневые элементы родительской страницы, и затем находят следующие и предыдущие элементы в массиве, который возвращается.

0
19.02.2020, 22:15

Если Вы открыты для хождения сменным путем, который я лично для такого рода вещи, сменный Ambrosite, Следующая Ссылка / Ссылка Предыдущей страницы Плюс являются довольно потрясающими. Это поддерживает функциональность, плюс которая Вы ищете, намного больше.

0
19.02.2020, 22:15

Непротестированный, но это должно работать:

Сначала используйте get_pages найти все другие страницы (или CPT) с тем же родителем как текущая страница. Затем найдите 'предыдущие' и 'следующие' страницы.

function wpse5422_the_page_siblings(){
    $post_id = get_the_ID();
    $parent_id = wp_get_post_parent_id($post_id);
    $post_type = get_post_type($post_id);

    $sibling_list = get_pages(array(
         'sort_column'=>'menu_order',
         'sort_order' =>'asc',
         'child_of' =>$parent_id,
         'post_type'=> $post_type
    ));

    if( !$sibling_list || is_wp_error($sibling_list) )
        return false;

    $pages = array();
    foreach ($sibling_list as $sibling ) {
         $pages[] = $sibling->ID;
     }

    $current = array_search($post_id, $pages);
    $prevID = isset($pages[$current-1]) ? $pages[$current-1] : false;
    $nextID = isset($pages[$current+1]) ? $pages[$current+1] : false;

    echo wpse5422_display_prev_next($prevID, $nextID);
 }

Вышеупомянутая функция должна использоваться в цикле - это берет текущую страницу (или любой иерархический тип сообщения) и находит предыдущую и следующую одноуровневую страницу (т.е. того же родителя как текущая страница) согласно их порядку меню (это может быть изменено до настоящего времени, или заголовок).

Это затем использует следующую функцию, которая берет два идентификатора в качестве аргумента и просто ответственна за создание вывода:

 function wpse5422_display_prev_next($prevID=false, $nextID=false){
    if( empty($prevID) && empty($nextID) )
       return false;

    $html = '<div class="navigation">';

    if( !empty($prevID) ){
         $html .= '<div class="alignleft">';
         $html .= '<a href="'.get_permalink($prevID).'">Previous</a>';
         $html .= '</div>';
     }

    if( !empty($nextID) ){
         $html .= '<div class="alignright">';
         $html .= '<a href="'.get_permalink($nextID).'">Next</a>';
         $html .= '</div>';
     }

    $html .= '</div><!-- .navigation -->';

    return $html;
}

Куда поместить этот код

Идеально необходимо создать плагин из него. Это будет работать в functions.php - но действительно, это не должно жить там.

Использование

В Цикле, хотите ли Вы отобразить ссылки страницы: wpse5422_the_page_siblings();.

0
19.02.2020, 22:15

Для показа следующих и предыдущих ссылок, независимых от того, присутствуют ли еще страницы, необходимо добавить некоторые условные операторы: (отредактированный бессмысленный материал elseif)

<div class="navigation">
<?php if (!empty($prevID)) : ?>
<div class="previous">
<a href="<?php echo get_permalink($prevID); ?>" 
title="<?php echo get_the_title($prevID); ?>">Previous</a>
</div>
<?php else : ?>
<div class="previous disabled">
<a href="#">Previous</a>
</div>
<?php endif; ?>
<?php if (!empty($nextID)) : ?>
<div class="next">
<a href="<?php echo get_permalink($nextID); ?>" 
title="<?php echo get_the_title($nextID); ?>">Next</a>
</div>
<?php else : ?>
<div class="next disabled">
<a href="#">Next</a>
</div>
<?php endif; ?>
</div>
0
19.02.2020, 22:15
  • 1
    Почему пустое else? Почему elseif вообще, если второе условие является полной противоположностью первого? Простой if / else конструкции сделали бы здесь. –  Johannes Pille 24.05.2013, 15:12
  • 2
    , который я согласовываю - извините о том - я разрабатывал его, когда я пошел сам и только действительно приехал сюда для предыдущего ответа на этой странице. Я послушал Ваш совет - спасибо. –  Chris 28.05.2013, 11:42

Большой взлом, это сделало то, что я искал. Я учил, что некоторые из Вас могли бы быть межотдохнувшими в том, что я добавил, это: альтернативные ссылки

  • к первой дочерней странице, когда Вы просматриваете родительскую страницу
  • к родителю, когда Вы просматриваете первую дочернюю страницу

военно-морское не отображено если не необходимое, моделирование соответствует тому двадцать, тринадцать тем применяются к навигации сообщения.

<?php // display nav only if there are child pages
if ($post->post_parent) { // applies only to child pages 
$pagelist = get_pages("child_of=".$post->post_parent."&parent=".$post->post_parent."&sort_column=menu_order&sort_order=asc");
$pages = array();
foreach ($pagelist as $page) {
$pages[] += $page->ID;
}
$current = array_search($post->ID, $pages);
$prevID = $pages[$current-1];
$nextID = $pages[$current+1];
?>

<nav class="navigation post-navigation" role="navigation">
<div class="nav-links">
    <?php if (!empty($prevID)) { /* if we are browsing first child, then link to parent page*/ ?>
        <a rel="prev" href="<?php echo get_permalink($prevID); ?>" title="<?php echo get_the_title($prevID); ?>"><span class="meta-nav">&larr;</span> <?php echo get_the_title($prevID); ?></a>
    <?php }
    else { // else, link to previous child ?>
        <a rel="prev" href="<?php echo get_permalink($post->post_parent); ?>"><span class="meta-nav">&larr;</span> <?php echo get_the_title($post->post_parent); ?></a>
    <?php }

    if (!empty($nextID)) { ?>
    <a rel="next" href="<?php echo get_permalink($nextID); ?>" title="<?php echo get_the_title($nextID); ?>"><?php echo get_the_title($nextID); ?> <span class="meta-nav">&rarr;</span></a>
    <?php } ?>
</div>
</nav>                      
                    <?php }
                    else { // if we are browsing parent page, then link to first child
$child_pages = get_pages("child_of=".$post->ID."&parent=".$post->ID."&sort_column=menu_order&sort_order=asc");
$first_child = $child_pages[0]; ?>
<?php if (!empty($first_child)) { ?>
<nav class="navigation post-navigation" role="navigation">
<div class="nav-links">
    <a rel="next" href="<?php echo get_permalink($first_child->ID); ?>"><?php echo get_the_title($first_child->ID); ?> <span class="meta-nav">&rarr;</span></a>

</div>

1
19.02.2020, 22:15

Теги

Похожие вопросы