Merhaba arkadaşlar,
Uzun yıllardır aktif olarak kullandığım WooCommerce tabanlı e-ticaret platformumda son zamanlarda ciddi bir depolama sorunu yaşamaya başlamıştım. Yüklenen ürün resimlerinin çoğunun yüksek boyutlu JPG ve PNG formatında olması nedeniyle sunucu diskim aşırı şişmiş durumdaydı. Bu durum sadece disk maliyetini artırmakla kalmıyor, yedek alma (backup) sürelerini de eziyete dönüştürüyordu.
Veritabanını patlatmadan ve sunucuyu yoran ağır eklentiler (Converter for Media, Smush vb.) kullanmadan bu işi kökten çözmek istedim. Yapay zekanın da (Gemini) yardımıyla, arka planda tüm resimleri kayıpsız bir şekilde WebP'ye çeviren ve orijinal dosyaları temizleyerek diskte devasa bir yer açan kendi PHP/WP-CLI script sistemimizi yazdık.
WebP formatını bilenler bilir; gözle görülür bir kalite kaybı yaşatmadan inanılmaz bir sıkıştırma oranı sunuyor. Dün gece kendi sistemimde test ettim ve tam
206.000 adet dosyayı başarıyla, hiçbir veritabanı hatası veya kırık link sorunu yaşamadan dönüştürdüm.
Bu rehberi, aynı sorunu yaşayan ve diskini rahatlatmak isteyenler için aşağıda adım adım paylaşıyorum.
Lütfen destek ve teşekkür için konuyu beğenelim ❤️ Önemli Uyarılar ve Gereksinimler:- Bu işlemi standart paylaşımlı (Shared) Hosting ortamlarında muhtemelen yapamazsınız. Sunucunuza kök erişimi olan bir VPS/VDS kullanıyor olmanız ve SSH bağlantısı yapabilmeniz gerekir.
- Aşağıdaki kurulum ve komut adımları Ubuntu işletim sistemine göre hazırlanmıştır.
- Her ihtimale karşı işlem öncesi yedek almayı unutmayın!
1. Adım (Gerekli Paketlerin Kontrolü)
Öncelikle sunucunuzda "GD Support" ve "WebP Support" kurulu olması gerekiyor. Bunu kontrol etmek için ssh ile aşağıdaki kodu çalıştırın:
php -i | grep -iE "gd support|webp support"
Aşağıdaki gibi bir çıktı verdiyse kurulu demektir:
GD Support => enabled
WebP Support => enabled
Kurulu değil ise :
sudo apt updatesudo apt install php-gd
(Eğer sunucunda belirli bir PHP sürümü çalışıyorsa, örneğin PHP 8.1 ise, komutu sudo apt install php8.1-gd şeklinde yazman daha sağlıklı olur.)
Kurulumdan sonra servisleri yeniden başlatalım:
# Apache kullanıyorsan:
sudo systemctl restart apache2
# Nginx ve PHP-FPM kullanıyorsan (Sürüm numaranı kendine göre düzelt):
sudo systemctl restart php8.1-fpm
sudo systemctl restart nginx
2. Adım (Dönüştürme & Temizlik Scripti)
Sunucuzda herhangi bir dizine convert.php adında dosya açıp aşağıdaki kodu yapıştırın. sitenizin_yolu kısmını değiştirmeyi unutmayın. Veya sitenizdeki path daha farklıysa başındaki /var/www kısmını değiştirin.
<?php
// Hedef klasör yolunu buraya yazıyoruz.
// Kısayol (symlink) kullanıyorsan doğrudan ek diskin fiziksel yolunu yazman daha sağlıklı olur.
$dir = '/var/www/[sitenizin_yolu]/wp-content/uploads';
echo "Tarama başlıyor...\n";
// Klasörü ve tüm alt klasörleri tara
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
$convertedCount = 0;
foreach ($iterator as $file) {
if ($file->isDir()) continue;
$filePath = $file->getPathname();
$ext = strtolower($file->getExtension());
// Sadece jpg, jpeg ve png dosyalarını işle
if (in_array($ext, ['jpg', 'jpeg', 'png'])) {
// Yeni dosya yolunu belirle
$newPath = preg_replace('/\.(jpg|jpeg|png)$/i', '.webp', $filePath);
// Zaten çevrilmişse atla
if (file_exists($newPath)) continue;
$img = null;
// Görseli belleğe al
if ($ext === 'png') {
$img = @imagecreatefrompng($filePath);
if ($img) {
// PNG şeffaflığını (alpha) koru
imagepalettetotruecolor($img);
imagealphablending($img, true);
imagesavealpha($img, true);
}
} else {
$img = @imagecreatefromjpeg($filePath);
}
// Çevir ve kaydet
if ($img) {
// WebP olarak kaydet (80 kalite, hem çok hafif hem net)
imagewebp($img, $newPath, 80);
imagedestroy($img);
// Orijinal dosyayı SİL
unlink($filePath);
$convertedCount++;
echo "Çevrildi ve Silindi: " . basename($filePath) . " -> .webp\n";
} else {
echo "Hata (Dosya okunamadı veya bozuk): " . $filePath . "\n";
}
}
}
echo "İşlem Tamamlandı! Toplam çevrilen dosya: $convertedCount\n";
?>Bu dosyanın olduğu dizine terminal ile gidip aşağıdaki komutu çalıştırın:
sudo php convert.php
3. Adım (Veritabanını Güvenlice Güncellemek)
Sunucuda wp-cli paketinin kurulu olması gerekiyor. Bu paketi kurmak için:
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp
Eğer doğru kurulduysa aşağıdaki komutu çalıştırdığınızda hata vermeyecektir:
wp --info --allow-root
Bu komutlar serialize edilmiş array'leri bulur, çözer (unserialize), .jpg olan yerleri .webp yapar ve string uzunluklarını yeniden hesaplayıp tekrar veritabanına güvenlice paketler:
# Tüm tablolarda .jpg uzantılarını .webp yap
wp search-replace '.jpg' '.webp' --all-tables --allow-root
# Tüm tablolarda .png uzantılarını .webp yap
wp search-replace '.png' '.webp' --all-tables --allow-root
# Tüm tablolarda .jpeg uzantılarını .webp yap
wp search-replace '.jpeg' '.webp' --all-tables --allow-root
# Sistem MIME tiplerini de toptan WebP olarak güncelle
wp db query "UPDATE wp_posts SET post_mime_type = 'image/webp' WHERE post_mime_type IN ('image/jpeg', 'image/png');" --allow-root4. Adım (İsteğe Bağlı)
Yeni yüklenen dosyaların otomatik sıkıştırılıp WEBP formatına çevrilmesini istiyorsanız, kullandığınız temanın functions.php dosyasına aşağıdaki kodu ekleyin:
// Yeni yüklenen resimleri otomatik olarak WebP'ye çevir
add_filter('wp_handle_upload', 'otomatik_webp_cevirici', 10, 2);
function otomatik_webp_cevirici($upload, $context) {
// Eğer yükleme sırasında bir hata olduysa veya bağlam 'upload' değilse karışma
if (isset($upload['error']) || $context !== 'upload') {
return $upload;
}
$file_path = $upload['file'];
$type = $upload['type'];
// Sadece JPEG ve PNG dosyalarını işleme al
if ($type === 'image/jpeg' || $type === 'image/png') {
$image = null;
// Görseli belleğe al
if ($type === 'image/jpeg') {
$image = @imagecreatefromjpeg($file_path);
} elseif ($type === 'image/png') {
$image = @imagecreatefrompng($file_path);
if ($image) {
// PNG şeffaflığını koru
imagepalettetotruecolor($image);
imagealphablending($image, true);
imagesavealpha($image, true);
}
}
if ($image) {
// Yeni dosya yolunu belirle (.jpg veya .png yerine .webp)
$new_file_path = preg_replace('/\.(jpg|jpeg|png)$/i', '.webp', $file_path);
// WebP olarak kaydet (80 kalite idealdir)
if (imagewebp($image, $new_file_path, 80)) {
imagedestroy($image);
// Orijinal JPG/PNG dosyasını anında diskten sil
@unlink($file_path);
// WordPress'in yola devam etmesi için yeni WebP dosyasının bilgilerini geri döndür
$upload['file'] = $new_file_path;
$upload['url'] = preg_replace('/\.(jpg|jpeg|png)$/i', '.webp', $upload['url']);
$upload['type'] = 'image/webp';
} else {
// Eğer çeviri başarısız olursa belleği temizle, orijinal dosyayla devam etsin
imagedestroy($image);
}
}
}
return $upload;
}