【问题标题】:Browsing page siblings through next/previous links通过下一个/上一个链接浏览页面兄弟姐妹
【发布时间】:2011-05-30 19:46:24
【问题描述】:

我正在使用 WordPress 作为我正在开发的网站的 CMS。当我浏览帖子时,我可以使用 Next/Previous 链接在帖子之间走动。我想在页面上显示相同的内容。

  • A页
  • B 页
  • C页

页面 A 应该链接到下一个同级页面 B。页面 B 应该链接到前一个同级页面 A 和下一个同级页面 C。页面 C 应该链接到前一个同级页面 B。

您可以推荐任何生成这些链接的插件吗?我知道有some 插件可以做到这一点,但我特别想要一个自动挂钩到我当前主题的插件。我知道如何编辑主题,但只要有可用的主题更新,这就会使我的网站变砖。

我正在使用LightWord WordPress 主题。

【问题讨论】:

  • 兄弟页面由什么组成?同一个父母的孩子?基于日期?菜单顺序?
  • 同父异母的孩子,按菜单顺序决定。

标签: wordpress


【解决方案1】:

将以下代码弹出到您的活动主题目录中的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'); ?>

它会回显上一页或下一页的链接。

如果你想要两者,你可以将函数留空,它会返回一个包含两个链接的数组。

【讨论】:

  • LightWord 主题已经有了自己的functions.php,所以主题更新不会破坏这个功能吗?
  • 没问题,作为子主题放入即可codex.wordpress.org/Child_Themes
  • 步骤包括: 1)在主题目录中创建第二个目录,其中包含主题名称和'-child' 2)在其中创建一个名为 style.css 的文件,从父主题复制标题添加附加行“模板”。由于此文件将替换父样式文件,请确保导入内容 @import url("../LightWord/style.css"); 3)functions.php 不会替换其他函数文件,因此您可以在上面的代码中添加。在我上面的评论中发布的链接中有详细的解释。但是当您更新主题时,它不会影响此功能。
  • 我重写了这个函数以满足我的需要,它运行良好。我以前从未听说过儿童主题 - 很棒的提示!感谢您的帮助。
  • 这是伟大的jackreichert!我该如何更改它,以便如果它们不是下一页或上一页,则不返回任何内容?谢谢!
【解决方案2】:
 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>

【讨论】:

  • 这给了我一个错误:Fatal error: Class 'renderViews' not found
  • 哎呀我的错 renderViews() 应该是一个具有功能兄弟姐妹()的类...
【解决方案3】:

我从这里的答案开始的粗略 sn-p(以获得真正的链接和实际的帖子标题) - 可能对某人有帮助!

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

【讨论】:

    【解决方案4】:

    在尝试了几种解决方案后,尽我所能不安装另一个插件,最后唯一有效的是一个免费插件:Next Page, Not Next Post

    (我对此处给出的解决方案有疑问,我想可能是因为我手动排序 Wordpress Admin 的“页面”部分中的页面。您可以手动选择页面顺序。所以我的第一页在层次结构的 ID 可能为 100,第二个页面的 ID 可能为 10。页面 ID 不是我的页面的排序方式。)

    【讨论】:

      【解决方案5】:

      来自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 -->
      

      【讨论】:

      • 这很好用!一堆其他的解决方案都是基于帖子 ID,但是这个使用 menu_order 的解决方案正是我所需要的。谢谢!
      【解决方案6】:

      这里是另一个基于 jackreichert 回答的函数。当您位于兄弟姐妹列表的末尾时,它会环绕到最后一个/第一个兄弟姐妹的附加功能,因此您可以无休止地循环。它还使用菜单顺序。

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

      【讨论】:

      • 谢谢 - 这有助于开发我的解决方案 :)
      猜你喜欢
      • 2021-10-08
      • 2012-07-23
      • 2014-07-12
      • 1970-01-01
      • 2019-05-06
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多