Wordpress:插入带有当前完整路径的附件,图像不位于wordpress上传目录

时间:2019-07-16 20:05:31

标签: php wordpress

我正在尝试编写一个插件,该插件在激活后会以编程方式执行将图像上传到uploads目录所需的一切。换句话说:如果您手动在Add New媒体库屏幕上拖放图像,它将完成所有操作:

add media

详细信息:

  • 我没有提交POST请求。我只是试图找出我需要调用哪些函数才能执行以下操作(wordpress在“拖放式媒体库”屏幕中执行的操作:
    • 查找并获取FULL路径指定的图像(例如:图像位于桌面上。它不在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 无法做到这一点,但没有提供解决方案。

问题

  • 如何以编程方式上传wp-content / uploads目录中路径不存在的附件?而是,例如:图像的完整路径位于桌面上。
  • 在通过表单和POST请求上传图像的上下文中,如果不这样做就完全不可能吗?理想情况下,我想调用一些函数,说“这是位于桌面上的图像的完整路径。现在:在我的wordpress项目的上下文中完成上传图像的所有必要工作。”

谢谢!

3 个答案:

答案 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。