私はプラグインLeaflet Maps Marker( http://www.mapsmarker.com - 「OpenStreetMapを使ってお気に入りの場所を整理して表示する」の開発者です。このプラグインには、Maps Icons Collection(mapicons.nicolasmollet.com)の約100個のマーカーアイコンが含まれています。これらのアイコンを使って、お気に入りの場所に印を付けることができます。
これらのアイコンは、wp-content\plugins\leaflet-mapsmarker\img\mapiconsに格納されています。これで、ユーザーはコレクションから他の独自のアイコン(700を超えるアイコンで構成されています)をアップロードできます。問題は、ユーザーがカスタムアイコンをplugins-directoryにアップロードし、将来プラグインのアップデートをリリースした場合、アップロードされたアイコンは削除され、ユーザーが再度アップロードする必要があることです。
そこで私はmapsiconsディレクトリをwp-content/uploads/leaflet-maps-marker-iconsに移動する作業を始めました。ディレクトリを作成することはワードプレス関数wp_mkdir_p()で非常にうまくいきます:
$target = ABSPATH . 'wp-content/uploads/leaflet-maps-marker-icons';
wp_mkdir_p( $target );
次のステップとして、(文書化されていない)ワードプレスファイルのAPI関数copy_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() );
残念ながらこれはうまくいきませんでした - エラーが出ます:
致命的なエラー:756行目の/wp-current/wp-admin/includes/file.phpで、オブジェクト以外のオブジェクトに対してメンバー関数dirlist()を呼び出しました。
誰かが以前に彼のプロジェクトの1つでこの機能を使用して、それを正しく使用する方法を知っていますか?または:ワードプレス機能を使用してファイルをコピー/移動するための他の安全な方法を知っていますか? PHPコマンドを直接使用したくはありません。経験上、サポート要求の増加につながるWebサーバーの設定が多すぎる(セーフモードのオン/オフ、ftp認証情報の入力など) 。
任意の助けは本当に感謝しています!
完全にするために、これはfile.phpからの関数copy_dir()のためのコードです:
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 );
}
756行目は$dirlist = $wp_filesystem->dirlist($from);
です。議論は大丈夫です。私は、オブジェクト$wp_filesystem
があなたのプラグインに対してグローバルに利用可能ではないと思います。