Adımlar
- Eklentiler → Code Snippets eklentisini yükle/aktif et (yoksa).
- Code Snippets → Add New (Yeni Ekle) → aşağıdaki tam kodu yapıştır.
- Only run in administration area seçeneği varsa işaretle. Kaydet ve Etkinleştir.
- Araçlar → GSC Toplu Sil menüsüne git.
- URL listesini kutuya yapıştır → Dry-Run çalıştır → raporu kontrol et → Gerçekten Sil.
- URL listesini almak için search console tarandı ama dizine eklenmedi hata sayfasına gidin, toplu kopyalayarak Chatgpt aracılığıyla parça parça listeleyip silme aracına aktarabilirsiniz.
/**
* Admin aracı: GSC URL listesine göre toplu silme
* Code Snippets ile ekleyin. Etkinleştirince Araçlar -> GSC Toplu Sil menüsü oluşur.
*/
add_action('admin_menu', function () {
add_management_page(
'GSC Toplu Sil', 'GSC Toplu Sil', 'manage_options', 'gsc-bulk-delete',
'gsc_bulk_delete_render_page'
);
});
function gsc_bulk_delete_render_page() {
if ( ! current_user_can('manage_options') ) {
wp_die('Bu işlem için yetkin yok.');
}
$action = isset($_POST['gsc_action']) ? sanitize_text_field($_POST['gsc_action']) : '';
$urls_text = isset($_POST['gsc_urls']) ? trim(wp_unslash($_POST['gsc_urls'])) : '';
$nonce_ok = isset($_POST['_wpnonce']) && wp_verify_nonce(sanitize_text_field($_POST['_wpnonce']), 'gsc_bulk_delete');
echo '<div class="wrap"><h1>GSC Toplu Sil</h1>';
echo '<p>Search Consoledan aldığın <strong>URL listesini</strong> (her satır 1 URL) aşağıya yapıştır. Önce <em>Dry-Run</em> ile kontrol et; ardından <em>Gerçekten Sil</em> ile kalıcı sil.</p>';
echo '<form method="post">';
wp_nonce_field('gsc_bulk_delete');
echo '<textarea name="gsc_urls" rows="15" style="width:100%; font-family:monospace;" placeholder="https://www.site.com/yazi-1/
https://www.site.com/yazi-2/
...">'
. esc_textarea($urls_text) . '</textarea>';
echo '<p style="margin-top:10px;">';
echo '<button class="button button-secondary" name="gsc_action" value="dry" type="submit">Dry-Run (Silmeden göster)</button> ';
echo '<button class="button button-primary" name="gsc_action" value="delete" type="submit" ';
echo 'onclick="return confirm(\'Seçili URLlere karşılık gelen yazılar kalıcı olarak silinecek. Emin misin?\');">Gerçekten Sil (Kalıcı)</button>';
echo '</p>';
echo '</form>';
if ($action && $nonce_ok) {
$lines = preg_split('/\r\n|\r|\n/', $urls_text);
$urls = array();
// Metinden https://... URLleri ayıkla ve normalize et
foreach ($lines as $line) {
$line = trim($line);
if ($line === '') continue;
// Satır içinde geçen ilk http/https URLyi yakala
if (preg_match('~https?://[^\s"\'<>]+~i', $line, $m)) {
$u = $m[0];
// Alan adı farklıysa yine işle (istersen burada domain filtreleyebilirsin)
// /feed/ sonlarını kaldır, sonda tek slash bırak
$u = preg_replace('~/(feed/?)?$~', '/', $u);
$u = preg_replace('~/+?$~', '/', $u);
$urls[$u] = true; // uniq
}
}
$urls = array_keys($urls);
if (empty($urls)) {
echo '<div class="notice notice-warning"><p>İşlenecek URL bulunamadı.</p></div>';
echo '</div>';
return;
}
echo '<h2>Rapor</h2>';
echo '<table class="widefat striped"><thead><tr>
<th style="width:45%;">URL</th>
<th style="width:10%;">Durum</th>
<th style="width:15%;">Post ID</th>
<th style="width:10%;">Tip</th>
<th>Başlık</th>
</tr></thead><tbody>';
$deleted = 0; $matched = 0; $miss = 0;
foreach ($urls as $url) {
$post_id = url_to_postid($url);
// Fallback: path üzerinden brute-force (post/page/CPT)
if (!$post_id) {
$path = trim(parse_url($url, PHP_URL_PATH), '/');
if ($path) {
$candidates = array_unique([$path, untrailingslashit($path)]);
$post_types = get_post_types(['public' => true], 'names');
foreach ($candidates as $p) {
foreach ($post_types as $pt) {
$obj = get_page_by_path($p, OBJECT, $pt);
if ($obj && isset($obj->ID)) { $post_id = (int) $obj->ID; break 2; }
}
}
}
}
if ($post_id) {
$matched++;
$type = get_post_type($post_id);
$title = get_the_title($post_id);
$status = 'OK';
if ($action === 'delete') {
// Kalıcı sil: true (çöp kutusu istersen false yap)
wp_delete_post($post_id, true);
$status = 'DELETED';
$deleted++;
}
printf(
'<tr><td>%s</td><td><strong>%s</strong></td><td>%d</td><td>%s</td><td>%s</td></tr>',
esc_html($url), esc_html($status), $post_id, esc_html($type), esc_html($title)
);
} else {
$miss++;
printf(
'<tr><td>%s</td><td><strong>MISS</strong></td><td></td><td></td><td>Post bulunamadı (muhtemelen arşiv/pagination/feed)</td></tr>',
esc_html($url)
);
}
}
echo '</tbody></table>';
echo '<p><strong>Özet:</strong> Eşleşen: ' . esc_html($matched) . ' | MISS: ' . esc_html($miss)
. ($action === 'delete' ? ' | Silinen: ' . esc_html($deleted) : '') . '</p>';
}
echo '</div>';
}


Uyarı: Silme kalıcıdır. Başlamadan önce veritabanı yedeği al.👉 Faydalı olabileceği durumlar:
- Eğer bu sayfalar zayıf içerik (ör. 200 kelime altında, yüzeysel yazılar, kopya içerik) ise → kaldırmak sitenin genel içerik kalitesini artırır.
- Eğer içerikler spam / otomatik üretilmiş yazılar ise → kaldırmak faydalıdır.
- Eğer feed veya /page/ gibi sayfalar listede varsa → bunların kalıcı silinmesi SEOya zarar vermez, aksine temizlik olur.
👉 Faydalı olmayabileceği / zararlı olabileceği durumlar:
- Eğer içerikler aslında değerli ama sadece Google şu an dizine almamışsa → silmek, sitenin potansiyel trafiğini öldürür.
- Dizine eklenmedi demek her zaman çöpe at demek değildir. Bazen sabır ve iç linkleme / backlink ile bu içerikler indekslenebilir.
Faydalı olabileceği durumlar: