更改了插件的媒体上传路径,但生成错误并显示错误的URL

时间:2017-06-01 作者:Chris J. Zähller

我正在编写一个插件,作为其功能的一部分,它可以上载自定义字体。我正在使用new-since-Wordpress-3.5媒体上传器&;API。

我已经阅读了数十篇关于如何更改上载路径的教程,但在如何使其正常工作方面遇到了问题。目前,它将字体文件放置在插件中的正确目录中,但在上载过程中引发Wordpress错误(“上载时出错。请稍后重试”),并且最初不会在库中显示上载的文件。如果重新加载插件页(&R);重新打开上载程序,文件将显示在库中,但URL字段不正确。

Upload error message

我已经定义了插件路径&;URL作为主文件中的常量:

    if ( !defined( \'MYPLUGIN_DIR\' ) ) {
    define(\'MYPLUGIN_DIR\', plugin_dir_path(__FILE__));
  };

  if ( !defined( \'MYPLUGIN_URL\' ) ) {
    define(\'MYPLUGIN_URL\', p`lugin_dir_url(__FILE__));
  };
然后,在选项文件中,我有:

  add_filter(\'wp_handle_upload_prefilter\', \'myplugin_upload_prefilter\');
  add_filter(\'wp_handle_upload\', \'myplugin_handle_upload\');

  // filter the upload_dir hook
  function myplugin_upload_prefilter( $file ) {

    add_filter(\'upload_dir\', \'myplugin_upload_dir\');
    return $file;

  }

  // unset the filter & return upload path to default
  function myplugin_handle_upload( $fileinfo ) {

    remove_filter(\'upload_dir\', \'myplugin_upload_dir\');
    return $fileinfo;

  }

  function myplugin_upload_dir($path) {

    $fontdir = \'assets/fonts\'; // desired directory relative to plugin root  

    $path[\'path\'] = MYPLUGIN_DIR . $fontdir;
    $path[\'url\'] = MYPLUGIN_URL . $fontdir;
    $path[\'subdir\'] = $fontdir;
    $path[\'basedir\'] = MYPLUGIN_DIR;
    $path[\'baseurl\'] = MYPLUGIN_URL;

    return $path; // altered

  }
库路由器视图中格式错误的URL示例如下http://127.0.0.1/webroot/wp-content/uploads//Applications/MAMPSERVER-OR-WHATEVER/www/webroot/wp-content/plugins/myplugin/assets/fonts/myfont.woff. URL应为http://127.0.0.1/webroot/wp-content/plugins/myplugin/assets/fonts/myfont.woff. 注意“上传”后的双斜杠;我试过了untrailingslashit 至少要把它去掉,但没用。

为什么此代码最初会引发错误另一个相关的问题是,确保从插件设置页面上载媒体时,仅更改路径,但我会就此提出一个单独的问题。

1 个回复
SO网友:Mark Kaplun

虽然我现在还不能很容易地找出错误的原因,但很明显,您的方法在两个方面都是错误的

从媒体库上传的内容没有上下文,或者至少要找到上下文并不容易。字体文件的上传本身并不意味着它与你的插件有任何关系,即使你在更改上传目录之前检测到文件类型,它仍有可能以混乱告终。

除了上传目录之外,任何地方都不能上传。在管理得当的服务器中,web服务器不太可能具有写入任何其他目录的权限。

您应该做的是找出如何为上载提供上下文(可能非常困难或根本不可能),或者更好的是,只有当您知道上载与您的设置相关时,才将其移动到新目录。假设文件已上载,并且您在表单中使用了附件id,请在提交表单时移动文件。

我还建议看看EDD是如何做到这一点的,并从中获得灵感。

结束

相关推荐

将WordPress附件导入wp-Content/Uploads/中的自定义目录

我希望有人能阐明我试图解决的这个问题,即使只是简单地改变我的思维过程,告诉我如何解决这个问题。我正在将一个基于CakePHP的定制CMS web应用程序导入WordPress,方法是遍历数据库,进行大量SQL查询,构建数组,最后输出必要的XML文件,以便使用WordPress导入工具导入。目前我已经很好地导入了类别、标签和帖子/页面,没有问题,但问题似乎出在图像上。基于CakePHP的CMS中当前的图像格式是images/year/month/day/post_id/image_name.ext据我所知,