WordPress Version: 4.2
/**
* Retrieve the URL for an attachment.
*
* @since 2.1.0
*
* @param int $post_id Optional. Attachment ID. Default 0.
* @return string|bool Attachment URL, otherwise false.
*/
function wp_get_attachment_url($post_id = 0)
{
$post_id = (int) $post_id;
if (!$post = get_post($post_id)) {
return false;
}
if ('attachment' != $post->post_type) {
return false;
}
$url = '';
// Get attached file.
if ($file = get_post_meta($post->ID, '_wp_attached_file', true)) {
// Get upload directory.
if (($uploads = wp_upload_dir()) && false === $uploads['error']) {
// Check that the upload base exists in the file location.
if (0 === strpos($file, $uploads['basedir'])) {
// Replace file location with url location.
$url = str_replace($uploads['basedir'], $uploads['baseurl'], $file);
} elseif (false !== strpos($file, 'wp-content/uploads')) {
$url = $uploads['baseurl'] . substr($file, strpos($file, 'wp-content/uploads') + 18);
} else {
// It's a newly-uploaded file, therefore $file is relative to the basedir.
$url = $uploads['baseurl'] . "/{$file}";
}
}
}
/*
* If any of the above options failed, Fallback on the GUID as used pre-2.7,
* not recommended to rely upon this.
*/
if (empty($url)) {
$url = get_the_guid($post->ID);
}
/*
* If currently on SSL, prefer HTTPS URLs when we know they're supported by the domain
* (which is to say, when they share the domain name of the current SSL page).
*/
if (is_ssl() && 'https' !== substr($url, 0, 5) && parse_url($url, PHP_URL_HOST) === $_SERVER['HTTP_HOST']) {
$url = set_url_scheme($url, 'https');
}
/**
* Filter the attachment URL.
*
* @since 2.1.0
*
* @param string $url URL for the given attachment.
* @param int $post_id Attachment ID.
*/
$url = apply_filters('wp_get_attachment_url', $url, $post->ID);
if (empty($url)) {
return false;
}
return $url;
}