Benennen Sie den UPLOADS-Ordner mit benutzerdefiniertem WP_CONTENT_DIR um

7

Zur Versionskontrolle verfügt unser Client über eine WordPress-App mit einer Verzeichnisstruktur wie folgt:

.
|_____app
|  |_____themes
|  |_____plugins
|  |_____uploads
|_____index.php
|_____WordPress
|_____wp-config.php

In wp-config.php:

define('WP_CONTENT_DIR', __DIR__ . '/app');
define('WP_CONTENT_URL', WP_HOME . '/app');

Jetzt möchte sie alle Standard-WordPress-Ordner im App-Verzeichnis umbenennen.

Mit pluginsund themeskönnen wir es einfach tun, indem wir WP_PLUGIN_DIRund register_theme_directory () verwenden . Aber irgendwie ist es nicht einfach, uploadsOrdner umzubenennen .

Ich habe viele Änderungen mit UPLOADSKonstante versucht , aber es kann nicht helfen, da benutzerdefinierte Upload-Ordner immer im WordPressVerzeichnis erstellt werden.

Gibt es Möglichkeiten, dieses Problem zu umgehen?

SarahCoding
quelle

Antworten:

5

Nachdem ich mich umgesehen hatte, benutzte ich upload_dirFilter.

Hier ist , was ich versucht , in functions.phpzu ändern uploadszu media. Hoffe es kann auch jemandem helfen :)

 add_filter('upload_dir', function($uploads)
 {
     $custom = [];

     foreach ($uploads as $key => $value) {
         if ( false !== strpos($value, '/app/uploads') ) {
             $custom[$key] = str_replace('/app/uploads', '/app/media', $value);
         } else {
             $custom[$key] = $value;
         }
     }

     return $custom;
 });

Vielen Dank an @gmazzap für die Richtlinien und den Vorschlag zum upload_dirFilter!

SarahCoding
quelle
1
+1, aber ein Hinweis, ich hasse partielle Übereinstimmungen, da dies zu unerwarteten Ergebnissen führen kann (was ist mit der Site, die jeder bodecandouploads?) , zum Beispiel ersetzen site_url(/wp-content/uploads)durchsite_url(/wp-content/media)
Mark Kaplun
4

Wenn Sie sich die Quelle von ansehen _wp_upload_dir, werden Sie sehen:

if (defined('UPLOADS') && ! (is_multisite() && get_site_option('ms_files_rewriting'))) {
    $dir = ABSPATH.UPLOADS;
    $url = trailingslashit($siteurl).UPLOADS;
}

So UPLOADSkann nur dann verwendet werden , um eine foder relativ zu definieren ABSPATH, was ich denke , ist /WordPressOrdner in Ihrem Setup.

In derselben Funktion können Sie sehen, dass, wenn get_option('upload_path')und get_option('upload_url_path')leer sind, der Pfad und die URL des Upload-Ordners auf festgelegt sind WP_CONTENT_DIR.'/uploads'und WP_CONTENT_URL.'/uploads'für Sie vollkommen in Ordnung sein sollten, solange Sie dies in OP definieren WP_CONTENT_DIRund WP_CONTENT_URLmögen.

Wenn Sie überhaupt nicht definieren UPLOADSund der Upload-Ordner immer noch nicht aufgelöst ist /app/uploads, enthält Ihre Datenbank höchstwahrscheinlich einen Wert für 'upload_path'und 'upload_url_path'Optionen.

Sie haben 2 Möglichkeiten:

  • Löschen Sie diese Optionen
  • Verwenden Sie "pre_option_{$option}"Filter, um zu erzwingen get_option(), dass für diese Optionen etwas Leeres zurückgegeben wird (aber nicht, falseoder die Filter werden ignoriert).

Für die zweite Möglichkeit könnte der Code ungefähr so ​​aussehen:

add_filter('pre_option_upload_path', '__return_empty_string');
add_filter('pre_option_upload_url_path', '__return_empty_string');

Mit dem obigen Code und ohne UPLOADSdefinierte Konstante sollte der Upload-Ordner korrekt aufgelöst werden , solange Sie WP_CONTENT_DIRund definieren WP_CONTENT_URL.

Wenn dies nicht der Fall ist, muss beispielsweise etwas auf einen Filter einwirken upload_dir.

gmazzap
quelle
Danke! Wenn ich nicht definiere UPLOADS, app/uploadswird normal erstellt, solange ich WP_CONTENT_DIRund definiert habe WP_CONTENT_URL. upload_pathund upload_url_pathsind standardmäßig leere Zeichenfolgen in der Datenbank, und es werden keine Änderungen mithilfe des upload_dirFilters vorgenommen. Aber ich kann immer noch nicht in app/uploadsso etwas umbenennen app/custom.
SarahCoding