Ich wiederhole mich mal:
Zitat
(Cthulhux) is there a way to automatize reordering the /uploads directory? i started using date-based subdirectories in 2011, so a lot of files are still directly in /wp-content/uploads. how can i move them to ...uploads/<year>/<day> without having to go through all of my 1,000+ postings separately?
Das scheint ja ein bekanntes Problem zu sein: Ändert man mal das wp-uploads-Verzeichnis (bzw. seine Struktur), hat man u.U. eine Menge Mehraufwand. Lösungen bisher: Keine. W3TC kann auch nur die Anhänge umbiegen, aber Dateien aus .../uploads in .../uploads/jahr/monat verschieben scheint's nicht zu tun: Was einmal in .../uploads ist, bleibt auch da.
Ich habe von Pluginentwicklung leider mal so gar keinen Schimmer, aber vielleicht möchte mir hier jemand dabei zur Hand gehen? Generell würde folgendes PHP-Script (gerade schnell runtergetippt, benötigt natürlich Schreibzugriff auf den /wp-content/uploads-Ordner!) funktionieren; ist halt noch sehr wenig elegant:
<?php
function debuglog($str) {
echo "<b><font color='red'>DEBUG:</font></b> ".$str."<br />";
}
// Variablen für den Datenbankzugriff und so
$dbServer = "localhost";
$dbUsername = "databaseuser";
$dbPasswort = "password";
$dbDatabase = "database"; // Name der Datenbank
$dbPrefix = "wp_";
$rootInternal = "/web/blog/"; // interner Pfad zu WordPress
$rootExternal = "http://meinblog.de/"; // öffentliche Adresse
// ------------------------
// los geht's!
mysql_connect($dbServer,$dbUsername,$dbPasswort) or die("Unable to connect");
@mysql_select_db($dbDatabase) or die("Unable to select database");
// 0. (Array-)Liste aller Artikel (brauchen wir noch) anlegen
$arrArtikel = array();
$sql = "SELECT ID FROM ".$dbPrefix."posts";
$res = mysql_query($sql) or die("FAIL: 0.");
while ($wtf = mysql_fetch_row($res)) {
array_push($arrArtikel,$wtf[0]);
}
// 1. suche aktuelles Datumsformat
$sql = "SELECT option_value FROM ".$dbPrefix."options WHERE option_name='uploads_use_yearmonth_folders'";
$res = mysql_query($sql) or die("FAIL: 1.");
$wtf = mysql_result($res,0);
if ($wtf == "0") die("Not using date-based uploading - don't do anything.");
// 2. Liste aller gegenwärtigen Dateianhänge
$sql = "SELECT meta_id,post_id,meta_value FROM ".$dbPrefix."postmeta WHERE meta_key='_wp_attached_file'";
$res = mysql_query($sql) or die("FAIL: 2.");
while ($wtf = mysql_fetch_row($res)) {
$currAttachment = $wtf[2];
if (!preg_match("/^\d{4}\/\d{2}/",$currAttachment)) {
// Dateianhang nicht im richtigen Unterordner. Panik und so!
// 1. Artikel-ID suchen (nächstniedrige ID zu $wtf[1])
$artikel = 0;
foreach ($arrArtikel as $artid) {
if ($artid < $wtf[1])
$artikel = $artid;
else
break;
}
// 2. Datum des Artikels (zum Verschieben) ermitteln und Pfade festlegen
$sqlArtikel = "SELECT post_date FROM ".$dbPrefix."posts WHERE ID='".$artikel."'";
$resArtikel = mysql_query($sqlArtikel) or die("FAIL: 2.2.");
$wtfArtikel = mysql_result($resArtikel,0);
// Beispielstring: 2005-10-09 00:47:23
$neuerMonat = substr($wtfArtikel,5,2);
$neuesJahr = substr($wtfArtikel,0,4);
$neuerPfad = $rootInternal . "wp-content/uploads/" . $neuesJahr . "/" . $neuerMonat . "/";
// 3. Verschieben
$alteDatei = "\"" . $rootInternal . "wp-content/uploads/" . $currAttachment . "\"";
$neueDatei = "\"" . $neuerPfad . $currAttachment . "\"";
//debuglog("rename(".$alteDatei.",".$neueDatei.");");
rename($alteDatei,$neueDatei);
// 4. Eintrag in wp_postmeta korrigieren
$sqlArtikel = "UPDATE ".$dbPrefix."postmeta SET meta_value='".str_replace($currAttachment, $neuesJahr . "/" . $neuerMonat . "/".$currAttachment, $currAttachment)."' WHERE meta_id='".$wtf[0]."'";
//debuglog($sqlArtikel);
mysql_query($sqlArtikel) or die("FAIL: 2.4.");
// 5. Eintrag im Artikel korrigieren
$sqlArtikel = "UPDATE ".$dbPrefix."posts SET post_content='".str_replace($currAttachment, $neuesJahr . "/" . $neuerMonat . "/".$currAttachment, $currAttachment)."' WHERE meta_id='".$wtf[0]."'";
//debuglog($sqlArtikel);
mysql_query($sqlArtikel) or die("FAIL: 2.5.");
// 6. Benutzer darüber informieren
echo "Anhang " . $currAttachment . " aus Artikel " . $artikel . " war nicht da, wo er hingehörte. Jetzt issers.<br>Nachgucken: <a href='".$blogroot."?p=".$artikel."'>".$blogroot."?p=".$artikel."</a><br><br>";
}
$i++;
}
?>
Alles anzeigen
[color=red]Nein, ich habe es noch nicht in einem Produktivsystem getestet. Ist nur ein Denkanreiz, der, technisch gesehen, funktionieren müsste.
Nein, ich hafte nicht für auftretende Explosionen.[/color]