Skip to content

Instantly share code, notes, and snippets.

@asadowski10
Last active Jun 26, 2017
Embed
What would you like to do?
<?php
/**
* Function copied from http://frankiejarrett.com/get-an-attachment-id-by-url-in-wordpress/
* Return an ID of an attachment by searching the database with the file URL.
*
* First checks to see if the $url is pointing to a file that exists in
* the wp-content directory. If so, then we search the database for a
* partial match consisting of the remaining path AFTER the wp-content
* directory. Finally, if a match is found the attachment ID will be
* returned.
*
* @return {int} $attachment
*/
private static function fjarrett_get_attachment_id_by_url( $url ) {
// Split the $url into two parts with the wp-content directory as the separator.
$parse_url = explode( parse_url( WP_CONTENT_URL, PHP_URL_PATH ), $url );
// Get the host of the current site and the host of the $url, ignoring www.
$this_host = str_ireplace( 'www.', '', parse_url( home_url(), PHP_URL_HOST ) );
$file_host = str_ireplace( 'www.', '', parse_url( $url, PHP_URL_HOST ) );
// Return nothing if there aren't any $url parts or if the current host and $url host do not match.
if ( ! isset( $parsed_url[1] ) || empty( $parsed_url[1] ) || ( $this_host != $file_host ) ) {
return;
}
// Now we're going to quickly search the DB for any attachment GUID with a partial path match.
// Example: /uploads/2013/05/test-image.jpg
global $wpdb;
$attachment = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type = 'attachment' AND guid LIKE %s", $parsed_url[1] ) );
if ( is_array( $attachment ) && ! empty( $attachment ) ) {
return array_shift( $attachment );
}
return null;
}
@asadowski10

This comment has been minimized.

Copy link
Owner Author

@asadowski10 asadowski10 commented Jan 28, 2016

Improve performance on query. Check only post_type attachment ;)

@andreilupu

This comment has been minimized.

Copy link

@andreilupu andreilupu commented May 5, 2017

Why not use attachment_url_to_postid ? I'm not sure if you can rely on guid anymore.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment