我正在尝试编写一个插件,该插件在激活后会以编程方式执行将图像上传到uploads
目录所需的一切。换句话说:如果您手动在Add New
媒体库屏幕上拖放图像,它将完成所有操作:
详细信息:
uploads
目录中。)uploads
目录中上传该图像以及该图像的各种版本post
的{{1}}等于post_type
attachment
记录示例:
wp_insert_attachment似乎根本无法做到这一点,因为图像必须已经存在于uploads目录中。
postmeta
This post只是说# Below is a comment from the wp_insert_attachment example:
// $filename should be the path to a file in the upload directory
无法做到这一点,但没有提供解决方案。
问题:
谢谢!
答案 0 :(得分:1)
如果文件已经在服务器上,但是在wordpress中还没有设置路径(即您无法从Web浏览器浏览到该文件),则有一个名为"Add from Server"的插件,其中它会打开一个连接到服务器的微型文件浏览器窗口,然后在WordPress实例中将数据库记录创建到服务器上的文件,以便您可以在wp-admin的媒体浏览器中将它们拉起。>
不过请注意,此插件会带来安全风险,因为该插件实质上可获取对Web服务器目录的文件访问权限。例如,如果您必须将一堆文件批量上传到WordPress并且它们已经在服务器上,那么我将安装该插件,为这些文件创建数据库记录,然后立即停用并卸载该插件!
答案 1 :(得分:1)
我看到您正在引用服务器的桌面。确保WordPress应用程序用户可以访问您尝试加载的文件!
如果必须以编程方式执行此操作,则看起来media_handle_sideload可以解决问题。功能与media_handle_upload相同,但我认为它不需要POST请求就可以像media_handle_upload那样激活它。
所以 第1步:将文件移动到WordPress应用可访问的位置(例如wp-content / uploads)
第2步:获取您需要“上传”的文件的网址(例如host / wp-content / uploads / image.jpg之类)
第3步:找出您需要引用该图片的ID,然后使用media_handle_sideload验证并存储该文件(Wordpress Codex下面的代码段)
<?php
// Need to require these files
if ( !function_exists('media_handle_upload') ) {
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
}
$url = "http://s.wordpress.org/style/images/wp3-logo.png";
$tmp = download_url( $url );
if( is_wp_error( $tmp ) ){
// download failed, handle error
}
$post_id = 0;
$desc = "The WordPress Logo";
$file_array = array();
// Set variables for storage
// fix file filename for query strings
preg_match('/[^\?]+\.(jpg|jpe|jpeg|gif|png)/i', $url, $matches);
$file_array['name'] = basename($matches[0]);
$file_array['tmp_name'] = $tmp;
// If error storing temporarily, unlink
if ( is_wp_error( $tmp ) ) {
@unlink($file_array['tmp_name']);
$file_array['tmp_name'] = '';
}
// do the validation and storage stuff
$id = media_handle_sideload( $file_array, $post_id, $desc );
// If error storing permanently, unlink
if ( is_wp_error($id) ) {
@unlink($file_array['tmp_name']);
return $id;
}
$src = wp_get_attachment_url( $id );
?>
答案 2 :(得分:0)
您正在寻找media_handle_upload。然后,您可以使用wp_update_attachment_metadata。
这是基本版本:
<?php
// Use 0 as your post ID if you don't want to attach it to any post
$image = media_handle_upload($file, $post_id);
wp_update_attachment_metadata( $image, $data );
?>
您可以看到更高级的版本using a frontend form here。
如果从URL上传图像,则可以选择使用media_handle_sideload。