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:
parent
01484339b9
commit
e3d58a5b23
|
@ -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] );
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue