Last active
May 23, 2020 22:46
-
-
Save Webcreations907/ce5b77565dfb9a208738 to your computer and use it in GitHub Desktop.
url_to_postid function. Updated to work on custom post types and permalink structure. Still must have query_var set to false when registering cusotm post types.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Post URLs to IDs function, supports custom post types - borrowed and modified from url_to_postid() in wp-includes/rewrite.php */ | |
// Taken from http://betterwp.net/wordpress-tips/url_to_postid-for-custom-post-types/ | |
// Customized to work with non-rewrite URLs | |
// Copyright Dovy Paukstys (@dovy) of Redux Framework | |
function url_to_postid( $url ) { | |
global $wp_rewrite; | |
if ( ! empty( $this->post_id ) ) { | |
return $this->post_id; | |
} | |
if ( isset( $_GET['post'] ) && ! empty( $_GET['post'] ) && is_numeric( $_GET['post'] ) ) { | |
return $_GET['post']; | |
} | |
// First, check to see if there is a 'p=N' or 'page_id=N' to match against | |
// added post to match, even though it's above | |
if ( preg_match( '#[?&](p|post|page_id|attachment_id)=(\d+)#', $url, $values ) ) { | |
$id = absint( $values[2] ); | |
if ( $id ) { | |
return $id; | |
} | |
} | |
// Check to see if we are using rewrite rules | |
if ( isset( $wp_rewrite ) ) { | |
$rewrite = $wp_rewrite->wp_rewrite_rules(); | |
} | |
// Not using rewrite rules, and 'p=N' and 'page_id=N' methods failed, so we're out of options | |
if ( empty( $rewrite ) ) { | |
if ( isset( $_GET ) && ! empty( $_GET ) ) { | |
/************************************************************************ | |
* ADDED: Trys checks URL for ?posttype=postname | |
*************************************************************************/ | |
// Assign $url to $tempURL just incase. :) | |
$tempUrl = $url; | |
// Get rid of the #anchor | |
$url_split = explode( '#', $tempUrl ); | |
$tempUrl = $url_split[0]; | |
// Get rid of URL ?query=string | |
$url_query = explode( '&', $tempUrl ); | |
$tempUrl = $url_query[0]; | |
// Get rid of ? mark | |
$url_query = explode( '?', $tempUrl); | |
if(isset($url_query[1]) && !empty($url_query[1]) && strpos( $url_query[1], '=' )){ | |
$url_query = explode( '=', $url_query[1] ); | |
if(isset($url_query[0]) && isset($url_query[1])){ | |
$args = array( | |
'name' => $url_query[1], | |
'post_type' => $url_query[0], | |
'showposts' => 1, | |
); | |
if ( $post = get_posts( $args ) ) { | |
return $post[0]->ID; | |
} | |
} | |
} | |
//END ADDITION | |
//print_r($GLOBALS['wp_post_types']); | |
//if (isset($GLOBALS['wp_post_types']['acme_product'])) | |
// Add custom rules for non-rewrite URLs | |
foreach ( $GLOBALS['wp_post_types'] as $key => $value ) { | |
if ( isset( $_GET[ $key ] ) && ! empty( $_GET[ $key ] ) ) { | |
$args = array( | |
'name' => $_GET[ $key ], | |
'post_type' => $key, | |
'showposts' => 1, | |
); | |
if ( $post = get_posts( $args ) ) { | |
return $post[0]->ID; | |
} | |
} | |
} | |
} | |
} | |
// Get rid of the #anchor | |
$url_split = explode( '#', $url ); | |
$url = $url_split[0]; | |
// Get rid of URL ?query=string | |
$url_query = explode( '?', $url ); | |
$url = $url_query[0]; | |
// Add 'www.' if it is absent and should be there | |
if ( false !== strpos( home_url(), '://www.' ) && false === strpos( $url, '://www.' ) ) { | |
$url = str_replace( '://', '://www.', $url ); | |
} | |
// Strip 'www.' if it is present and shouldn't be | |
if ( false === strpos( home_url(), '://www.' ) ) { | |
$url = str_replace( '://www.', '://', $url ); | |
} | |
// Strip 'index.php/' if we're not using path info permalinks | |
if ( isset( $wp_rewrite ) && ! $wp_rewrite->using_index_permalinks() ) { | |
$url = str_replace( 'index.php/', '', $url ); | |
} | |
if ( false !== strpos( $url, home_url() ) ) { | |
// Chop off http://domain.com | |
$url = str_replace( home_url(), '', $url ); | |
} else { | |
// Chop off /path/to/blog | |
$home_path = parse_url( home_url() ); | |
$home_path = isset( $home_path['path'] ) ? $home_path['path'] : ''; | |
$url = str_replace( $home_path, '', $url ); | |
} | |
// Trim leading and lagging slashes | |
$url = trim( $url, '/' ); | |
$request = $url; | |
if ( empty( $request ) && ( ! isset( $_GET ) || empty( $_GET ) ) ) { | |
return get_option( 'page_on_front' ); | |
} | |
// Look for matches. | |
$request_match = $request; | |
foreach ( (array) $rewrite as $match => $query ) { | |
// If the requesting file is the anchor of the match, prepend it | |
// to the path info. | |
if ( ! empty( $url ) && ( $url != $request ) && ( strpos( $match, $url ) === 0 ) ) { | |
$request_match = $url . '/' . $request; | |
} | |
if ( preg_match( "!^$match!", $request_match, $matches ) ) { | |
// Got a match. | |
// Trim the query of everything up to the '?'. | |
$query = preg_replace( "!^.+\?!", '', $query ); | |
// Substitute the substring matches into the query. | |
$query = addslashes( WP_MatchesMapRegex::apply( $query, $matches ) ); | |
// Filter out non-public query vars | |
global $wp; | |
parse_str( $query, $query_vars ); | |
$query = array(); | |
foreach ( (array) $query_vars as $key => $value ) { | |
if ( in_array( $key, $wp->public_query_vars ) ) { | |
$query[ $key ] = $value; | |
} | |
} | |
/************************************************************************ | |
* ADDED: $GLOBALS['wp_post_types'] doesn't seem to have custom postypes | |
* Trying below to find posttypes in $rewrite rules | |
*************************************************************************/ | |
// PostType Array | |
$custom_post_type = false; | |
$post_types = array(); | |
foreach ($rewrite as $key => $value) { | |
if(preg_match('/post_type=([^&]+)/i', $value, $matched)){ | |
if(isset($matched[1]) && !in_array($matched[1], $post_types)){ | |
$post_types[] = $matched[1]; | |
} | |
} | |
} | |
foreach ((array) $query_vars as $key => $value) { | |
if(in_array($key, $post_types)){ | |
$custom_post_type = true; | |
$query['post_type'] = $key; | |
$query['postname'] = $value; | |
} | |
} | |
// print_r($post_types); | |
/************************************************************************ | |
* END ADD | |
*************************************************************************/ | |
// Taken from class-wp.php | |
foreach ( $GLOBALS['wp_post_types'] as $post_type => $t ) { | |
if ( $t->query_var ) { | |
$post_type_query_vars[ $t->query_var ] = $post_type; | |
} | |
} | |
foreach ( $wp->public_query_vars as $wpvar ) { | |
if ( isset( $wp->extra_query_vars[ $wpvar ] ) ) { | |
$query[ $wpvar ] = $wp->extra_query_vars[ $wpvar ]; | |
} elseif ( isset( $_POST[ $wpvar ] ) ) { | |
$query[ $wpvar ] = $_POST[ $wpvar ]; | |
} elseif ( isset( $_GET[ $wpvar ] ) ) { | |
$query[ $wpvar ] = $_GET[ $wpvar ]; | |
} elseif ( isset( $query_vars[ $wpvar ] ) ) { | |
$query[ $wpvar ] = $query_vars[ $wpvar ]; | |
} | |
if ( ! empty( $query[ $wpvar ] ) ) { | |
if ( ! is_array( $query[ $wpvar ] ) ) { | |
$query[ $wpvar ] = (string) $query[ $wpvar ]; | |
} else { | |
foreach ( $query[ $wpvar ] as $vkey => $v ) { | |
if ( ! is_object( $v ) ) { | |
$query[ $wpvar ][ $vkey ] = (string) $v; | |
} | |
} | |
} | |
if ( isset( $post_type_query_vars[ $wpvar ] ) ) { | |
$query['post_type'] = $post_type_query_vars[ $wpvar ]; | |
$query['name'] = $query[ $wpvar ]; | |
} | |
} | |
} | |
// Do the query | |
if ( isset( $query['pagename'] ) && ! empty( $query['pagename'] ) ) { | |
$args = array( | |
'name' => $query['pagename'], | |
'post_type' => array('post','page'), // Added post for custom permalink eg postname | |
'showposts' => 1, | |
); | |
if ( $post = get_posts( $args ) ) { | |
return $post[0]->ID; | |
} | |
} | |
$query = new WP_Query( $query ); | |
if ( ! empty( $query->posts ) && $query->is_singular ) { | |
return $query->post->ID; | |
} else { | |
/************************************************************************ | |
* Added: | |
* $query->is_singular seems to not be set on custom post types, trying | |
* below. Made it this far without return, worth a try? :) | |
*************************************************************************/ | |
if(!empty( $query->posts ) && isset($query->post->ID) && $custom_post_type == true){ | |
return $query->post->ID; | |
} | |
/************************************************************************ | |
* Will match posttype when query_var => true, will not work with | |
* custom query_var set ie query_var => 'acme_books'. | |
*************************************************************************/ | |
if(isset($post_types)){ | |
foreach ($rewrite as $key => $value) { | |
if(preg_match('/\?([^&]+)=([^&]+)/i', $value, $matched)){ | |
if(isset($matched[1]) && !in_array($matched[1], $post_types) && array_key_exists($matched[1], $query_vars)){ | |
$post_types[] = $matched[1]; | |
$args = array( | |
'name' => $query_vars[$matched[1]], | |
'post_type' => $matched[1], | |
'showposts' => 1, | |
); | |
if ( $post = get_posts( $args ) ) { | |
return $post[0]->ID; | |
} | |
} | |
} | |
} | |
} | |
// END ADD // | |
return 0; | |
} | |
} | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment