Make `url_to_postid()` work for custom post type URLs. Use `get_post_types()` and `get_taxonomies()` instead of directly accessing globals. Adds unit test.

Props faishal, for the globals fix.
Fixes #19744.


Built from https://develop.svn.wordpress.org/trunk@25659


git-svn-id: http://core.svn.wordpress.org/trunk@25576 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Scott Taylor 2013-10-02 19:42:09 +00:00
parent 01484339b9
commit e3d58a5b23
3 changed files with 18 additions and 7 deletions

View File

@ -238,7 +238,7 @@ class WP {
$this->public_query_vars = apply_filters('query_vars', $this->public_query_vars);
foreach ( $GLOBALS['wp_post_types'] as $post_type => $t )
foreach ( get_post_types( array(), 'objects' ) as $post_type => $t )
if ( $t->query_var )
$post_type_query_vars[$t->query_var] = $post_type;
@ -271,7 +271,7 @@ class WP {
}
// Convert urldecoded spaces back into +
foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t )
foreach ( get_taxonomies( array() , 'objects' ) as $taxonomy => $t )
if ( $t->query_var && isset( $this->query_vars[$t->query_var] ) )
$this->query_vars[$t->query_var] = str_replace( ' ', '+', $this->query_vars[$t->query_var] );

View File

@ -1735,7 +1735,7 @@ class WP_Query {
);
}
foreach ( $GLOBALS['wp_taxonomies'] as $taxonomy => $t ) {
foreach ( get_taxonomies( array() , 'objects' ) as $taxonomy => $t ) {
if ( 'post_tag' == $taxonomy )
continue; // Handled further down in the $q['tag'] block

View File

@ -338,6 +338,12 @@ function url_to_postid($url) {
$url = trim($url, '/');
$request = $url;
$post_type_query_vars = array();
foreach ( get_post_types( array() , 'objects' ) as $post_type => $t ) {
if ( ! empty( $t->query_var ) )
$post_type_query_vars[ $t->query_var ] = $post_type;
}
// Look for matches.
$request_match = $request;
@ -365,16 +371,21 @@ function url_to_postid($url) {
// Filter out non-public query vars
global $wp;
parse_str($query, $query_vars);
parse_str( $query, $query_vars );
$query = array();
foreach ( (array) $query_vars as $key => $value ) {
if ( in_array($key, $wp->public_query_vars) )
if ( in_array( $key, $wp->public_query_vars ) ){
$query[$key] = $value;
if ( isset( $post_type_query_vars[$key] ) ) {
$query['post_type'] = $post_type_query_vars[$key];
$query['name'] = $value;
}
}
}
// Do the query
$query = new WP_Query($query);
if ( !empty($query->posts) && $query->is_singular )
$query = new WP_Query( $query );
if ( ! empty( $query->posts ) && $query->is_singular )
return $query->post->ID;
else
return 0;