Etiket arşivi: WordPress veritabanı hatası

WordPress Etiket Eklenemedi Hatası: term_taxonomy_id AUTO_INCREMENT Sorunu ve Çözümü

WordPress yönetim panelinde yazılara yeni bir etiket eklemek istediğinizde “Terim sınıflandırması veritabanına eklenmedi” (Could not insert term into the database) hatasıyla karşılaşabilirsiniz. Bu hata, ilk bakışta etiket tablosuyla ilgili basit bir veritabanı problemi gibi görünse de bazı durumlarda WordPress’in taksonomi kayıtlarını oluşturmak için kullandığı veritabanı alanlarından kaynaklanır.

Bu durum sitenin saldırıya uğrayıp temizlendikten sonra veritabanında meydana gelen bozukluklardan da ortaya çıkabilir.

Bu yazıda, karşılaşılan hatanın teknik nedenini, veritabanında yapılan incelemeleri ve sorunu gidermek için uygulanan SQL işlemlerini ele alıyoruz.

1. WordPress etiketleri veritabanında nasıl saklanır?

WordPress’te etiketler, kategoriler ve diğer taksonomi kayıtları birden fazla veritabanı tablosu üzerinden yönetilir.

Standart WordPress yapısında bu işlem üç temel tabloyla gerçekleştirilir:

  • wp_terms: Etiket ve kategori gibi terimlerin adını ve kısa açıklamasını saklar.
  • wp_term_taxonomy: Terimin etiket, kategori veya başka bir taksonomi türünde olduğunu belirtir.
  • wp_term_relationships: Yazılar ile etiket ve kategoriler arasındaki ilişkiyi tutar.

Bu tablolar arasındaki bağlantı, WordPress’in içerik sınıflandırma sisteminin doğru çalışması açısından önemlidir.

Örneğin yeni bir etiket oluşturulduğunda WordPress önce terim kaydını oluşturur, ardından bu terimi ilgili taksonomiye bağlayan term_taxonomy kaydını ekler.

2. Hatanın asıl nedeni ne?

Bu durumu yaşadığımız örnek veritabanında iyd_term_taxonomy tablosunun yapısında bir bozulma tespit edildi.

Sorun, tablonun birincil anahtar alanı olan term_taxonomy_id sütunundaydı.

Bu sütunun normalde şu özelliklere sahip olması gerekir:

  • Veri tipi: BIGINT(20) UNSIGNED
  • Birincil anahtar (PRIMARY KEY)
  • NOT NULL
  • AUTO_INCREMENT

Ancak yaptığımız incelemede term_taxonomy_id alanının AUTO_INCREMENT özelliğini kaybettiğini gördük.

Bu ne anlama geliyor?

WordPress yeni bir etiket oluşturduğunda, term_taxonomy tablosuna yeni bir kayıt eklenmesi gerekir. AUTO_INCREMENT özelliği bulunmayan birincil anahtar alanı, yeni kayıtlar için otomatik ve benzersiz ID üretme görevini yerine getiremez.

Dolayısıyla WordPress’in yeni taksonomi kaydı oluşturma işlemi başarısız olabiliyordu.

Veritabanında tespit edilen diğer anormallikler

Tablodaki kayıtları incelerken iki dikkat çekici durum daha gördük:

  • term_taxonomy_id değeri 0 olan bir kayıt bulunuyordu.
  • Mevcut kayıtlar arasında 54 numaralı ID bulunurken AUTO_INCREMENT özelliği devre dışıydı.

Bu durum, AUTO_INCREMENT özelliğini doğrudan yeniden etkinleştirmeye çalıştığımızda da karşımıza çıktı.

3. AUTO_INCREMENT neden doğrudan etkinleştirilemedi?

İlk olarak aşağıdaki SQL sorgusunu uyguladık:

ALTER TABLE iyd_term_taxonomy
MODIFY term_taxonomy_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;

Ancak MySQL şu hatayı verdi:

#1062 - ALTER TABLE causes auto_increment resequencing,
resulting in duplicate entry '54' for key 'PRIMARY'

Bu hata, tablo yeniden düzenlenirken AUTO_INCREMENT değerlerinin yeniden sıralanması sırasında mevcut birincil anahtar değerleriyle çakışma oluştuğunu gösteriyordu.

İncelemede term_taxonomy_id = 0 olan kaydın bulunduğunu ve 53 numaralı ID’nin kullanılmadığını belirledik.

Ayrıca term_taxonomy_id = 0 olan kayda bağlı herhangi bir yazı-kategori/etiket ilişkisi bulunmadığını doğruladık.

Bu nedenle sıfır değerli kaydı, boşta bulunan 53 numaralı ID’ye taşıyarak çakışmanın önüne geçtik.

4. Sorunu nasıl çözdük?

İlk olarak veritabanının yedeğinin alınmasını öneriyoruz. Ardından phpMyAdmin üzerinden aşağıdaki SQL sorgusunu çalıştırıyoruz.

1. Adım: Sıfır değerli ID’yi boşta bulunan 53 numaralı ID ile değiştirmek

UPDATE iyd_term_taxonomy
SET term_taxonomy_id = 53
WHERE term_taxonomy_id = 0;

Bu işlem, term_taxonomy_id değeri sıfır olan kaydın birincil anahtarını 53 olarak güncelledi.

2. Adım: AUTO_INCREMENT özelliğini yeniden etkinleştirmek

ALTER TABLE iyd_term_taxonomy
MODIFY term_taxonomy_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;

Böylece term_taxonomy_id alanı yeniden otomatik ID üretebilir hale geldi ve WordPress’in yeni taksonomi kayıtlarını oluşturmasının önündeki engel kaldırıldı.

5. WordPress veritabanı onarımı yeterli olur mu?

WordPress’in yerleşik veritabanı onarım aracı, bazı tablo bütünlüğü ve onarım işlemlerinde yardımcı olabilir.

Bunun için wp-config.php dosyasına geçici olarak şu satır eklenebilir:

define('WP_ALLOW_REPAIR', true);

Ardından aşağıdaki adres ziyaret edilebilir:

https://siteadresi.com/wp-admin/maint/repair.php

Ancak bu araç, her yapısal veritabanı sorununu çözmez. Bizim karşılaştığımız problemde tabloların genel durumu onarım aracı tarafından normal olarak raporlanmasına rağmen AUTO_INCREMENT özelliği eksikti.

Bu nedenle doğrudan MySQL tablo yapısına müdahale etmek gerekti.

İşlem tamamlandıktan sonra güvenlik açısından WP_ALLOW_REPAIR satırının wp-config.php dosyasından kaldırılması gerekir.

6. Bu sorun neden ortaya çıkmış olabilir?

AUTO_INCREMENT özelliğinin neden kaybolduğunu kesin olarak belirlemek için geçmiş veritabanı işlemlerinin ve yedeklerin incelenmesi gerekir.

Bununla birlikte aşağıdaki durumlar bu tür tablo yapısı bozulmalarına yol açabilir:

  • Hatalı veya yarım kalmış SQL sorguları.
  • Veritabanı taşıma ve geri yükleme işlemlerindeki yapısal farklılıklar.
  • Manuel tablo düzenlemeleri.
  • Hatalı çalışan eklenti veya özel kodların veritabanına müdahalesi.
  • Yetkisiz erişim veya kötü amaçlı veritabanı değişiklikleri.

Özellikle daha önce güvenlik ihlali yaşanmış WordPress sitelerinde yalnızca dosyaları değil, veritabanı yapısını da kontrol etmek önemlidir.