自定义上传目录不会更改附件元

时间:2018-09-17 16:13:28

标签: php wordpress

我正在尝试为受密码保护的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 / ...这是网站位于服务器上的目录) 。因此,任何想法将不胜感激。

1 个答案:

答案 0 :(得分:0)

几小时,几天甚至几周后,我终于找到了答案,并对其进行了修改以满足我的需求。我想到的是在Wordpress的文件上传灯箱中显示正确的URL(修改后的URL)。但是在发布/更新帖子后,它返回了相同的旧.../wp-content/uploads/file.ext URL。

其他人,somewhere else遇到了完全相同的问题,幸运的是,在那里,您不仅要更改$args['path']$args['url'],还必须更改{{1} },basedirbaseurl

因此,更改自定义帖子类型上载目录的完整代码如下(在本例中,我选择目录为... / 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()

的结果