get_pages

Definition:
function &get_pages($args = '') {}

Retrieve a list of pages.
The defaults that can be overridden are the following: ‘child_of’, ‘sort_order’, ‘sort_column’, ‘post_title’, ‘hierarchical’, ‘exclude’, ‘include’, ‘meta_key’, ‘meta_value’,’authors’, ‘number’, and ‘offset’.

Parameters

  • mixed $args: Optional. Array or string of options that overrides defaults.

Return values

returns:List of pages matching defaults or $args

Defined filters

  • get_pages
    apply_filters('get_pages', $cache[ $key ], $r )
  • get_pages
    apply_filters('get_pages', array()
  • get_pages
    apply_filters('get_pages', $pages, $r)

Source code

function &get_pages($args = '') {

	global $wpdb;



	$defaults = array(

		'child_of' => 0, 'sort_order' => 'ASC',

		'sort_column' => 'post_title', 'hierarchical' => 1,

		'exclude' => array(), 'include' => array(),

		'meta_key' => '', 'meta_value' => '',

		'authors' => '', 'parent' => -1, 'exclude_tree' => '',

		'number' => '', 'offset' => 0,

		'post_type' => 'page', 'post_status' => 'publish',

	);



	$r = wp_parse_args( $args, $defaults );

	extract( $r, EXTR_SKIP );

	$number = (int) $number;

	$offset = (int) $offset;



	// Make sure the post type is hierarchical

	$hierarchical_post_types = get_post_types( array( 'hierarchical' => true ) );

	if ( !in_array( $post_type, $hierarchical_post_types ) )

		return false;



	// Make sure we have a valid post status

	if ( !is_array( $post_status ) )

		$post_status = explode( ',', $post_status );

	if ( array_diff( $post_status, get_post_stati() ) )

		return false;



	$cache = array();

	$key = md5( serialize( compact(array_keys($defaults)) ) );

	if ( $cache = wp_cache_get( 'get_pages', 'posts' ) ) {

		if ( is_array($cache) && isset( $cache[ $key ] ) ) {

			$pages = apply_filters('get_pages', $cache[ $key ], $r );

			return $pages;

		}

	}



	if ( !is_array($cache) )

		$cache = array();



	$inclusions = '';

	if ( !empty($include) ) {

		$child_of = 0; //ignore child_of, parent, exclude, meta_key, and meta_value params if using include

		$parent = -1;

		$exclude = '';

		$meta_key = '';

		$meta_value = '';

		$hierarchical = false;

		$incpages = wp_parse_id_list( $include );

		if ( ! empty( $incpages ) ) {

			foreach ( $incpages as $incpage ) {

				if (empty($inclusions))

					$inclusions = $wpdb->prepare(' AND ( ID = %d ', $incpage);

				else

					$inclusions .= $wpdb->prepare(' OR ID = %d ', $incpage);

			}

		}

	}

	if (!empty($inclusions))

		$inclusions .= ')';



	$exclusions = '';

	if ( !empty($exclude) ) {

		$expages = wp_parse_id_list( $exclude );

		if ( ! empty( $expages ) ) {

			foreach ( $expages as $expage ) {

				if (empty($exclusions))

					$exclusions = $wpdb->prepare(' AND ( ID <> %d ', $expage);

				else

					$exclusions .= $wpdb->prepare(' AND ID <> %d ', $expage);

			}

		}

	}

	if (!empty($exclusions))

		$exclusions .= ')';



	$author_query = '';

	if (!empty($authors)) {

		$post_authors = preg_split('/[\s,]+/',$authors);



		if ( ! empty( $post_authors ) ) {

			foreach ( $post_authors as $post_author ) {

				//Do we have an author id or an author login?

				if ( 0 == intval($post_author) ) {

					$post_author = get_user_by('login', $post_author);

					if ( empty($post_author) )

						continue;

					if ( empty($post_author->ID) )

						continue;

					$post_author = $post_author->ID;

				}



				if ( '' == $author_query )

					$author_query = $wpdb->prepare(' post_author = %d ', $post_author);

				else

					$author_query .= $wpdb->prepare(' OR post_author = %d ', $post_author);

			}

			if ( '' != $author_query )

				$author_query = " AND ($author_query)";

		}

	}



	$join = '';

	$where = "$exclusions $inclusions ";

	if ( ! empty( $meta_key ) || ! empty( $meta_value ) ) {

		$join = " LEFT JOIN $wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )";



		// meta_key and meta_value might be slashed

		$meta_key = stripslashes($meta_key);

		$meta_value = stripslashes($meta_value);

		if ( ! empty( $meta_key ) )

			$where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_key = %s", $meta_key);

		if ( ! empty( $meta_value ) )

			$where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_value = %s", $meta_value);



	}



	if ( $parent >= 0 )

		$where .= $wpdb->prepare(' AND post_parent = %d ', $parent);



	if ( 1 == count( $post_status ) ) {

		$where_post_type = $wpdb->prepare( "post_type = %s AND post_status = %s", $post_type, array_shift( $post_status ) );

	} else {

		$post_status = implode( "', '", $post_status );

		$where_post_type = $wpdb->prepare( "post_type = %s AND post_status IN ('$post_status')", $post_type );

	}



	$orderby_array = array();

	$allowed_keys = array('author', 'post_author', 'date', 'post_date', 'title', 'post_title', 'name', 'post_name', 'modified',

						  'post_modified', 'modified_gmt', 'post_modified_gmt', 'menu_order', 'parent', 'post_parent',

						  'ID', 'rand', 'comment_count');

	foreach ( explode( ',', $sort_column ) as $orderby ) {

		$orderby = trim( $orderby );

		if ( !in_array( $orderby, $allowed_keys ) )

			continue;



		switch ( $orderby ) {

			case 'menu_order':

				break;

			case 'ID':

				$orderby = "$wpdb->posts.ID";

				break;

			case 'rand':

				$orderby = 'RAND()';

				break;

			case 'comment_count':

				$orderby = "$wpdb->posts.comment_count";

				break;

			default:

				if ( 0 === strpos( $orderby, 'post_' ) )

					$orderby = "$wpdb->posts." . $orderby;

				else

					$orderby = "$wpdb->posts.post_" . $orderby;

		}



		$orderby_array[] = $orderby;



	}

	$sort_column = ! empty( $orderby_array ) ? implode( ',', $orderby_array ) : "$wpdb->posts.post_title";



	$sort_order = strtoupper( $sort_order );

	if ( '' !== $sort_order && !in_array( $sort_order, array( 'ASC', 'DESC' ) ) )

		$sort_order = 'ASC';



	$query = "SELECT * FROM $wpdb->posts $join WHERE ($where_post_type) $where ";

	$query .= $author_query;

	$query .= " ORDER BY " . $sort_column . " " . $sort_order ;



	if ( !empty($number) )

		$query .= ' LIMIT ' . $offset . ',' . $number;



	$pages = $wpdb->get_results($query);



	if ( empty($pages) ) {

		$pages = apply_filters('get_pages', array(), $r);

		return $pages;

	}



	// Sanitize before caching so it'll only get done once

	$num_pages = count($pages);

	for ($i = 0; $i < $num_pages; $i++) {

		$pages[$i] = sanitize_post($pages[$i], 'raw');

	}



	// Update cache.

	update_page_cache($pages);



	if ( $child_of || $hierarchical )

		$pages = & get_page_children($child_of, $pages);



	if ( !empty($exclude_tree) ) {

		$exclude = (int) $exclude_tree;

		$children = get_page_children($exclude, $pages);

		$excludes = array();

		foreach ( $children as $child )

			$excludes[] = $child->ID;

		$excludes[] = $exclude;

		$num_pages = count($pages);

		for ( $i = 0; $i < $num_pages; $i++ ) {

			if ( in_array($pages[$i]->ID, $excludes) )

				unset($pages[$i]);

		}

	}



	$cache[ $key ] = $pages;

	wp_cache_set( 'get_pages', $cache, 'posts' );



	$pages = apply_filters('get_pages', $pages, $r);



	return $pages;

}

1528

No comments yet... Be the first to leave a reply!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: