如何将wp_Upload_Bits()放入子文件夹?

时间:2019-01-25 作者:Robert Andrews

我正在使用wp_upload_bits() 要复制获取的远程图像。。。

$upload = wp_upload_bits($file, \'\', wp_remote_retrieve_body( $get ));
图像源示例:https://logo.clearbit.com/starcomww.com

以下代码似乎可以很好地获取图像:

$get = wp_remote_get( $image_url ); 
$type = wp_remote_retrieve_header( $get, \'content-type\' );
$file (文件名)设置为eg。starcom-mediavest-group.png

所以我明白了wp_upload_bits($file... 将设置文件名。

但我不知道如何将图像添加到subdirectory 属于uploads - 专门称为uploads/org_logos然后wp_upload_bits 将删除斜杠,认为它是不安全的文件字符,导致文件不正确org_logosstarcom-mediavest-group.png 放置在主管道中uploads 文件夹它真的想把它放进去uploads!

如何在subfolder?

我知道PHP函数move_uploaded_file - 但我担心这会丢失我仍然需要附加到媒体库的文件的任何引用。不管怎样,无论如何,我没有太多的运气用这个移动它。。。

// Move it
$thefile = $upload[\'file\'];
$upload_dir = wp_upload_dir();
$newfolder = $upload_dir[\'basedir\'].\'/org_logos\';
move_uploaded_file($thefile, $newfolder);

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

wp_upload_bits() 使用wp_upload_dir() 激发了upload_dir 过滤器允许您修改上载目录的路径、子目录和URL。

所以你可以用这个过滤器来“强制”wp_upload_bits() 要使用自定义路径,请执行以下操作:

// Demo to get the image data.
$url = \'https://logo.clearbit.com/starcomww.com\';
$content = file_get_contents( $url );

$_filter = true; // For the anonymous filter callback below.
add_filter( \'upload_dir\', function( $arr ) use( &$_filter ){
    if ( $_filter ) {
        $folder = \'/org_logos\'; // No trailing slash at the end.
        $arr[\'path\'] .= $folder;
        $arr[\'url\'] .= $folder;
        $arr[\'subdir\'] .= $folder;
    }

    return $arr;
} );

$filename = wp_basename( $url ) . \'.png\';
$ret = wp_upload_bits( $filename, null, $content );
var_dump( $ret ); // For testing.

$_filter = false; // Disables the filter.
也可以使用命名回调:

function my_org_logos_upload_dir( $arr ) {
    $folder = \'/org_logos\'; // No trailing slash at the end.

    $arr[\'path\'] .= $folder;
    $arr[\'url\'] .= $folder;
    $arr[\'subdir\'] .= $folder;

    return $arr;
}

// Demo to get the image data.
$url = \'https://logo.clearbit.com/starcomww.com\';
$content = file_get_contents( $url );

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

$filename = wp_basename( $url ) . \'.png\';
$ret = wp_upload_bits( $filename, null, $content );
var_dump( $ret ); // For testing.

remove_filter( \'upload_dir\', \'my_org_logos_upload_dir\' );
更新(回复您的评论)

因此,作为过滤器wp_upload_dir(), 这将适用于通过wp_upload_dir(), 是这样吗?

是的,会的。

但是,只有在调用时添加/启用筛选器,才能防止此问题wp_upload_bits() and 您希望它使用您的自定义上载路径,然后在应用过滤器后删除/禁用过滤器-以防止在以下情况下更改上载路径:wp_upload_dir() 从其他函数或代码调用。

因此,正如您在原始答案中所看到的,我的方法如下:

// First variant of the code - using an anonymous function.
$_filter = true;  // enables the filter
$_filter = false; // disables the filter

// Second variant of the code - using a named function.
remove_filter( \'upload_dir\', \'my_org_logos_upload_dir\' ); // enables the filter
add_filter( \'upload_dir\', \'my_org_logos_upload_dir\' );    // disables the filter
第二个属性wp_insert_attachment()$filename, $content 或某些属性$ret[here]?

的第二个参数wp_insert_attachment() 函数是要附加到帖子的文件的完整绝对路径。

一旦成功,wp_upload_bits() 返回具有file 作为键之一,其中的值是由保存的文件的完整绝对路径wp_upload_bits(). (您可以检查函数的referencethis note 对于其他键。)

所以答案是$ret[\'file\']:

wp_insert_attachment( array(...), $ret[\'file\'] );

相关推荐

从wp.media.editor.附件获取所选图像URL到文本输入失败。我做错了什么?

我已将媒体按钮作为post meta field 在以下情况下将图像URL插入文本字段Insert Into Page 单击按钮。它一直工作到打开“媒体存储库”窗口、选择“图像”和“插入”为止,但没有向输入字段传递任何值。Expected result结果应该是URL和媒体ID插入为https://avalon.com/dev/wp-content/uploads/2021/01/scp7147prko31.jpg|12 但没有返回值。我可以手动输入URL并保存数据。我彻底扫描了我的代码,并尝试了许多ja