How can I retrieve a list of a Wordpress page'

2020-07-02 10:26发布

问题:

I am trying to create a list of sibling pages (not posts) in WordPress to populate a page's sidebar. The code I've written successfully returns a page's parent's title.

<?php
$parent_title = get_the_title($post->post_parent);
echo $parent_title; ?>

As I understand it, you need a page's id (rather than title) to retrieve a page's siblings (via wp_list_pages). How can I get the page's parent's id?

Alternate approaches are welcome. The goal is to list a page's siblings, not necessarily just retrieving the parent's id.

回答1:

$post->post_parent is giving you the parent ID, $post->ID will give you the current page ID. So, the following will list a page's siblings:

wp_list_pages(array(
    'child_of' => $post->post_parent,
    'exclude' => $post->ID
))


回答2:

wp_list_pages(array(
    'child_of' => $post->post_parent,
    'exclude' => $post->ID,
    'depth' => 1
));

The correct answer, as both other answers don't exclusively display the siblings.



回答3:

Some of the answers on this page have slightly outdated info. Namely, exclude no longer seems to be needed when using child_of.

Here's my solution:

// if this is a child page of another page,
// get the parent so we can show only the siblings
if ($post->post_parent) $parent = $post->post_parent;
// otherwise use the current post ID, which will show child pages instead
else $parent = $post->ID;

// wp_list_pages only outputs <li> elements, don't for get to add a <ul>
echo '<ul class="page-button-nav">';

wp_list_pages(array(
    'child_of'=>$parent,
    'sort_column'=>'menu_order', // sort by menu order to enable custom sorting
    'title_li'=> '', // get rid of the annoying top level "Pages" title element
));

echo '</ul>';


回答4:

<?php if($post->post_parent): ?>
<?php $children = wp_list_pages('title_li=&child_of='.$post->post_parent.'&echo=0'); ?>
<?php else: ?>
<?php $children = wp_list_pages('title_li=&child_of='.$post->ID.'&echo=0'); ?>
<?php endif; ?>
<?php if ($children) { ?>
<ul class="subpage-list">
<?php echo $children; ?>
</ul>
<?php } ?>

Don't use the exclude parameter, just target that .current_page_item to differentiate.