Aş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;
}