我是插件传单地图标记的开发人员(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 );
}