web-dev-qa-db-ja.com

現在のページの前/次の子ナビゲーション

現在のページの子ページだけをナビゲートするPrevious/Nextナビゲーションを取得する方法を教えてください。

ということで、私はurl.com/page/ child1 、url.com/page/ child2 などと意味します。

私はたくさん探していましたが、まだ迷っています。

wordpress に従ってプラグインを実行できないようです(彼らはプラグインをお勧めします..)

3
Phife Dawz

大丈夫、ここでそれは完全に機能しています。

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

素晴らしいハック、それは私が探していたものでした。私が追加したものに逮捕されるかもしれないというあなた方の何人かを破壊しました。

  • 親ページを閲覧しているときは、最初の子ページに移動します。
  • 最初の子ページを閲覧しているときは親に

必要でないときにはナビゲーションは表示されず、スタイリングはポストナビゲーションに適用される23のテーマに適合する.

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

' wpse5422_the_page_siblings() 'ソリューションはうまく機能します。担当者が少なすぎるためコメントできませんが、唯一の変更は次の行を追加することです。

'sort_column'=>'menu_order',

これであること:

'sort_column'=>'menu_order title',

これにより、ユーザーが各ページのソート順を0のままにした場合、デフォルトでページタイトルのアルファベット順にソートされます。

ありがとうございます。

0
Purple Tentacle

Post-> parent_pageを使って現在の記事の親ページを見つけ、それを get_page_children にプラグインして、親ページのすべての兄弟を取得してから、返される配列の前後の要素を見つけることができます。

0
fdsa

私が個人的にこのようなことをしているのであれば、プラグインのルートを利用したいと思うなら、 Ambrosite Next/Previous Page Link Plus は非常に素晴らしいです。あなたが探している機能に加えて、もっとたくさんの機能をサポートしています。

0
Dave Romsey

テストされていませんが、これでうまくいくはずです。

現在のページと同じ親を持つ他のすべてのページ(またはCPT)を見つけるには、まずget_pagesを使用します。次に、「前の」ページと「次の」ページを見つけます。

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

上記の関数は、ループ内で使用する必要があります。現在のページ(または階層型の投稿タイプ)を取り、メニューの順序に従って前後の兄弟ページ(現在のページと同じ親ページ)を見つけます(これは次のように変更できます)。日付、またはタイトル)。

次に、引数として2つのIDを受け取り、単に出力を生成する責任がある次の関数を使用します。

 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
Stephen Harris

それ以上のページが存在するかどうかに関係なく、次のリンクと前のリンクを表示するには、条件付きステートメントを追加する必要があります。

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