it-swarm.com.de

Was ist der beste Weg, um das Unterverzeichnis + der Dateien eines Plugins in das Verzeichnis wp-content/uploads zu verschieben?

Ich bin Entwickler des Plugins Leaflet Maps Marker ( http://www.mapsmarker.com - "Pin, organisiere & zeige deine Lieblingsorte über OpenStreetMap, OGD Wien oder eine benutzerdefinierte WMTS-Karte ") und haben eine Frage: Das Plugin enthält ca. 100 Markierungssymbole aus der Maps Icons Collection (mapicons.nicolasmollet.com), mit denen Sie Ihre Lieblingsorte markieren können.

Diese Icons sind in wp-content\plugins\leaflet-mapsmarker\img\mapicons gespeichert. Jetzt können Benutzer andere eigene Symbole aus der Sammlung hochladen (die aus mehr als 700 Symbolen bestehen). Problem ist, dass, wenn die Benutzer die benutzerdefinierten Symbole in das Plugins-Verzeichnis hochladen und ich in Zukunft ein Plugin-Update freigebe, die hochgeladenen Symbole gelöscht werden und vom Benutzer erneut hochgeladen werden müssen.

Also fing ich an, das mapsicons-Verzeichnis nach wp-content/uploads/leaflet-maps-marker-icons zu verschieben. Das Erstellen eines Verzeichnisses funktioniert sehr gut mit der WordPress-Funktion wp_mkdir_p ():

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

als nächsten Schritt wollte ich das Verzeichnis von Plugins verschieben, indem ich auch die (undokumentierte) WordPress-Datei-API-Funktion copy_dir () verwendete:

$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() );

Leider hat das nicht geklappt - ich bekomme den Fehler:

Schwerwiegender Fehler: Rufen Sie in /wp-current/wp-admin/includes/file.php in Zeile 756 eine Mitgliedsfunktionsliste () für ein Nicht-Objekt auf

Hat hier jemand diese Funktion schon einmal in einem seiner Projekte verwendet und weiß, wie man sie richtig einsetzt? Oder: Kennen Sie andere sichere Methoden zum Kopieren/Verschieben von Dateien mit WordPress-Funktionen? Ich möchte den Befehl PHP nicht direkt verwenden, da es meiner Erfahrung nach zu viele mögliche Konfigurationen von Webservern gibt, die zu erhöhten Support-Anfragen führen (Sicherheitsmodus ein/aus, Eingabe von FTP-Zugangsdaten erforderlich ...) .

Jede Hilfe wird sehr geschätzt!

Um vollständig zu sein, hier ist der Code für die Funktion copy_dir () aus 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;
}

aktualisierter Code (da der Code in den Kommentaren nicht richtig formatiert wurde)

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

Zeile 756 ist $dirlist = $wp_filesystem->dirlist($from);. Das Argument ist in Ordnung. Ich denke, dass das Objekt $wp_filesystem für Ihr Plugin nicht global verfügbar ist.

1
jot