我知道文件的路径,我想获取附件ID。
有一个函数wp_get_attachment_url()
需要ID来获取URL,但我需要它反向(虽然路径不是URL)
答案 0 :(得分:27)
更新:因为wp 4.0.0有一个可以完成这项工作的新功能。我还没有测试过,但就是这样:
https://developer.wordpress.org/reference/functions/attachment_url_to_postid/
老回答:到目前为止,我发现的最佳解决方案如下:
https://frankiejarrett.com/2013/05/get-an-attachment-id-by-url-in-wordpress/
我认为这是最好的,有两个原因:
答案 1 :(得分:14)
我使用了pippinsplugins.com的这个很酷的剪辑
在functions.php文件中添加此功能
// retrieves the attachment ID from the file URL
function pippin_get_image_id($image_url) {
global $wpdb;
$attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image_url ));
return $attachment[0];
}
然后在您的页面或模板中使用此代码来存储/打印/使用ID:
// set the image url
$image_url = 'http://yoursite.com/wp-content/uploads/2011/02/14/image_name.jpg';
// store the image ID in a var
$image_id = pippin_get_image_id($image_url);
// print the id
echo $image_id;
此处的原帖:https://pippinsplugins.com/retrieve-attachment-id-from-image-url/
希望有帮助;) 弗朗西斯
答案 2 :(得分:1)
尝试使用attachment_url_to_postid
函数。
$rm_image_id = attachment_url_to_postid( 'http://example.com/wp-content/uploads/2016/05/castle-old.jpg' );
echo $rm_image_id;
答案 3 :(得分:0)
以前的答案都不支持在包含裁剪的附件网址上进行ID查找。
例如:/uploads/2018/02/my-image-300x250.jpg
v.s. /uploads/2018/02/my-image.jpg
WP Scholar的Micah写了blog post并将代码上传到此Gist。它处理原始和裁剪的URL查找。
我将以下代码作为参考,但如果您觉得有用,我建议您对其帖子或 明星 留下评论。< / p>
/**
* Get an attachment ID given a URL.
*
* @param string $url
*
* @return int Attachment ID on success, 0 on failure
*/
function get_attachment_id( $url ) {
$attachment_id = 0;
$dir = wp_upload_dir();
if ( false !== strpos( $url, $dir['baseurl'] . '/' ) ) { // Is URL in uploads directory?
$file = basename( $url );
$query_args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'fields' => 'ids',
'meta_query' => array(
array(
'value' => $file,
'compare' => 'LIKE',
'key' => '_wp_attachment_metadata',
),
)
);
$query = new WP_Query( $query_args );
if ( $query->have_posts() ) {
foreach ( $query->posts as $post_id ) {
$meta = wp_get_attachment_metadata( $post_id );
$original_file = basename( $meta['file'] );
$cropped_image_files = wp_list_pluck( $meta['sizes'], 'file' );
if ( $original_file === $file || in_array( $file, $cropped_image_files ) ) {
$attachment_id = $post_id;
break;
}
}
}
}
return $attachment_id;
}
此解决方案的另一位专家是我们利用WP_Query
类而不是对DB进行直接SQL查询。
答案 4 :(得分:0)
对于文件 path ,此处的其他答案似乎均无法正常工作。使用Pippin函数的答案也是有缺陷的,它并不能真正实现“ WordPress方式”。
此函数将支持路径或url,并依赖内置的WordPress函数attach_url_to_postid正确地进行最终处理:
/**
* Find the post ID for a file PATH or URL
*
* @param string $path
*
* @return int
*/
function find_post_id_from_path( $path ) {
// detect if is a media resize, and strip resize portion of file name
if ( preg_match( '/(-\d{1,4}x\d{1,4})\.(jpg|jpeg|png|gif)$/i', $path, $matches ) ) {
$path = str_ireplace( $matches[1], '', $path );
}
// process and include the year / month folders so WP function below finds properly
if ( preg_match( '/uploads\/(\d{1,4}\/)?(\d{1,2}\/)?(.+)$/i', $path, $matches ) ) {
unset( $matches[0] );
$path = implode( '', $matches );
}
// at this point, $path contains the year/month/file name (without resize info)
// call WP native function to find post ID properly
return attachment_url_to_postid( $path );
}
答案 5 :(得分:0)
像GFargo pointed out一样,大多数答案都以附件为图片。此外,attachment_url_to_postid假定使用url(而不是文件路径)。
我相信当提供文件(带有路径)时,这可以更好地回答实际问题:
function getAttachmentIDFromFile($filepath)
{
$file = basename($filepath);
$query_args = array(
'post_status' => 'any',
'post_type' => 'attachment',
'fields' => 'ids',
'meta_query' => array(
array(
'value' => $file,
'compare' => 'LIKE',
),
)
);
$query = new WP_Query($query_args);
if ($query->have_posts()) {
return $query->posts[0]; //assume the first is correct; or process further if you need
}
return 0;
}
答案 6 :(得分:-1)
根据@FrancescoCarlucci的回答,我可以做一些改进。
有时,例如,当您在WordPress中编辑图像时,它会从原始图像创建一个副本,并将copys上载路径添加为post meta(key _wp_attached_file
),而答案不会尊重该文件。
此处包含以下编辑的精炼查询:
function jfw_get_image_id($file_url) {
$file_path = ltrim(str_replace(wp_upload_dir()['baseurl'], '', $file_url), '/');
global $wpdb;
$statement = $wpdb->prepare("SELECT `ID` FROM `wp_posts` AS posts JOIN `wp_postmeta` AS meta on meta.`post_id`=posts.`ID` WHERE posts.`guid`='%s' OR (meta.`meta_key`='_wp_attached_file' AND meta.`meta_value` LIKE '%%%s');",
$file_url,
$file_path);
$attachment = $wpdb->get_col($statement);
if (count($attachment) < 1) {
return false;
}
return $attachment[0];
}