WordPress Version: 6.3
/**
* Tries to convert an attachment URL into a post ID.
*
* @since 4.0.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param string $url The URL to resolve.
* @return int The found post ID, or 0 on failure.
*/
function attachment_url_to_postid($url)
{
global $wpdb;
$dir = wp_get_upload_dir();
$path = $url;
$site_url = parse_url($dir['url']);
$image_path = parse_url($path);
// Force the protocols to match if needed.
if (isset($image_path['scheme']) && $image_path['scheme'] !== $site_url['scheme']) {
$path = str_replace($image_path['scheme'], $site_url['scheme'], $path);
}
if (str_starts_with($path, $dir['baseurl'] . '/')) {
$path = substr($path, strlen($dir['baseurl'] . '/'));
}
$sql = $wpdb->prepare("SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_wp_attached_file' AND meta_value = %s", $path);
$results = $wpdb->get_results($sql);
$post_id = null;
if ($results) {
// Use the first available result, but prefer a case-sensitive match, if exists.
$post_id = reset($results)->post_id;
if (count($results) > 1) {
foreach ($results as $result) {
if ($path === $result->meta_value) {
$post_id = $result->post_id;
break;
}
}
}
}
/**
* Filters an attachment ID found by URL.
*
* @since 4.2.0
*
* @param int|null $post_id The post_id (if any) found by the function.
* @param string $url The URL being looked up.
*/
return (int) apply_filters('attachment_url_to_postid', $post_id, $url);
}