WordPress’te Klasik Editörü Belirli Kullanıcılar İçin Etkinleştirme

WordPress 5.0 ile hayatımıza giren Gutenberg editörü, blok tabanlı yapısıyla içerik üretimini tamamen değiştirdi. Ama dürüst olalım: Gutenberg her kullanıcı için ideal değil. Özellikle yıllarca klasik editörle çalışmış içerik yazarları, müşteriler ya da editörler için bu geçiş ciddi bir verimlilik kaybına yol açabiliyor. “Neden düğmelerim değişti?”, “Eski yazı ekranı nereye gitti?” gibi sorularla destek talebi almak istemiyorsanız, doğru yaklaşım Gutenberg’i tamamen kapatmak değil, belirli kullanıcılar için klasik editörü etkinleştirmek.

Bu yazıda WordPress functions.php dosyası üzerinden, kullanıcı rolüne ya da kullanıcı adına göre klasik editörü seçici biçimde nasıl aktif edeceğinizi ele alacağız.

Neden Tüm Kullanıcılar İçin Değil?

Gutenberg’i site genelinde kapatmak kolay. Classic Editor eklentisini kuruyorsunuz, bitti. Ama bu yaklaşım bazı durumlarda mantıklı değil:

  • Site yöneticileri ve geliştiriciler Gutenberg’in blok yapısını kullanmak istiyor
  • Sadece müşteri hesapları ya da belirli yazarlar klasik editörle daha rahat çalışıyor
  • WooCommerce ürün sayfaları için Gutenberg kullanılıyor ama blog yazıları klasik editörde yazılıyor
  • Farklı ekip üyelerinin farklı ihtiyaçları var

Bu senaryolarda “herkese aynı editör” mantığı işe yaramıyor. Granüler bir kontrol mekanizması kurmak gerekiyor.

Temel Yaklaşım: use_block_editor_for_post Filtresi

WordPress, hangi gönderi için hangi editörün kullanılacağını use_block_editor_for_post filtresiyle belirliyor. Bu filtreye müdahale ederek çok esnek çözümler üretebilirsiniz.

Temel mantık şu: Filtre true döndürürse Gutenberg açılır, false döndürürse klasik editör devreye girer.

// functions.php'ye eklenecek temel örnek
add_filter('use_block_editor_for_post', 'klasik_editor_kontrol', 10, 2);

function klasik_editor_kontrol($use_block_editor, $post) {
    // Mevcut kullanıcıyı al
    $current_user = wp_get_current_user();
    
    // Belirli bir kullanıcı adı için klasik editörü zorla
    if ($current_user->user_login === 'ahmet_yazar') {
        return false;
    }
    
    // Diğer kullanıcılar için mevcut ayarı koru
    return $use_block_editor;
}

Bu örnekte ahmet_yazar kullanıcı adına sahip kişi giriş yaptığında, tüm gönderi düzenleme ekranları otomatik olarak klasik editörle açılır.

Kullanıcı Rolüne Göre Klasik Editör

Tek tek kullanıcı adı yazmak yerine rol bazlı kontrol çok daha yönetilebilir bir yaklaşım. Örneğin tüm author (yazar) rolündeki kullanıcılar klasik editör kullanacak ama administrator ve editor rolleri Gutenberg’de çalışacak.

add_filter('use_block_editor_for_post', 'rol_bazli_klasik_editor', 10, 2);

function rol_bazli_klasik_editor($use_block_editor, $post) {
    $current_user = wp_get_current_user();
    
    // Klasik editör kullanacak roller
    $klasik_editor_rolleri = array('author', 'contributor', 'subscriber');
    
    // Kullanıcının rolleri ile hedef roller kesişiyor mu?
    $kesisen_roller = array_intersect($klasik_editor_rolleri, (array) $current_user->roles);
    
    if (!empty($kesisen_roller)) {
        return false; // Klasik editörü aktif et
    }
    
    return $use_block_editor;
}

Bu yapıda yeni bir yazar eklediğinizde ekstra bir şey yapmanıza gerek yok. Rol ataması yeterli, sistem otomatik olarak klasik editörü gösteriyor.

Birden Fazla Kullanıcı Adı İçin Liste Tabanlı Kontrol

Bazen rol bazlı kontrol yetmiyor. Aynı roldeki kullanıcıların bir kısmı Gutenberg, bir kısmı klasik editör kullanacak. Bu durumda kullanıcı adı listesi tutmak daha pratik.

add_filter('use_block_editor_for_post', 'liste_bazli_klasik_editor', 10, 2);

function liste_bazli_klasik_editor($use_block_editor, $post) {
    $current_user = wp_get_current_user();
    
    // Klasik editör kullanacak kullanıcı adları
    $klasik_editor_kullanicilari = array(
        'mehmet_editör',
        'fatma_yazar',
        'ali_muhabir',
        'zeynep_content',
        'customer_writer_01'
    );
    
    if (in_array($current_user->user_login, $klasik_editor_kullanicilari)) {
        return false;
    }
    
    return $use_block_editor;
}

Bu liste büyüdükçe yönetimi zorlaşır ama küçük ekipler için oldukça işe yarayan bir çözüm.

Kullanıcı Meta Verisiyle Dinamik Kontrol

Daha profesyonel bir yaklaşım için kullanıcı meta verisini kullanabilirsiniz. Her kullanıcıya özel bir meta alan ekleyip bu alana göre editör tercihini belirleyebilirsiniz. Bu yöntem özellikle çok kullanıcılı büyük sitelerde tercih edilir.

// Kullanıcı için meta kaydetme fonksiyonu
function klasik_editor_meta_kaydet($user_id) {
    if (!current_user_can('edit_user', $user_id)) {
        return;
    }
    
    if (isset($_POST['kullanici_klasik_editor'])) {
        update_user_meta($user_id, 'tercih_klasik_editor', '1');
    } else {
        delete_user_meta($user_id, 'tercih_klasik_editor');
    }
}
add_action('personal_options_update', 'klasik_editor_meta_kaydet');
add_action('edit_user_profile_update', 'klasik_editor_meta_kaydet');

// Kullanıcı profil sayfasına onay kutusu ekle
function klasik_editor_profil_alani($user) {
    $tercih = get_user_meta($user->ID, 'tercih_klasik_editor', true);
    ?>
    <h3>Editör Tercihi</h3>
    <table class="form-table">
        <tr>
            <th><label for="kullanici_klasik_editor">Klasik Editör Kullan</label></th>
            <td>
                <input type="checkbox" 
                       name="kullanici_klasik_editor" 
                       id="kullanici_klasik_editor" 
                       value="1" 
                       <?php checked($tercih, '1'); ?> />
                <span class="description">İşaretlerseniz klasik WordPress editörünü kullanırsınız.</span>
            </td>
        </tr>
    </table>
    <?php
}
add_action('show_user_profile', 'klasik_editor_profil_alani');
add_action('edit_user_profile', 'klasik_editor_profil_alani');

// Filtre ile editör seçimi
add_filter('use_block_editor_for_post', 'meta_bazli_klasik_editor', 10, 2);

function meta_bazli_klasik_editor($use_block_editor, $post) {
    $current_user = wp_get_current_user();
    $tercih = get_user_meta($current_user->ID, 'tercih_klasik_editor', true);
    
    if ($tercih === '1') {
        return false;
    }
    
    return $use_block_editor;
}

Bu yaklaşımın güzel yanı: Kullanıcılar kendi profil sayfasından tercihlerini değiştirebilir ya da yönetici istediği kullanıcı için bu ayarı yapabilir. Kod düzenlemenize gerek kalmaz.

Gönderi Türüne ve Kullanıcıya Göre Kombine Kontrol

Gerçek dünya senaryolarında genellikle hem kullanıcı hem de içerik türü bir arada değerlendiriliyor. Örneğin, yazarlar blog yazıları için klasik editör kullansın ama sayfa düzenlemede Gutenberg çalışsın.

add_filter('use_block_editor_for_post', 'kombinasyon_editor_kontrol', 10, 2);

function kombinasyon_editor_kontrol($use_block_editor, $post) {
    $current_user = wp_get_current_user();
    
    // Kullanıcı 'author' rolündeyse ve 'post' türü düzenleniyorsa
    if (in_array('author', (array) $current_user->roles) && $post->post_type === 'post') {
        return false; // Blog yazıları için klasik editör
    }
    
    // Belirli bir kullanıcı adı ve sayfa türü kombinasyonu
    $ozel_kullanicilar = array('freelance_yazar', 'dis_muhabir');
    if (in_array($current_user->user_login, $ozel_kullanicilar) && 
        in_array($post->post_type, array('post', 'portfolio'))) {
        return false;
    }
    
    return $use_block_editor;
}

WooCommerce Ürünleri İçin Özel Durum

WooCommerce kullanan sitelerde ürün sayfaları için Gutenberg genellikle tercih edilmiyor çünkü WooCommerce kendi meta kutularını klasik editör üzerine inşa etmiş. Bu durumda ürün yöneticilerini ayrı ele almak mantıklı:

add_filter('use_block_editor_for_post', 'woocommerce_klasik_editor', 10, 2);

function woocommerce_klasik_editor($use_block_editor, $post) {
    $current_user = wp_get_current_user();
    
    // shop_manager ve administrator WooCommerce ürünlerini klasik editörde açsın
    $woo_rolleri = array('shop_manager', 'administrator');
    $kesisen = array_intersect($woo_rolleri, (array) $current_user->roles);
    
    if (!empty($kesisen) && $post->post_type === 'product') {
        return false;
    }
    
    // Yazarlar tüm içeriklerde klasik editör kullansın
    if (in_array('author', (array) $current_user->roles)) {
        return false;
    }
    
    return $use_block_editor;
}

Classic Editor Eklentisiyle Birlikte Kullanım

Eğer Classic Editor eklentisi kurulu değilse use_block_editor_for_post filtresi tek başına yeterli oluyor. Ancak Classic Editor eklentisi kuruluysa ve “Tüm kullanıcılar için klasik editörü kullan” seçeneği aktifse, filtreniz override edilebilir. Bu durumu yönetmek için:

add_filter('use_block_editor_for_post', 'classic_editor_eklentisi_ile_uyum', 5, 2);

function classic_editor_eklentisi_ile_uyum($use_block_editor, $post) {
    // Classic Editor eklentisi aktif mi kontrol et
    if (class_exists('Classic_Editor')) {
        // Eklenti zaten yönetiyorsa müdahale etme
        return $use_block_editor;
    }
    
    $current_user = wp_get_current_user();
    $hedef_roller = array('author', 'contributor');
    
    if (!empty(array_intersect($hedef_roller, (array) $current_user->roles))) {
        return false;
    }
    
    return $use_block_editor;
}

Not: Classic Editor eklentisi kurulu değilken bu filtre yöntemi çalışır. Eklenti kuruluysa eklentinin kendi ayarları öncelik alır. Her iki durumu da test etmek önemli.

Güvenlik ve Performans Notları

Bu fonksiyonları yazarken dikkat edilmesi gereken birkaç nokta var:

  • wp_get_current_user() fonksiyonu her sayfa yüklemesinde çalışır ama WordPress onu önbelleğe aldığı için performans sorunu yaratmaz.
  • Kullanıcı meta sorgularında get_user_meta() kullanıyorsunuz. Çok fazla kullanıcısı olan sitelerde bu sorgu biraz yavaşlayabilir ama genel olarak sorun çıkarmaz.
  • Rol kontrolü yaparken current_user_can() alternatif olarak kullanılabilir ama rol adına doğrudan erişim bazen daha net sonuç verir.
  • Fonksiyon isimlerinizi benzersiz yapın. Başka eklentilerle çakışmaması için site adı prefix’i eklemek iyi pratik:
// Kötü isimlendirme - çakışma riski
function klasik_editor() { ... }

// İyi isimlendirme - benzersiz prefix
function sitead_klasik_editor_kontrol() { ... }

Tam Entegre Çözüm: Hepsini Bir Arada

Gerçek bir projede tüm bu kontrolleri tek bir fonksiyona toplarsanız kod daha okunabilir olur:

/**
 * Kullanıcı bazlı klasik editör yönetimi
 * Site: ornek-site.com
 * Son güncelleme: 2024
 */

// Ana kontrol filtresi
add_filter('use_block_editor_for_post', 'ornek_site_editor_kontrol', 10, 2);

function ornek_site_editor_kontrol($use_block_editor, $post) {
    // Oturum açmamış kullanıcılar için varsayılanı koru
    if (!is_user_logged_in()) {
        return $use_block_editor;
    }
    
    $current_user = wp_get_current_user();
    $user_id = $current_user->ID;
    
    // 1. Kullanıcı meta tercihini kontrol et (en yüksek öncelik)
    $meta_tercih = get_user_meta($user_id, 'tercih_klasik_editor', true);
    if ($meta_tercih === '1') {
        return false;
    }
    
    // 2. Özel kullanıcı listesini kontrol et
    $klasik_liste = array('dis_muhabir_1', 'musteri_yazar', 'stajyer_editör');
    if (in_array($current_user->user_login, $klasik_liste)) {
        return false;
    }
    
    // 3. Rol ve içerik türü kombinasyonu
    $kullanici_rolleri = (array) $current_user->roles;
    
    if (in_array('author', $kullanici_rolleri) || 
        in_array('contributor', $kullanici_rolleri)) {
        // Bu roller için tüm içerik türlerinde klasik editör
        return false;
    }
    
    if (in_array('editor', $kullanici_rolleri) && 
        $post->post_type === 'post') {
        // Editörler sadece blog yazılarında klasik editör kullansın
        return false;
    }
    
    // Hiçbir koşul sağlanmadıysa varsayılan ayarı koru
    return $use_block_editor;
}

// Kullanıcı profil alanı
add_action('show_user_profile', 'ornek_site_profil_alani');
add_action('edit_user_profile', 'ornek_site_profil_alani');

function ornek_site_profil_alani($user) {
    if (!current_user_can('manage_options')) {
        return; // Sadece adminler bu alanı görsün
    }
    
    $tercih = get_user_meta($user->ID, 'tercih_klasik_editor', true);
    echo '<h3>Editör Tercihi (Admin Kontrolü)</h3>';
    echo '<table class="form-table"><tr>';
    echo '<th>Klasik Editörü Zorla</th><td>';
    echo '<input type="checkbox" name="kullanici_klasik_editor" value="1" ';
    echo checked($tercih, '1', false) . ' />';
    echo '<p class="description">Bu kullanıcı için klasik editörü zorunlu kılar.</p>';
    echo '</td></tr></table>';
}

// Meta kaydetme
add_action('personal_options_update', 'ornek_site_meta_guncelle');
add_action('edit_user_profile_update', 'ornek_site_meta_guncelle');

function ornek_site_meta_guncelle($user_id) {
    if (!current_user_can('manage_options')) {
        return;
    }
    
    if (isset($_POST['kullanici_klasik_editor'])) {
        update_user_meta($user_id, 'tercih_klasik_editor', '1');
    } else {
        delete_user_meta($user_id, 'tercih_klasik_editor');
    }
}

Değişiklikleri Test Etme

Kodu ekledikten sonra test için basit bir kontrol listesi:

  • Admin hesabıyla bir yazı oluşturun, Gutenberg açılıyor mu?
  • Hedef rol veya kullanıcıyla oturum açın, klasik editör geliyor mu?
  • WordPress yönetim panelindeki “Ekranlar” menüsü doğru görünüyor mu?
  • Mevcut yazıları düzenlemeye çalışın, editör doğru yükleniyor mu?
  • Hızlı düzenleme özelliği etkilendi mi kontrol edin
  • WooCommerce kullanıyorsanız ürün düzenleme ekranını test edin

Özellikle önbellek kullanan sitelerde (Redis, Memcached) değişiklikler hemen görünmeyebilir. Test sırasında önbelleği temizlemeyi unutmayın.

Sonuç

WordPress’te kullanıcı bazlı editör kontrolü, büyük görünen ama aslında birkaç satır kod ile halledilen bir ihtiyaç. use_block_editor_for_post filtresi bu konuda ihtiyaç duyduğunuz her türlü esnekliği sunuyor.

Hangi yaklaşımı seçeceğiniz ekibinizin büyüklüğüne ve değişim sıklığına göre değişir. Küçük ekipler için kullanıcı adı listesi yeterli. Büyük ve dinamik ekipler için kullanıcı meta tabanlı sistem çok daha sürdürülebilir. WooCommerce ağırlıklı sitelerde ise içerik türü ve rol kombinasyonunu mutlaka değerlendirin.

En önemli nokta: Bu kodu functions.php dosyasına eklemeden önce child theme kullandığınızdan emin olun. Ana tema güncellendiğinde tüm özelleştirmeleriniz gidebilir. Eğer plugin olarak paketleyip müşteri sitelerine dağıtmak istiyorsanız, tek dosyalı bir mu-plugin olarak wp-content/mu-plugins/ klasörüne koyabilirsiniz. Bu şekilde tema değişimlerinden hiç etkilenmez.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir