Functions for generating a menu of WordPress pages
-
OK, here’s the functions.php file that I created in my theme to reproduce the drop down menu I had on my WordPress side.
Please note that this code does not attempt to reproduce all of the functionality of the WordPress wp_list_pages() function. Rather, it just tries to create the HTML needed for the drop down menu code that came with my WordPress theme to work. If you need anything more than that, feel free to modify this or strike out on your own.
Overview
Before the code, just a quick overview of how it works.
The function bb_list_pages() is a recursive function that returns a string containing the HTML for all of the pages that descend from a particular ancestor. The process is started by calling it with a parent ID of 0. The way the wp_posts table in WP is designed, this returns the highest level.
The function calls a helper function called get_pages() to retrieve the list of child pages from the database. It then loops through all of the pages returned by get_pages() & constructs the list item & anchor tags. It then calls itself to build the HTML for any descendants of the current page.
Here’s the code:
<?php
/**
* This file contains useful functions that can be called in any of the template's files.
*
* Version 1.0
* Date: 23-July-2009
* Author: Tony Vitabile
*/
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "/".$_SERVER["SERVER_NAME"];
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= ":".$_SERVER["SERVER_PORT"];
}
$pageURL .= $_SERVER["REQUEST_URI"];
return $pageURL;
}
/**
* Compute the name of the WordPress pages table & return it
*/
function pages_table() {
global $bb;
// Compute the name of the table we need to query
$table = $bb->wp_table_prefix;
if ($bb->wordpress_mu_primary_blog_id != "")
$table .= $bb->wordpress_mu_primary_blog_id."_";
$table .= "posts";
return $table;
}
/**
* Retrieve a list of pages from the WordPress posts table whose parent has the ID
* passed to this function.
*
* @param int $parent ID of the page that is the parent of the ones we're searching for
* @return array List of pages matching defaults or $args
*/
function get_pages($parent = 0) {
global $bbdb;
// Compute the name of the table we need to query
$table = pages_table();
// Build our query string
$parent = (int) $parent;
$query = "SELECT * FROM {$table} WHERE post_type = 'page' AND post_status = 'publish' AND post_parent = {$parent} ORDER BY menu_order";
// Get an array of rows back from the database
$pages = $bbdb->get_results($query);
// Return whatever we got back to the caller
return $pages;
}
/**
* Simple function to recursively scan the WordPress posts table looking for pages.
* It builds a string consisting of <ul><li></li>...</ul> items.
*
* @param int $parent ID of the parent page. 0 = no parent
* @param int $depth How far down in the heirarchy to go
* @param string $thisPage The name of the page that is currently being displayed
* @returns string A <ul><li></li>...</ul> list of page navigation information
*/
function bb_list_pages($parent = 0, $depth=0, $parent_uri='', $indent=' ') {
// Initialize the output of the function
$output = "";
// Is the depth = 0?
if ($depth == 0) {
// It is. Return the empty string now
return $output;
}
// Get the child rows of $parent
$pages = get_pages($parent);
// Did we get any pages back?
if ( empty($pages) ) {
// No, we didn't. Return the empty string now
return $output;
}
// Yes, we got pages back. Loop through all of the pages in our results
foreach ( $pages as $page ) {
// Compute this page's URI
$page_uri = $parent_uri;
if (substr($page_uri, -1) != '/')
$page_uri .= "/";
$page_uri .= $page->post_name . "/";
// Build the <li> tag
$output .= "{$indent}<li class="page_item page-item-{$page->ID}";
if ($page_uri == curPageURL() ) {
$output .= " current_page_item";
}
$output .= "">";
// Now build the rest of this item's information
$output .= "<a href="{$page_uri}">".$page->post_title."</a>n";
if ($page->ID > 0) {
// Get this page's children recursively
$kids = bb_list_pages($page->ID, $depth -1, $page_uri, '', $thisPage, $indent . " ");
// Does this page have any children?
if ($kids <> "") {
// It does. Add the information for the kids surrounded by <ul></ul> tages
$output .= "{$indent}<ul>n" . $kids . "{$indent}</ul>n";
}
}
// Output the closing </li>
$output .= "</li>";
}
// Return the string to the caller
return $output;
}
?>Tony
- You must be logged in to reply to this topic.