***************************************************************************************************
BU UYARIYI OKUYUNUZ.....!!! :
İşlem öncesi, forum'un hem dizin hem de veritabanı yedeğini mutlaka alın....
Betiği, yerel makinenizde Windows için XAMPP, GNU/Linux için LAMPP sunucu yazılımı ile forum'un bir kopyası üzerinde deneyin.
***************************************************************************************************
KOD İÇERİĞİ ( Smf Broken Images.php) :
Kod: Tümünü seç
<?php
// Veritabanı bağlantı ayarları
$host = 'localhost'; // SMF veritabanı sunucusu
$dbname = 'smf_database'; // SMF veritabanı adı
$user = 'smf_user'; // SMF veritabanı kullanıcı adı
$pass = 'smf_password'; // SMF veritabanı şifresi
$prefix = 'smf_'; // SMF tablo öneki
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Veritabanı bağlantı hatası: " . $e->getMessage());
}
// Forum konularını ve içeriklerini çek
$sql = "SELECT m.id_msg, m.body, t.id_topic, t.id_board, t.poster_time, t.subject
FROM {$prefix}topics t
JOIN {$prefix}messages m ON t.id_first_msg = m.id_msg
ORDER BY t.poster_time ASC";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$topics = $stmt->fetchAll(PDO::FETCH_ASSOC);
$broken_topics = ;
// Resim URL'lerini kontrol etmek için işlev
function is_broken_image($url) {
$headers = @get_headers($url);
if (!$headers || strpos($headers[0], '404') !== false) {
return true;
}
return false;
}
// Konuları kontrol et
foreach ($topics as $topic) {
preg_match_all('/\[img\](.*?)\[\/img\]/i', $topic['body'], $matches);
$broken = false;
foreach ($matches[1] as $img_url) {
if (is_broken_image($img_url)) {
$broken = true;
break;
}
}
if ($broken) {
$broken_topics = $topic;
}
}
// Kırık resimli konuları göster
if (empty($broken_topics)) {
echo "Kırık resimli konu bulunamadı.";
} else {
echo "<h2>Kırık Resimli Konular</h2><ul>";
foreach ($broken_topics as $topic) {
echo "<li>{$topic['subject']} (ID: {$topic['id_topic']})</li>";
}
echo "</ul>";
}
// Toplu silme işlemi (isteğe bağlı)
if (isset($_POST['delete_topics'])) {
foreach ($broken_topics as $topic) {
// Konuyu sil
$delete_sql = "DELETE FROM {$prefix}topics WHERE id_topic = ?";
$delete_stmt = $pdo->prepare($delete_sql);
$delete_stmt->execute([$topic['id_topic']]);
// Yetim mesajları sil
$delete_msgs_sql = "DELETE FROM {$prefix}messages WHERE id_topic = ?";
$delete_msgs_stmt = $pdo->prepare($delete_msgs_sql);
$delete_msgs_stmt->execute([$topic['id_topic']]);
}
echo "Kırık resimli konular ve yetim mesajlar silindi.";
}
?>
<form method="post">
<button type="submit" name="delete_topics">Kırık Resimli Konuları ve Yetim Mesajları Sil</button>
</form>
SMF Forum İçin Kırık Resim Kontrol ve Toplu Silme Betiği Hazır!
Bu betik, SMF forumundaki konuları tarayarak kırık resim içerip içermediğini kontrol eder ve isteğe bağlı olarak kırık resimli konuları siler.
SMF Forum İçin Faydaları
SMF forumunda kırık konuların temizlenmesi, SEO’yu iyileştirir, kullanıcı deneyimini artırır, veritabanını hızlandırır ve moderatörlerin iş yükünü azaltır.Ayrıca, manuel olarak konuları tek tek incelemek yerine otomatik bir betik kullanarak çok daha hızlı işlem yapabilir.
Silme İşleminden Sonra "Temizlik İşleminin" DOĞRULANMASI (MySQL Sorgusu)
Eğer veritabanından silindiğini manuel kontrol etmek istiyorsanız, aşağıdaki SQL sorgularını çalıştırabilirsiniz.
Silinen Konular Var mı?
Kod: Tümünü seç
SELECT * FROM smf_topics WHERE id_topic NOT IN (SELECT DISTINCT id_topic FROM smf_messages);
Yetim Mesajlar Kaldı mı?
Kod: Tümünü seç
SELECT * FROM smf_messages WHERE id_topic NOT IN (SELECT id_topic FROM smf_topics);
Özetle;
Eğer bu sorgular boş sonuç döndürüyorsa, konular ve mesajlar gerçekten silinmiştir.
NOT :
Yukarıdaki kodlama da "Yetim Mesajları Silme Özelliği" de var.Böylece betik, kırık resimli konularla birlikte yetim mesajları da temizleyebilme özelliği de kazanmıştır. Silme işlemi sonrası, konuya bağlı mesajlar kalmayacak, ve forum veritabanından da kalıcı bir şekilde temizlenecektir.