Просмотр страниц братьев и сестер по следующим / предыдущим ссылкам - PullRequest
8 голосов
/ 26 декабря 2010

Я использую WordPress в качестве CMS для сайта, который я разрабатываю.Когда я просматриваю сообщения, я могу использовать ссылки Next / Previous для перехода между сообщениями.Я хочу, чтобы на страницах было то же самое.

  • Страница A
  • Страница B
  • Страница C

Страница A должна содержать ссылкуна следующую братскую страницу B. Страница B должна ссылаться на предыдущую братскую страницу A и следующую братскую страницу C. Страница C должна ссылаться на предыдущую братскую страницу B.

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

Я использую LightWord WordPress theme.

Ответы [ 6 ]

18 голосов
/ 27 декабря 2010

Вставьте следующий код в файл functions.php в каталоге вашей активной темы:

function siblings($link) {
    global $post;
    $siblings = get_pages('child_of='.$post->post_parent.'&parent='.$post->post_parent);
    foreach ($siblings as $key=>$sibling){
        if ($post->ID == $sibling->ID){
            $ID = $key;
        }
    }
    $closest = array('before'=>get_permalink($siblings[$ID-1]->ID),'after'=>get_permalink($siblings[$ID+1]->ID));

    if ($link == 'before' || $link == 'after') { echo $closest[$link]; } else { return $closest; }
}

Для вызова функции:

<?php siblings('before'); ?>

или

<?php siblings('after'); ?>

, и он выведет ссылку на предыдущую или следующую страницу.

Если вы хотите обе, вы можете оставить функцию пустой и она вернет массив с обеими ссылками.

7 голосов
/ 25 мая 2015

от слова Кодекс

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

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

<div class="navigation">
<?php if (!empty($prevID)) { ?>
<div class="alignleft">
<a href="<?php echo get_permalink($prevID); ?>"
title="<?php echo get_the_title($prevID); ?>">Previous</a>
</div>
<?php }
if (!empty($nextID)) { ?>
<div class="alignright">
<a href="<?php echo get_permalink($nextID); ?>" 
 title="<?php echo get_the_title($nextID); ?>">Next</a>
 </div>
 <?php } ?>
</div><!-- .navigation -->
2 голосов
/ 31 января 2018

Здесь другая функция, основанная на ответе Джекрейхерта.С добавленной функциональностью, которая распространяется на последнего / первого родного брата, когда вы находитесь в конце списка родных братьев и сестер, так что вы можете перемещаться бесконечно.Также используется порядок меню.

function get_sibling_link($link) {
    global $post;

    $siblings = get_pages('sort_column=menu_order&child_of='.$post->post_parent.'&parent='.$post->post_parent);

    foreach ($siblings as $key => $sibling){
        if ($post->ID == $sibling->ID){
            $current_id = $key;
        }
    }

    $closest = [ 
        'before' => get_permalink( $siblings[$current_id-1]->ID ),
        'after'  => get_permalink( $siblings[$current_id+1]->ID )
    ];

    if($siblings[$current_id-1]->ID == '' ){
        $closest['before'] = get_permalink( $siblings[count($siblings)-1]->ID );
    }

    if($siblings[$current_id+1]->ID == '' ){
        $closest['after'] = get_permalink( $siblings[0]->ID );
    }

    if ($link == 'before' || $link == 'after') { 
        echo $closest[$link]; 
    } else { 
        return $closest; 
    }
}
2 голосов
/ 16 октября 2013

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

$closest = array('before'=>get_permalink($siblings[$ID-1]->ID),'after'=>get_permalink($siblings[$ID+1]->ID));
$name =  array('before'=>get_the_title($siblings[$ID-1]->ID),'after'=>get_the_title($siblings[$ID+1]->ID));

if ($link == 'before' || $link == 'after') { 
echo '<a href="' . $closest[$link] . '">';
echo '<span>' . $name[$link] . '</span></a>';
}
else { return $closest; }
1 голос
/ 14 апреля 2015

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

(У меня были проблемы с решениями, приведенными здесь, я думаю, возможно, потому что я вручную заказываю страниц в разделе Страницы Wordpress Admin. Вы можете выбрать порядок страниц вручную. Моя первая страница в иерархии может иметь идентификатор 100, а вторая страница может иметь идентификатор 10. Идентификатор страницы не так, как мои страницы упорядочены.)

0 голосов
/ 26 апреля 2013
 function siblings()
    {
        global $post;
        $args = array(
                        'sort_order'    => 'ASC',
                        'sort_column'   => 'menu_order',
                        'hierarchical'  => 1,
                        'child_of'      => $post->post_parent,
                        'parent'        => $post->post_parent,
                        'exclude_tree'  => '',
                        'offset'        => -1,
                        'post_type'     => 'page',
                        'post_status'   => 'publish'
            );
        $siblings = get_pages($args);

        foreach ($siblings as $key=>$sibling)
        {
            if ($post->ID == $sibling->ID)
            {
                $ID = $key;
            }
        }
        $closest = array(
                            'back'  => array('perm_link' => get_permalink(isset($siblings[$ID -1]->ID) ?  $siblings[$ID -1]->ID : $siblings[$ID]->ID), 'title' => get_the_title(isset($siblings[$ID -1]->ID) ?  $siblings[$ID -1]->ID : $siblings[$ID]->ID)),
                            'next'  => array('perm_link' => get_permalink(isset($siblings[$ID +1]->ID) ?  $siblings[$ID +1]->ID : $siblings[$ID]->ID) , 'title' => get_the_title(isset($siblings[$ID +1]->ID) ?  $siblings[$ID +1]->ID : $siblings[$ID]->ID))
                        );

        return $closest;

    }

и затем используйте как это:

    <?php
$newrenderViews = new renderViews() ;
$back_next      = $newrenderViews->siblings();
$next           = $back_next['next'] ;
$next_title     = $next['title'] ;
$next_link      = $next['perm_link'] ;
$back           = $back_next['back'] ;
$back_title     = $back['title'] ;
$back_link      = $back['perm_link'] ;
?>

<div  class="section" >
    <div class="content_wrapper " style="background-color: #8A8C8F; width: 970px;">
    <p class="navbar-text pull-right">
        <a href="<? echo $next_link; ?>" class="navbar-link" style="color: #ffffff;">Next - <?php echo $next_title ;  ?></a>
    </p>
    <p class="navbar-text pull-left">
        <a href="<? echo $back_link; ?>" class="navbar-link" style="color: #ffffff;margin-left: 340px;">Go back - <?php  echo $back_title ;   ?></a>
    </p>
</div>
</div>
...