如何在不更改wp-config.php或更改媒体设置的情况下将媒体文件保存在自定义文件夹下

时间:2013-08-30 作者:Akshay

我想上传一个独特的文件夹中的图像。然后检索保存在服务器上的此图像的路径,如

http://example.com/wp-content/uploads/myimages/image1.jpg
现在,我想将此URL保存在一篇文章中,并将自定义字段作为URL。

我将定期覆盖帖子并替换相应的图像,所以我不想在我的服务器上保留与以前帖子(已删除帖子)相关的图像(否则会增加服务器上的内存)。我想从中删除所有图像myimages 文件夹我不想更改上载的默认路径。以下是我创建帖子的代码:

$new_post = array(
\'post_title\' => $phototitle,
\'post_status\' => \'publish\',
\'post_author\' => 1,
\'post_type\' => \'post\',
\'post_category\' => array(328)
);

$postid=wp_insert_post($new_post);
update_field(\'field_521c73f75a652\',$photoid,$postid);
update_field(\'field_521c74a65a653\',$phototitle,$postid);
update_field(\'field_521c74b25a654\',$photourl,$postid);
update_field(\'field_521c74be5a655\',$details,$postid);
update_field(\'field_521c77e72f9a6\',$countinarr,$postid);

require_once(ABSPATH . \'wp-admin/includes/media.php\');
require_once(ABSPATH . \'wp-admin/includes/file.php\');
require_once(ABSPATH . \'wp-admin/includes/image.php\');
$image = media_sideload_image($photourl, $postid, $phototitle);

$path = (string)$image;
$arr = (explode("\'",$path));
$url = $arr[1];

update_field(\'field_521c758095f55\',$url,$postid);
请告诉我如何更改此上载路径而不更改wp-config.php 或媒体设置。

2 个回复
SO网友:varadha

这里有一个简单的函数,可以为每次上传创建自己的子目录。

function kv_custom_image_dir( $pathdata ) {
    $subdir = \'/uploads_img\'.$pathdata[\'subdir\'];
    $pathdata[\'path\'] = str_replace($pathdata[\'subdir\'], $subdir, $pathdata[\'path\']);
    $pathdata[\'url\'] = str_replace($pathdata[\'subdir\'], $subdir, $pathdata[\'url\']);
    $pathdata[\'subdir\'] = str_replace($pathdata[\'subdir\'], $subdir, $pathdata[\'subdir\']);
    return $pathdata;
}
add_filter( \'upload_dir\', \'kv_custom_image_dir\' );
根据以上代码,我将图像文件夹更改为uploads_img, 你也可以改变你的。

如果您想了解更多信息,我编写了一个教程,用于更改每次自定义上载的上载目录,请查看my blog:

SO网友:david.binda

Notice: 尚未测试下面提供的想法或代码。

*media\\u sideload\\u image*调用*wp\\u handle\\u upload*函数,该函数处理文件上传。

上传目录通过*wp\\U Upload\\U dir*功能设置。此函数有一个过滤器,可用于修改其输出(请参阅http://core.trac.wordpress.org/browser/tags/3.6/wp-includes/functions.php#L1607):

$uploads = apply_filters( \'upload_dir\',
array(
    \'path\'    => $dir,
    \'url\'     => $url,
    \'subdir\'  => $subdir,
    \'basedir\' => $basedir,
    \'baseurl\' => $baseurl,
    \'error\'   => false,
) );
因此,通过以下方式连接到该过滤器:

add_filter( \'upload_dir\', \'my_upload_dir_function\' );

function my_upload_dir_function( $uploads ){
    if( isset( $_POST[\'my_check_post_var\'] ) && $_POST[\'my_check_post_var\'] == \'my_check_var_value\' ){
        return array(
            \'path\'    => $dir, //have to be set
            \'url\'     => $url, //have to be set
            \'subdir\'  => $subdir, //have to be set
            \'basedir\' => $basedir, //have to be set
            \'baseurl\' => $baseurl, //have to be set
            \'error\'   => false,
        );
    }else{
        return $uploads;
    }
}
代码显示,您的代码中有一个隐藏字段,该字段设置了一个检查变量,该变量在您检查过滤器时具有特定值。如果$\\u POST变量不存在或具有不同的值,则返回原始数组-因此不会破坏标准图像上载。

当然,您必须创建过滤器中使用的所有变量,例如$dir、$url等。检查http://core.trac.wordpress.org/browser/tags/3.6/wp-includes/functions.php#L1525 了解并了解WP是如何做到这一点的。

结束