web-dev-qa-db-fra.com

Quel est le meilleur moyen de déplacer le sous-répertoire + les fichiers d’un plugin dans le répertoire wp-content/uploads-?

Je suis développeur du plugin Leaflet Maps Marker ( http://www.mapsmarker.com - "Identifiez, organisez et affichez vos lieux favoris via OpenStreetMap, OGD Vienna ou toute carte WMTS personnalisée ") et vous avez une question: le plugin contient environ 100 icônes de marqueur de Maps Icons Collection (mapicons.nicolasmollet.com) qui peuvent être utilisées pour marquer vos lieux préférés.

Ces icônes sont stockées dans wp-content\plugins\leaflet-mapsmarker\img\mapicons . Désormais, les utilisateurs peuvent télécharger d’autres icônes de la collection (comprenant plus de 700 icônes). Le problème est que si les utilisateurs téléchargent les icônes personnalisées dans le répertoire plugins et que je publie une mise à jour de plugin à l'avenir, les icônes téléchargées sont supprimées et doivent être à nouveau téléchargées par l'utilisateur.

J'ai donc commencé à déplacer le répertoire mapsicons vers wp-content/uploads/leaflet-maps-marker-icons . Créer un répertoire fonctionne assez bien avec la fonction wordpress wp_mkdir_p ():

$target = ABSPATH . 'wp-content/uploads/leaflet-maps-marker-icons';
wp_mkdir_p( $target );

comme étape suivante, je voulais déplacer le répertoire des plugins en utilisant également la fonction api de fichier wordpress (non documentée) 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() );

Malheureusement, cela n'a pas fonctionné - j'ai l'erreur:

Erreur fatale: appel de la fonction dirlist () sur un non-objet dans /wp-current/wp-admin/includes/file.php à la ligne 756

Est-ce que quelqu'un ici a déjà utilisé cette fonction dans l'un de ses projets et sait comment l'utiliser correctement? ou: connaissez-vous d'autres moyens sûrs de copier/déplacer des fichiers à l'aide de fonctions wordpress? Je ne souhaite pas utiliser directement la commande PHP, car de par mon expérience, il existe trop de configurations possibles de serveurs Web entraînant une augmentation des demandes d'assistance (safemode activé/désactivé, nécessité d'entrer des informations d'identification FTP ...) .

Toute aide est vraiment appréciée!

Pour être complet, voici le code de la fonction copy_dir () de 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;
}

code mis à jour (comme dans les commentaires, le code n'a pas été formaté correctement)

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

La ligne 756 est $dirlist = $wp_filesystem->dirlist($from);. L'argument est ok. Je pense que l'objet $wp_filesystem n'est pas disponible globalement pour votre plugin.

1
jot