Skip to main content

Understanding WordPress Pages and the Pages API

By Jérémy Heleine



Free JavaScript Book!

Write powerful, clean and maintainable JavaScript.

RRP $11.95

There are differences between WordPress posts and pages. There are times when a post is more suitable to use, while for other types of content, a page is more appropriate. In this article, I’ll cover what pages are and why they are different to posts. I’ll then show you how to manage pages on a WordPress website. Finally, we’ll take a look at some functions in the WordPress Pages API and have a play with pages.

What Is a WordPress Page?

A WordPress page is a page of content on your website — for example, a “Contact” or “About” page. We often see links to these pages in the main navigation, sidebar, or the perhaps in the footer of the website.

The main difference between a post and a page is the context in time: a post is generally time-dependant, while the content within a page is often permanent.

When you publish news, or even a tutorial, the context is important. A new feature won’t be new forever, and in some cases might not exist some years later. That’s why a post is more adapted when writing this type of content.

On the other hand, if you want to describe the purpose of your website, or if you want to provide a contact form, you’ll want to use a page. It’s the type of static content that won’t change in time.

How To Manage WordPress Pages

Adding, Editing and Removing a Page

If you have Editor or Administrator permissions, you can manage the pages in WordPress. To do this, go to Pages in the WordPress dashboard, and you’ll see a list of all your pages or to create a new page via the Add New button.

WordPress Pages API

This list is similar to the list found in Posts, and can be used in the same way. You can click on a page’s title to edit it and some other useful quick links appear when you move your mouse over the page’s title.

When you click to edit or add a page or post, you can then specify the title, content, and even add a featured image if your theme supports it. The Publish button allows you to publish the page. Otherwise, if you’re not ready to make it live, you can save it as a draft.

Organizing Pages

To organize your posts, you can use categories and tags. However, there isn’t a similar way to organize pages. Pages can still be organized in a hierarchy. In fact, you can indicate pages as subpages of other pages. It’s exactly like creating subcategories for your categories.

To create a subpage, go to the Page Attributes box where you’ll find a dropdown list labelled Parent. In this list, select the page you want as the parent of the page you’re currently creating or editing. Note, you can also create sub-subpages, sub-sub-subpages, etc. to create your own hierarchy.

By default, the pages are sorted alphabetically (by their titles). You can customize this order thanks to the Order field in the Page Attributes section. Then the pages will be sorted following the number you indicate in this field. As an example, if you have three pages titled Page 1, Page 2 and Page 3, they’ll be displayed in this order by default. If you want to make Page 3 appear first, indicate 0 as its order, and bigger numbers for the other pages (1 and 2 for instance).

The WordPress Pages API

Displaying a List of Pages

To display a list of pages, WordPress provides the wp_list_pages() function. By default, it displays the HTML code for a ul list containing all the published pages, encapsulated in a li tag with a h2 heading indicating Pages. It also accepts one parameter: an associative array listing some options to customize the output.

Filtering the Output

It’s possible to restrict the number of displayed pages thanks to some options. The first one we will see is child_of. It allows us to display the pages that have a given page as parent. The following example displays the children of the page with ID 2:

    'child_of' => 2

The authors option is useful when we want to display pages written by one or more authors. This option admits a string as a value: the list of the authors’ IDs separated by commas. With the following parameter, the function will display the pages written by two authors:

    'authors' => '2,7'

To display only some pages, you can use the include option. You give to this option a comma-separated list of pages IDs and you’ll get a list of these pages:

    'include' => '7,53,8'

On the contrary, if you want to hide some pages, you can use the exclude option that accepts the same type of value:

    'exclude' => '2,4'

You can also choose to filter by depth. If you want to see only top-level pages, for instance, you can use the option depth.

By default, it’s set to 0 and all pages are displayed. Set it to any positive number and you’ll get only pages to this depth. For example, indicating 1 will display only the top-level pages. The following example displays these same pages and their direct children:

    'depth' => 2

By default, wp_list_pages() displays only the published pages. But you can also display other pages, thanks to the option post_status.

Use this option to show the statuses you want to see, separated by a comma. The following example displays the published pages and the drafts:

    'post_status' => 'publish,draft'

In addition to filtering the list of pages you retrieve, you can also limit the number of retrieved pages thanks to the number option. If you use a positive number, you’ll only retrieve a limited number of pages.

Customizing the Output

You can customize the heading with the title_li option that accepts a string as a value. By default, it’s set to Pages, and you can then choose any text to display. You can also set it to an empty string.

That way, wp_list_pages() won’t encapsulate your pages into a li tag and you’ll directly get the li tags for the pages.

Retrieving the Pages

The wp_list_pages() function allows you to get a HTML list of pages. If you want to create your own HTML, or if you need to apply some actions to the pages before displaying them, it’s not the best function to use. Instead, you’ll prefer get_pages() to retrieve an array listing the different pages.

This function also accepts an array as an argument, listing the wanted options. The good news is that you already know some of these options, as we covered them in the description of the wp_list_pages() function: child_of, authors, include, exclude, post_status, number, sort_column and sort_order.

By default, the hierarchy of your pages is shown in get_pages(): the children will appear right after their parents. You can disable this behavior thanks to the hierarchical option set to false. That way, all pages will be treated equally, and the hierarchy will be totally ignored.

Retrieving a Single Page

The get_pages() function returns an array listing the wanted pages, each one represented by a WP_Post object. We’ll now see what’s contained in this object by retrieving only one page. To retrieve a page, use the get_post() function. Give to this function the ID of a page, and you’ll get an object representing this page:

$page = get_post(2);

Several pieces of information are available in this object, and each one is an attribute. For instance, the ID of the page can be obtained thanks to the ID attribute:

echo $page->ID;

The post_content allows you to retrieve the content of the page, while its title is in the post_title attribute. The post_name attribute contains the page’s slug (the part of its URL representing the page’s title).

The ID of the page’s author is given with the post_author attribute. You can also retrieve its date of creation with post_date and its date of latest modification with post_modified. The post_status attribute allows you to know the status of the page (published or draft, for instance).

The ID of the parent page can be obtained with the post_parent attribute and menu_order will give you the order indicated during the creation of the page.


If you want to add some static, permanent information to your website, then WordPress Pages are the solution.

The functions of the WordPress Pages API are useful if you’re developing a theme. You could, for example, list some pages in the footer, or create a widget to do it, so that your users can list pages wherever they want.

Currently a math student, Jérémy is a passionate guy who is interested in many fields, particularly in the high tech world for which he covers the news everyday on some blogs, and web development which takes much of his free time. He loves learning new things and sharing his knowledge with others.

New books out now!

Get practical advice to start your career in programming!

Master complex transitions, transformations and animations in CSS!

Latest Remote Jobs