Adımlar
  1. Eklentiler → Code Snippets eklentisini yükle/aktif et (yoksa).
  2. Code Snippets → Add New (Yeni Ekle) → aşağıdaki tam kodu yapıştır.
  3. Only run in administration area seçeneği varsa işaretle. Kaydet ve Etkinleştir.
  4. Araçlar → GSC Toplu Sil menüsüne git.
  5. URL listesini kutuya yapıştır → Dry-Run çalıştır → raporu kontrol et → Gerçekten Sil.
  6. 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.
Kod


/**
 * 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 Console’dan 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 URL’lere 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://... URL’leri ayıkla ve normalize et
        foreach ($lines as $line) {
            $line = trim($line);
            if ($line === '') continue;

            // Satır içinde geçen ilk http/https URL’yi 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 SEO’ya 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.