web-dev-qa-db-ja.com

プラグインのサブディレクトリ+ファイルをwp-content/uploads-directoryに移動するための最良の方法は何ですか?

私はプラグイン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 );
    }
2
robertharm

756行目は$dirlist = $wp_filesystem->dirlist($from);です。議論は大丈夫です。私は、オブジェクト$wp_filesystemがあなたのプラグインに対してグローバルに利用可能ではないと思います。

1
jot