get_page_by_path( string $page_path, string $output = OBJECT, string|array $post_type = 'page' )
Retrieves a page given its path.
Description Description
Parameters Parameters
- $page_path
-
(string) (Required) Page path.
- $output
-
(string) (Optional) The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to a WP_Post object, an associative array, or a numeric array, respectively.
Default value: OBJECT
- $post_type
-
(string|array) (Optional) Post type or array of post types.
Default value: 'page'
Return Return
(WP_Post|array|null) WP_Post (or array) on success, or null on failure.
Source Source
File: wp-includes/post.php
function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) { global $wpdb; $last_changed = wp_cache_get_last_changed( 'posts' ); $hash = md5( $page_path . serialize( $post_type ) ); $cache_key = "get_page_by_path:$hash:$last_changed"; $cached = wp_cache_get( $cache_key, 'posts' ); if ( false !== $cached ) { // Special case: '0' is a bad `$page_path`. if ( '0' === $cached || 0 === $cached ) { return; } else { return get_post( $cached, $output ); } } $page_path = rawurlencode( urldecode( $page_path ) ); $page_path = str_replace( '%2F', '/', $page_path ); $page_path = str_replace( '%20', ' ', $page_path ); $parts = explode( '/', trim( $page_path, '/' ) ); $parts = array_map( 'sanitize_title_for_query', $parts ); $escaped_parts = esc_sql( $parts ); $in_string = "'" . implode( "','", $escaped_parts ) . "'"; if ( is_array( $post_type ) ) { $post_types = $post_type; } else { $post_types = array( $post_type, 'attachment' ); } $post_types = esc_sql( $post_types ); $post_type_in_string = "'" . implode( "','", $post_types ) . "'"; $sql = " SELECT ID, post_name, post_parent, post_type FROM $wpdb->posts WHERE post_name IN ($in_string) AND post_type IN ($post_type_in_string) "; $pages = $wpdb->get_results( $sql, OBJECT_K ); $revparts = array_reverse( $parts ); $foundid = 0; foreach ( (array) $pages as $page ) { if ( $page->post_name == $revparts[0] ) { $count = 0; $p = $page; /* * Loop through the given path parts from right to left, * ensuring each matches the post ancestry. */ while ( $p->post_parent != 0 && isset( $pages[ $p->post_parent ] ) ) { $count++; $parent = $pages[ $p->post_parent ]; if ( ! isset( $revparts[ $count ] ) || $parent->post_name != $revparts[ $count ] ) { break; } $p = $parent; } if ( $p->post_parent == 0 && $count + 1 == count( $revparts ) && $p->post_name == $revparts[ $count ] ) { $foundid = $page->ID; if ( $page->post_type == $post_type ) { break; } } } } // We cache misses as well as hits. wp_cache_set( $cache_key, $foundid, 'posts' ); if ( $foundid ) { return get_post( $foundid, $output ); } }
Expand full source code Collapse full source code View on Trac
Changelog Changelog
Version | Description |
---|---|
2.1.0 | Introduced. |
User Contributed Notes User Contributed Notes
You must log in before being able to contribute a note or feedback.
Page Path
This is the equivalent of the
pagename
query, as in:index.php?pagename=parent-page/sub-page
.Code for the above could be written as (assuming
parent-page/sub-page
is actually the path to a page):For non-hierarchical custom post types, you need to use just the slug in tandem with the
post_type
parameter.The functions
basename()
anduntrailingslashit()
are handy for grabbing the last part of the URL for this:Feedback
`wp_basename()` is the i18n friendly version of `basename()`. — By Joy —
If you don’t specify a
post_type,
it searches bothpage
andattachment
.If you want only
page
, pass it via the third parameter.:Feedback
To achieve this, the third parameter would need to be passed as an array.
array( 'page' )
— By markcallen —The function parameters and defaults would suggest otherwise but you’re right. by default it will search in the attachments too. Though the code will still append the ‘attachment’ post type if you pass a string for the $post_type parameter. The only way to avoid it is to pass an array containing only ‘page’.
get_page_by_path( '/about/', OBJECT, array('page') );
It is also a quite slow query, especially if you have a lot of images in the site, hence it is really recommended to do force only the ‘page’ post_type. — By piccart —