• 26-03-2024, 19:36:45
    #1
    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?
  • 26-03-2024, 20:04:27
    #2
    Mubido & FatBotter
    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;
    }
  • 26-03-2024, 20:37:13
    #3
    lookout adlı üyeden alıntı: mesajı görüntüle
    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
    $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);
    }
    
    // Görsellere ait kayıtların çekilmesi
    $sql = "SELECT * FROM wp_postmeta WHERE meta_key = '_wp_attached_file'";
    $result = $mysqli->query($sql);
    
    if ($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            $file_path = $wp_upload_dir . '/' . $row['meta_value'];
            $post_id = $row['post_id'];
    
            // Post kontrolü
            $post_check_sql = "SELECT * FROM wp_posts WHERE ID = $post_id";
            $post_check_result = $mysqli->query($post_check_sql);
    
            // İlişkili post yoksa sil
            if ($post_check_result->num_rows == 0) {
                // Dosyayı sil
                if (file_exists($file_path)) {
                    unlink($file_path);
                    echo "Silindi: " . $file_path . "\n";
                }
    
                // Veritabanı kaydını sil
                $delete_sql = "DELETE FROM wp_postmeta WHERE meta_id = ".$row['meta_id'];
                if ($mysqli->query($delete_sql) === TRUE) {
                    echo "Veritabanından silindi: " . $row['meta_id'] . "\n";
                } else {
                    echo "Hata: " . $mysqli->error . "\n";
                }
            }
        }
    } else {
        echo "Görsel kaydı bulunamadı.";
    }
    
    $mysqli->close();
    Harika oldu çok teşekkür ederim
  • 26-03-2024, 20:44:40
    #4
    eğer çok yüksek sayıda resim dosyası olacak ise ayrıca resim sunucusunu ayırmanızda fayda olacaktır.
    örnek : bknz
  • 26-03-2024, 21:35:31
    #5
    lookout adlı üyeden alıntı: mesajı görüntüle
    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.
    kod 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 ediyor her yerden sildim ama sunucuya ssh erisimi yok diye bisey yapamadim, yarina toparlanir.

    kodu test edecegim en yakin zamanda.



    arberotum adlı üyeden alıntı: mesajı görüntüle
    eğer çok yüksek sayıda resim dosyası olacak ise ayrıca resim sunucusunu ayırmanızda fayda olacaktır.
    Ö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 zaten
  • 02-03-2025, 20:41:44
    #6
    bu kodu tam olarak nereye hangi isimli klasore yapıstracagız
  • 08-03-2025, 09:00:38
    #7
    Mubido & FatBotter
    moonartmedya adlı üyeden alıntı: mesajı görüntüle
    bu kodu tam olarak nereye hangi isimli klasore yapıstracagız
    Ayrı 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.