The $pages API variable

$pages is your connection to all the pages in your site

While the $page variable holds the current page, the $pages variable is where you can get at all the other pages in your site. It includes functions for getting, finding, saving and deleting pages.

$pages API reference

View all $pages API methods in the API reference.

Examples of getting and finding pages

These examples correspond to the skyscrapers demo site. For this first example, we'll get a specific page and print its title:

echo $pages->get("/cities/chicago/sears-tower/")->title; 

Find all skyscrapers (i.e. pages using the skyscraper template). Then make a list linking to each of them. Note that this foreach() example below also applies to all examples below this – the foreach() has been left out of later examples for brevity.

$skyscrapers = $pages->find("template=skyscraper");
foreach($skyscrapers as $s) {
  echo "<li><a href='$s->url'>$s->title</a></li>";

Find all skyscrapers with a height greater than 500 ft, and less than or equal to 1000 ft:

$skyscrapers = $pages->find("template=skyscraper, height>500, height<=1000");

Find all skyscrapers in Chicago with 60+ floors, sorted by floors ascending:

$skyscrapers = $pages->get("/cities/chicago/")->find("floors>=60, sort=floors");

Find all skyscrapers built before 1950 with 10+ floors, sorted by year descending, then floors descending:

$skyscrapers = $pages->find("template=skyscraper, year<1950, floors>=10, sort=-year, sort=-floors");

Find all skyscrapers by architects David Childs or Renzo Piano, and sort by height descending:

$david = $pages->get("/architects/david-childs/");
$renzo = $pages->get("/architects/renzo-piano/");
$skyscrapers = $pages->find("architect=$david|$renzo, sort=-height");

Find all skyscrapers that mention the words "limestone" and "granite" somewhere in their body copy:

$skyscrapers = $pages->get("/cities/")->find("template=skyscraper, body~=limestone granite");

Find all skyscrapers that mention the phrase "empire state building" in their body copy:

$pages->get("/cities/")->find("template=skyscraper, body*=empire state building");

Examples of saving and deleting pages

Load a page, change its year field and save it:

$skyscraper = $pages->get("/cities/chicago/sears-tower/");
$skyscraper->year = 1974;
$pages->save($skyscraper); // $skyscraper->save() does the same thing

Find all pages with the text "Sears Tower" in their bodycopy, and update them to say "Willis Tower":

foreach($pages->find("body*=Sears Tower") as $p) {
  $p->body = str_replace("Sears Tower", "Willis Tower", $p->body);

Create a new skyscraper page in Atlanta and save it, then add an image and save again:

$skyscraper = new Page();
$skyscraper->template = $templates->get("skyscraper");
$skyscraper->parent = $pages->get("/cities/atlanta/");
$skyscraper->title = "W-Hotel Tower";
$skyscraper->height = 400;
$skyscraper->year = 2009;
$skyscraper->body = "This is a nice hotel and it has a helicopter landing pad on top of it."

Find all skyscrapers built in the 1950s and move them to the trash:

$skyscrapers = $pages->find("year>=1950, year<1960");
foreach($skyscrapers as $skyscraper) {

Permanently delete a page:

$p = $pages->get("/about/locations/southpark/");
// or: $pages->get("/about/locations/southpark/")->delete();

Permanently delete a page and all its children. In this case it will delete a city page and all the skyscrapers below it:

$city = $pages->get("/cities/houston/");
$pages->delete($city, true); // specify true as a second param to make the delete recursive

Twitter updates

  • A review of weekly core updates, plus a simple recipe for a very effective listing cache—More
    24 June 2022
  • Weekly update: Making ProcessWire render pages at old WordPress URLs (or building a simple/custom URL router in PW): More
    17 June 2022
  • New post: ProcessWire now comes with just 1 site installation profile, the "blank" profile. It makes very few assumptions, making it a minimal though excellent starting point. Here’s how you might use it— More
    10 June 2022

Latest news

  • ProcessWire Weekly #424
    In the 424th issue of ProcessWire Weekly we'll check out the latest weekly update from Ryan, introduce a new third party module, and more. Read on! / 25 June 2022
  • Starting a site with the “blank” profile
    ProcessWire 3.0.200+ comes with just 1 site installation profile, the site-blank profile. This profile makes very few assumptions, making it a minimal though excellent starting point. Here’s how you might use it. 
    Blog / 10 June 2022
  • 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