将插件的子目录+文件移动到wp-Content/Uploads-目录的最佳方式是什么?

时间:2011-12-19 作者:robertharm

我是插件传单地图标记的开发人员(http://www.mapsmarker.com - “通过OpenStreetMap、OGD Vienna或任何自定义WMTS地图锁定、组织和显示您最喜爱的地点”),但有一个问题:该插件包含来自“地图图标”集合(mapicons.nicolasmollet.com)的大约100个标记图标,可用于标记您最喜爱的地点。

这些图标存储在wp-content\\plugins\\leaflet-mapsmarker\\img\\mapicons. 现在,用户可以从集合中上传其他自己的图标(包含700多个图标)。问题是,如果用户将自定义图标上载到插件目录,并且我在将来发布插件更新,则上载的图标将被删除,用户必须再次上载。

所以我开始将mapsicons目录移动到wp-content/uploads/leaflet-maps-marker-icons. 使用wordpress函数wp\\u mkdir\\u p()创建目录效果很好:

$target = ABSPATH . \'wp-content/uploads/leaflet-maps-marker-icons\';
wp_mkdir_p( $target );
下一步,我想通过使用(未记录的)wordpress file api函数copy\\u dir()从插件中移动目录:

$source = WP_PLUGIN_DIR . \'/\' . end(explode(\'/\', dirname(__FILE__))) . \'/img/mapicons\'; //allows plugin directory names other than leaflet-maps-marker
$target = ABSPATH . \'wp-content/uploads/leaflet-maps-marker-icons\';
copy_dir($source, $target, $skip_list = array() );
不幸的是,这不起作用-我得到了错误:

致命错误:对/wp current/wp admin/includes/file中的非对象调用成员函数dirlist()。php在线756

这里有没有人以前在他的一个项目中使用过这个函数,并且知道如何正确使用它?或者:您知道使用wordpress功能复制/移动文件的其他安全方法吗?我不想直接使用PHP命令,根据我的经验,有太多可能的web服务器配置导致支持请求增加(安全模式打开/关闭,必须输入ftp凭据…)。

非常感谢您的帮助!

下面是函数copy\\u dir()from file的代码。php:

function copy_dir($from, $to, $skip_list = array() ) {
global $wp_filesystem;

$dirlist = $wp_filesystem->dirlist($from);

$from = trailingslashit($from);
$to = trailingslashit($to);

$skip_regex = \'\';
foreach ( (array)$skip_list as $key => $skip_file )
    $skip_regex .= preg_quote($skip_file, \'!\') . \'|\';

if ( !empty($skip_regex) )
    $skip_regex = \'!(\' . rtrim($skip_regex, \'|\') . \')$!i\';

foreach ( (array) $dirlist as $filename => $fileinfo ) {
    if ( !empty($skip_regex) )
        if ( preg_match($skip_regex, $from . $filename) )
            continue;

    if ( \'f\' == $fileinfo[\'type\'] ) {
        if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) {
            // If copy failed, chmod file to 0644 and try again.
            $wp_filesystem->chmod($to . $filename, 0644);
            if ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) )
                return new WP_Error(\'copy_failed\', __(\'Could not copy file.\'), $to . $filename);
        }
    } elseif ( \'d\' == $fileinfo[\'type\'] ) {
        if ( !$wp_filesystem->is_dir($to . $filename) ) {
            if ( !$wp_filesystem->mkdir($to . $filename, FS_CHMOD_DIR) )
                return new WP_Error(\'mkdir_failed\', __(\'Could not create directory.\'), $to . $filename);
        }
        $result = copy_dir($from . $filename, $to . $filename, $skip_list);
        if ( is_wp_error($result) )
            return $result;
    }
}
return true;
}
更新的代码(如注释中的代码格式不正确)

WP_Filesystem();
$target = ABSPATH . \'wp-content/uploads/leaflet-maps-marker-icons\';
    if (!is_dir($target)) //check for multisite installations
    {
        wp_mkdir_p( $target );
        $source = WP_PLUGIN_DIR . \'/\' . end(explode(\'/\', dirname(__FILE__))) . \'/img/mapicons\';
        copy_dir($source, $target, $skip_list = array() );
        $zipfile = ABSPATH . \'wp-content/uploads/leaflet-maps-marker-icons/mapicons.zip\';
        unzip_file( $zipfile, $target );
    }

1 个回复
SO网友:jot

第756行为$dirlist = $wp_filesystem->dirlist($from);. 参数是可以的。我认为$wp_filesystem 您的插件在全球范围内不可用。

结束

相关推荐

使用外部API发布/发布到WordPress

是否有一种解决方案或方法可以使用外部web服务API(可以是JSON或SOAP)来填充/更新wordpress博客?例如,使用wikipedia api获取wikipedia的内容。com上有关于这篇文章的主题。我试着在网上搜索这个主题,我所找到的只是如何从wordpress中已有的帖子中创建一个API。有什么建议或想法吗?