The $page API variable

The $page variable is provided to every template, and it contains all the content (via fields) specific to the page being viewed.

This includes both built-in fields, which are common to all pages, as well as the custom fields. The custom fields are those that you define in Admin > Setup > Fields and then assign to your template in Admin > Setup > Templates. $page also has several functions/methods that enable you to perform other tasks with it. The built-in fields and functions/methods are documented on this page.

Custom Fields

Custom fields are those that you have defined with the page's template. You can always access these by referencing them from the $page variable directly. For example, lets say that you have defined a field called "subtitle" and you want to output it in a headline:

echo "<h2>" . $page->subtitle . "</h2>";

$page API reference

See details about the $page variable in our API reference.

Usage Examples

Make use of the $page->parent variable:

echo "The title of the parent page is {$page->parent->title}";
if(!$page->parent->id) echo "You are on the homepage";

Generate a breadcrumb trail:

foreach($page->parents as $parent) {
  echo "<li><a href='{$parent->url}'>{$parent->title}</a></li>";
}

Display the name of the template:

echo "This page is using the template: {$page->template->name}";

Display the name of each field on the page, along with its value:

foreach($page->fields as $field) {
  echo "<p>{$field->name}: " . $page->get($field->name) . "</p>";
}

Display the number of children, followed by navigation to all of them:

echo "<p>This page has " . count($page->children) . " children</p>";
foreach($page->children as $child) {
  echo "<li><a href='{$child->url}'>{$child->title}</a></li>";
} 

Find 3 of the most recent children that have a featured checkbox set, and display links to them:

$features = $page->children("featured=1, limit=3, sort=-date");
foreach($features as $feature) {
  echo "<p>Featured story: <a href='{$feature->url}'>{$feature->title}</a></p>";
}

Display a list of paths to all sibling pages, not including the current page:

foreach($page->siblings as $sibling) {
  if($sibling->id != $page->id) echo "<li>Sibling: {$sibling->path}</li>";
}

Display a link back to the first page, if the current pageNum is greater than 1:

if($page->pageNum > 1) {
  echo "<a href='{$page->url}'>Back to first page</a>";
}

Iterating a $page

Iterating a $page produces the name and value of all the page's custom fields. Here is an example to illustrate this:

foreach($page as $field => $value) {
  echo "$field = $value <br />";
}

This is simpler than iterating through $page->fields and retrieving each value manually, as we did in one of the previous examples. The result might look like this:

title = About ACME Inc.
subtitle = The Leader in Something
body = Since 2010, ACME Inc. has been the leader in something, and so on...

Twitter updates

  • ProcessWire 3.0.174 core updates: improvements to the new path/URL hooks and more— More
    12 March 2021
  • ProcessWire 3.0.173 adds several new requested features and this post focuses on one of my favorites: the ability to hook into and handle ProcessWire URLs, independent of pages— More
    5 March 2021
  • This week ProcessWire gained powerful new tools for finding pages and controlling how they are loaded. If you like to maximize performance and efficiency, you’ll like what 3.0.172 brings— More
    5 February 2021

Latest news

  • ProcessWire Weekly #357
    In the 357th issue of ProcessWire Weekly we'll check out ProcessWire 3.0.174, some forum highlights, and more. Read on!
    Weekly.pw / 14 March 2021
  • ProcessWire 3.0.173 core updates: New URL hooks
    ProcessWire 3.0.173 adds several new requested features and this post focuses on one of my favorites: the ability to hook into and handle ProcessWire URLs, independent of pages.
    Blog / 5 March 2021
  • Subscribe to weekly ProcessWire news

“The end client and designer love the ease at which they can update the website. Training beyond how to log in wasn’t even necessary since ProcessWire’s default interface is straightforward.” —Jonathan Lahijani