我正在尝试为受密码保护的wordpress网站制作下载脚本。为了使用PHP的readfile()函数,我需要根据传递给下载脚本的ID来检索完整的附件URL。
我创建了一个名为 Downloads 的自定义帖子类型,并将其上载目录更改为wp-content中也称为 downloads 的文件夹。
这是它的代码:
add_filter( 'upload_dir', 'custom_upload_directory' );
function custom_upload_directory( $args ) {
$id = $_REQUEST['post_id'];
$parent = get_post( $id )->post_parent;
if( "downloads" == get_post_type( $id ) || "downloads" == get_post_type( $parent ) ) {
$args['path'] = WP_CONTENT_DIR . '/downloads';
$args['url'] = WP_CONTENT_URL . '/downloads';
}
return $args;
}
上传正常,当我单击所需文件的链接时,ID通过$ _POST传递到脚本,该脚本也正常工作。但我只是想不出一种方法来获取正确的文件URL。这是我尝试过的:
wp_get_attachment_url( $id ); // returns: example.com/wp-content/uploads/html/theme/wp-content/downloads/filename.ext
wp_get_attachment_link( $id ); // returns: <a href="example.com/wp-content/uploads/html/theme/wp-content/downloads/filename.ext">slug</a>
get_attachment_link( $id ); // returns: example.com/downloads/file (without .ext)
get_attached_file( $id, true ); // returns: html/theme/wp-content/downloads/filename.ext
get_post_meta( $id, '_wp_attached_file', false ); // returns: html/theme/wp-content/downloads/filename.ext
wp_get_attachment_metadata( $id ); // returns nothing
我希望这些功能返回的是 example.com/wp-content/downloads/filename.ext
但是,正如您所看到的,有些将默认的上传目录混合并与新目录合并,而另一些则返回完整URL的一半(html / theme / ...这是网站位于服务器上的目录) 。因此,任何想法将不胜感激。
答案 0 :(得分:0)
几小时,几天甚至几周后,我终于找到了答案,并对其进行了修改以满足我的需求。我想到的是在Wordpress的文件上传灯箱中显示正确的URL(修改后的URL)。但是在发布/更新帖子后,它返回了相同的旧.../wp-content/uploads/file.ext
URL。
其他人,somewhere else遇到了完全相同的问题,幸运的是,在那里,您不仅要更改$args['path']
和$args['url']
,还必须更改{{1} },basedir
和baseurl
。
因此,更改自定义帖子类型上载目录的完整代码如下(在本例中,我选择目录为... / wp-content / downloads):
subdir
现在,add_filter( 'upload_dir', 'change_upload_dir' );
function change_upload_dir( $args ) {
$id = $_REQUEST['post_id'];
if( get_post_type( $id ) == 'downloads' ) {
$args['basedir'] = wp_normalize_path( WP_CONTENT_DIR . 'downloads' );
$args['baseurl'] = content_url() . '/downloads';
$args['path'] = $args['basedir'];
$args['url'] = $args['baseurl'];
$args['subdir'] = '';
return $args;
}
}
最终得到类似calling wp_get_attachment_url()