Merhaba arkadaslar, birkac haftadir bir ilan sitesi temasi üzerinde calisiyorum, bugun fark ettim ki media kütüphanesinden silinen görseller sunucudan silinmiyormus. sadece veritabani baglantilari silindigi icin media kütüphanesinde görünmüyor ama sunucudan bakinca orada saklanmaya devam ediyor, az önce birkac wp optimize eklentileri ile sorunu cozmeye calistim ama eklentiler yalnizca media library kismindaki görselleri görüyor, sunucu bazli analiz yapan eklenti göremedim.
Benim sorunum su simdi, bu ilan sitesinde yuzlerce ilan acilacak ve zamanla benim temizlik yapmam gerekecek, tamam bazi eklentiler kullanilmayan gorselleri kütüphaneden siliyor iyi, ama sunucudan silmedikten sonra kutuphaneden silse ne yazar, buna bir cozum var mi acaba?
WordPress Media Library ve Sunucudaki Resim Çöplüğü Hk.
6
●206
- 26-03-2024, 20:04:27Aşağıdaki kod WordPress veritabanını ve `wp-content/uploads` dizinini tarayarak, görselleri kontrol edecek ve ilişkili bir yazı/post bulunmazsa bu dosyaları ve veritabanındaki kayıtlarını silecektir. Betiği çalıştırmadan önce, WordPress veritabanı bilgilerinizle ve dosya dizin yollarınızla ilgili değişiklikleri yapmayı unutmayın. Ayrıca yedekleme yapmadan bu işlemi sakın denemeyin. Kodları kontrol etmedim ancak çalışacağını düşünüyorum. Bir php dosyası oluşturup kodları içine yapıştırın veritabanı bilgilerinizi de güncelleyin ardından $wp_upload_dir değişkenindeki yolu da düzeltin. Eğer wordpress veritabanı tablolarınızdaki ön ek wp_ değilse koddaki tüm wp_ alanlarını da sizin ön ekiniz ile değiştirmeyi unutmayın.
Aşağıdaki kodları temizlik.php dosyası oluşturup cronjob'a eklerseniz düzenli olarak arka planda kontrol edip kütüphanenizi temizleyecektir.
// WordPress veritabanı bilgileri $db_name = 'your_db_name'; $db_user = 'your_db_user'; $db_password = 'your_db_password'; $db_host = 'localhost'; // WordPress dosya sistemi - yılın ve ayın klasör yapısını dikkate almalıyız $wp_upload_dir = '/path/to/wordpress/wp-content/uploads'; // Veritabanı bağlantısı $mysqli = new mysqli($db_host, $db_user, $db_password, $db_name); if ($mysqli->connect_error) { die("Bağlantı hatası: " . $mysqli->connect_error); } // Hata raporlamasını aktifleştir mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // Görsel dosyalarını çekmek için post_type = 'attachment' olan kayıtları alalım $sql = "SELECT p.ID, p.post_title, pm.meta_value FROM wp_posts p JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'attachment' AND pm.meta_key = '_wp_attached_file' ORDER BY p.ID DESC"; try { $result = $mysqli->query($sql); echo "Toplam " . $result->num_rows . " adet görsel kaydı bulundu.<br>\n"; if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $file_path = $wp_upload_dir . '/' . $row['meta_value']; $post_id = $row['ID']; echo "ID: " . $post_id . " - Başlık: " . $row['post_title'] . " - Dosya: " . $row['meta_value'] . "<br>\n"; // Dosya var mı kontrol et if (file_exists($file_path)) { echo "✓ Dosya mevcut: " . $file_path . "<br>\n"; } else { echo "✗ Dosya bulunamadı: " . $file_path . "<br>\n"; // İsterseniz burada kayıp dosyalar için işlem yapabilirsiniz // Örneğin: Kayıp dosyaları bir log dosyasına yazma file_put_contents('missing_media.log', $post_id . ": " . $file_path . "\n", FILE_APPEND); } echo "<hr>\n"; } } } catch (mysqli_sql_exception $e) { echo "SQL Hatası: " . $e->getMessage() . "<br>\n"; } // Veritabanında kaydı olan ama gerçek dosyası olmayan görselleri bulmak echo "<h2>Kayıp Dosyaları Bul</h2>\n"; $sql = "SELECT p.ID, p.post_title, pm.meta_value FROM wp_posts p JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'attachment' AND pm.meta_key = '_wp_attached_file' ORDER BY p.ID DESC"; try { $result = $mysqli->query($sql); $missing_count = 0; if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $file_path = $wp_upload_dir . '/' . $row['meta_value']; if (!file_exists($file_path)) { $missing_count++; echo "Kayıp Dosya #" . $missing_count . ": ID=" . $row['ID'] . ", Dosya=" . $file_path . "<br>\n"; } } if ($missing_count === 0) { echo "Tüm dosyalar mevcut, kayıp dosya bulunamadı.<br>\n"; } else { echo "Toplam " . $missing_count . " adet kayıp dosya bulundu.<br>\n"; } } } catch (mysqli_sql_exception $e) { echo "SQL Hatası: " . $e->getMessage() . "<br>\n"; } // Orphaned (yetim) görsel dosyalarını bulmak: Fiziksel dosya var ama veritabanında kaydı yok echo "<h2>Veritabanında Kaydı Olmayan Dosyaları Bul</h2>\n"; // Veritabanındaki tüm dosya yollarını al $db_files = []; $sql = "SELECT meta_value FROM wp_postmeta WHERE meta_key = '_wp_attached_file'"; try { $result = $mysqli->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $db_files[] = $wp_upload_dir . '/' . $row['meta_value']; } } // Yüklemeler klasöründeki tüm dosyaları recursive olarak tara $orphaned_files = findOrphanedFiles($wp_upload_dir, $db_files); if (count($orphaned_files) > 0) { echo "Toplam " . count($orphaned_files) . " adet veritabanında kaydı olmayan dosya bulundu:<br>\n"; foreach ($orphaned_files as $file) { echo $file . "<br>\n"; } } else { echo "Veritabanında kaydı olmayan dosya bulunamadı.<br>\n"; } } catch (mysqli_sql_exception $e) { echo "SQL Hatası: " . $e->getMessage() . "<br>\n"; } $mysqli->close(); /** * Belirtilen klasördeki tüm dosyaları recursive olarak tarar ve * veritabanında kaydı olmayan dosyaları bulur */ function findOrphanedFiles($directory, $db_files, &$orphaned = []) { $files = glob($directory . '/*'); foreach ($files as $file) { if (is_dir($file)) { // Klasörse içine gir findOrphanedFiles($file, $db_files, $orphaned); } else { // Dosya uzantısını kontrol et (sadece medya dosyaları) $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); $media_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'pdf', 'mp4', 'mp3', 'wav']; if (in_array($ext, $media_extensions) && !in_array($file, $db_files)) { $orphaned[] = $file; } } } return $orphaned; } - 26-03-2024, 20:37:13Harika oldu çok teşekkür ederimlookout adlı üyeden alıntı: mesajı görüntüle
- 26-03-2024, 21:35:31kod icin tesekkürler, suan manuel temizlik yaparken sunucu cache tuttugu icin isime ara vermek zorunda kaldim, sunucudan silinen görseller hala sitede ve media kütüphanesinde görünmeye devam ediyorlookout adlı üyeden alıntı: mesajı görüntüle
her yerden sildim ama sunucuya ssh erisimi yok diye bisey yapamadim, yarina toparlanir.
kodu test edecegim en yakin zamanda.
Öneri icin tesekkürler, fakat önce para kazanmak gerekiyor ki daha uzun vadede yatirim yapilabilsin, ve bildigim kadariyla ayri depolama sunucusu almakla kendi sunucunu büyütmek assagi yukari ayni maliyetlere geliyor. bundan dolayi buyuk bir sermaye ile girmeyen kisiler icin baslangic olarak bu sekilde yatirim yapmalari akillica olmaz sanirim. simdilik limitsiz disk, 1m iopslu, 2v4 paylasimli kullaniyorum site biraz is yapsin ilk isim 6v12 VPS almak olacak daha sonraki kademe dedicated zatenarberotum adlı üyeden alıntı: mesajı görüntüle
- 08-03-2025, 09:00:38Ayrı bir php dosyası oluşturup, kodu içine koymalısınız. Cpanelden dosya yöneticisine girip, public_html klasörü içinde bir php dosyası oluşturun(.php uzantılı olmalı), ardından kodları içine yerleştirip, veritabanı bağlantı ayarlarını kendi veritabanı bilgileriniz ile değiştirin.moonartmedya adlı üyeden alıntı: mesajı görüntüle
her yerden sildim ama sunucuya ssh erisimi yok diye bisey yapamadim, yarina toparlanir.