简体   繁体   English

通过下一个/上一个链接浏览页面兄弟

[英]Browsing page siblings through next/previous links

I'm using WordPress as CMS for a site I'm developing. 我正在使用WordPress作为我正在开发的网站的CMS。 When I'm browsing posts, I can use Next/Previous links to walk between posts. 当我浏览帖子时,我可以使用下一个/上一个链接在帖子之间走动。 I want to have the same thing on pages. 我想在页面上有相同的东西。

  • Page A 页面A.
  • Page B 第B页
  • Page C 第C页

Page A should link to next sibling Page B. Page B should link to previous sibling Page A and next sibling Page C. Page C should link to previous sibling Page B. 页面A应链接到下一个兄弟页面B.页面B应链接到上一个兄弟页面A和下一个兄弟页面C.页面C应链接到上一个兄弟页面B.

Is there any plugin you can recommend that generates these links? 是否有任何可以推荐的插件可以生成这些链接? I know there are some plugins that do this, but I specifically want one that hooks into my current theme automatically. 我知道有一些插件可以做到这一点,但我特别想要一个自动挂钩到我当前主题的插件。 I know how to edit the theme, but that would brick my site whenever a theme update is available. 我知道如何编辑主题,但只要主题更新可用,就会阻止我的网站。

I'm using the LightWord WordPress theme. 我正在使用LightWord WordPress主题。

Pop the following code into your functions.php file in your active theme directory: 将以下代码弹出到活动主题目录中的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; }
}

To call the function: 要调用该函数:

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

or 要么

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

and it will echo out the link to the previous or next page. 它将回显前一页或下一页的链接。

If you want both you can leave the function empty and it will return an array with both links. 如果你想要两个,你可以将函数留空,它将返回一个包含两个链接的数组。

from the wordpress Codex 来自wordpress Codex

<?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 -->

A rough snippet of what I developed onwards from the answers here (to get a real link and the post title in action) - might prove helpful to someone! 从我在这里得到的答案开始的粗略片段(获得真实的链接和行动中的帖子标题) - 可能对某人有帮助!

$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; }

Here another function based on jackreichert's answer. 这里的另一个功能基于jackreichert的答案。 With the added functionality that this wraps around to the last/first sibling when you are at the end of the list of siblings, so you can loop around endlessly. 当你位于兄弟姐妹列表的末尾时,它会附加到最后/第一个兄弟的附加功能,所以你可以无休止地循环。 It also uses the menu order. 它还使用菜单顺序。

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; 
    }
}

After trying several solutions, doing my best not to install another plugin, in the end the only thing that worked was a free plugin: Next Page, Not Next Post . 在尝试了几个解决方案之后,尽量不安装另一个插件,最终唯一有效的是免费插件: 下一页,不是下一篇文章

(I had issues with the solutions given here, I think perhaps because I manually order the pages in the Pages section of Wordpress Admin. You can select page order manually. So my first page in the hierarchy might have an ID of 100, and the second page might have an ID of 10. The page ID is not how my pages get ordered.) (我在这里给出的解决方案存在问题,我想也许是因为我在Wordpress Admin的Pages部分手动订购页面。你可以手动选择页面顺序。所以层次结构中的第一页可能有100的ID,并且第二页的ID可能为10.页面ID不是我的页面订购方式。)

 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;

    }

and then use as this: 然后使用如下:

    <?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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM