WordPress Yazar Sayfasını Devre Dışı Bırakma ve Yönlendirme
WordPress kurulumlarında yazar sayfaları (?author=1, /author/kullanici-adi/ gibi URL’ler) varsayılan olarak aktif gelir. Bu sayfalar ziyaretçilerin belirli bir yazara ait tüm içerikleri görmesini sağlar, ancak pek çok senaryoda bu özellik hem güvenlik açığı hem de gereksiz bir karmaşıklık kaynağı haline gelir. Özellikle tek yazarlı bloglarda, kurumsal sitelerde veya WooCommerce mağazalarında yazar sayfasını devre dışı bırakmak veya farklı bir sayfaya yönlendirmek son derece mantıklı bir karardır. Bu yazıda functions.php dosyasını kullanarak bu işlemi nasıl yapacağını, neden yapman gerektiğini ve farklı senaryolara göre nasıl özelleştireceğini detaylı olarak ele alacağız.
Neden Yazar Sayfasını Devre Dışı Bırakmalısın?
Güvenlik açısından düşündüğünde, yazar sayfaları brute force saldırıları için bir kapı aralıyor. ?author=1 parametresiyle yapılan bir istek, WordPress’in kullanıcı adını URL’de açıkça göstermesine neden olur. Yani bir saldırgan şunu yapar:
curl -I "https://siteniz.com/?author=1"
Bu isteğin yanıtında Location: başlığına bakarsın ve WordPress sana /author/admin/ gibi bir şey döner. Artık kullanıcı adın açıkta. Brute force araçları bu bilgiyi kullanarak şifre saldırısı başlatır.
Bunun dışında şu pratik nedenleri de sayabiliriz:
- SEO çakışması: Yazar sayfası, yazılarınla aynı içeriği farklı bir URL’de sunar. Bu duplicate content sorununa yol açar.
- Tek yazarlı siteler: Eğer siten sadece senden ibaret bir portfolio ya da blog ise yazar sayfasının hiçbir değeri yoktur.
- WooCommerce mağazaları: Ürün odaklı sitelerde yazar arşivi tamamen anlamsızdır ve kullanıcıyı siteyi terk etmeye yönlendirebilir.
- Kurumsal siteler: Şirket adına yayın yapılan sitelerde bireysel yazar sayfaları marka tutarsızlığı yaratır.
Temel Yönlendirme: Yazar Sayfasını Ana Sayfaya Gönder
En basit ve yaygın senaryo, tüm yazar sayfalarını ana sayfaya yönlendirmektir. Bu kodu functions.php dosyasına eklersen, herhangi bir yazar sayfasına yapılan istek anında ana sayfaya 301 yönlendirmesi yapılır.
function disable_author_pages() {
if ( is_author() ) {
wp_redirect( home_url( '/' ), 301 );
exit;
}
}
add_action( 'template_redirect', 'disable_author_pages' );
template_redirect hook’u WordPress’in şablon dosyasını yüklemeden hemen önce çalışır. Bu sayede yazar sayfası template’i hiç yüklenmez ve kullanıcı ana sayfaya yönlendirilir. exit; satırını unutmamalısın, yoksa WordPress yürütmeye devam edebilir.
404 Sayfasına Yönlendirme
Bazı durumlarda yazar sayfasına giden isteklerin 404 sayfasıyla karşılanmasını isteyebilirsin. Bu hem daha temiz bir yapı sunar hem de tarayıcı geçmişinde yönlendirme kaydı bırakmaz. Ancak bunu yaparken dikkatli olmalısın çünkü yanlış yapılandırılmış bir 404 yönlendirmesi Google Search Console’da hatalara yol açabilir.
function author_page_404() {
if ( is_author() ) {
global $wp_query;
$wp_query->set_404();
status_header( 404 );
nocache_headers();
get_template_part( '404' );
exit;
}
}
add_action( 'template_redirect', 'author_page_404' );
Bu yaklaşım, URL’yi değiştirmeden sayfanın 404 durum kodu döndürmesini sağlar. Arama motorları bu sayfayı indekslemez ve zamanla arama sonuçlarından düşer.
Belirli Bir Sayfaya Yönlendirme
Yazar sayfasını 404’e göndermek yerine “Hakkımda” sayfasına veya iletişim sayfasına yönlendirmeyi tercih edebilirsin. Bu özellikle portfolio sitelerinde işe yarar. Ziyaretçi yazar sayfasına gitmeye çalıştığında otomatik olarak daha anlamlı bir sayfaya yönlendirilir.
function redirect_author_to_about() {
if ( is_author() ) {
$about_page = get_page_by_path( 'hakkimda' );
if ( $about_page ) {
wp_redirect( get_permalink( $about_page->ID ), 301 );
} else {
wp_redirect( home_url( '/' ), 301 );
}
exit;
}
}
add_action( 'template_redirect', 'redirect_author_to_about' );
Bu kod önce hakkimda slug’ına sahip bir sayfa arar. Sayfa bulunursa oraya yönlendirir, bulamazsa güvenli bir fallback olarak ana sayfaya gider. Bu tür savunmacı kodlama pratiği her zaman önerilir.
?author=1 Parametresini Engelleme
Standart yazar sayfası yönlendirmesinin yanı sıra ?author=ID formatındaki istekleri de engellemelisin. Bu parametre özellikle kullanıcı adı tespitinde kullanıldığı için güvenlik açısından kritiktir.
function block_author_scan() {
if ( ! is_admin() ) {
$author_query = isset( $_GET['author'] ) ? $_GET['author'] : false;
if ( $author_query ) {
wp_redirect( home_url( '/' ), 301 );
exit;
}
if ( is_author() ) {
wp_redirect( home_url( '/' ), 301 );
exit;
}
}
}
add_action( 'template_redirect', 'block_author_scan' );
Bu fonksiyon hem URL parametresi yolunu hem de standart yazar arşiv sayfasını kapatır. ! is_admin() kontrolü ile admin panelinde sorun çıkarma ihtimalini de devre dışı bırakıyoruz.
Çoklu Yazar Senaryosu: Sadece Belirli Yazarları Gizle
Bazen sitende birden fazla yazar vardır ve yalnızca belirli yazarların sayfalarını gizlemek istersin. Mesela katkıda bulunan bir yazar artık sitede değildir ama eski yazıları hala duruyordur. Bu durumda sadece o yazarın sayfasını kapatmak daha mantıklıdır.
function hide_specific_authors() {
if ( is_author() ) {
$current_author = get_queried_object();
// Gizlenecek kullanici adlari
$hidden_authors = array( 'eski-yazar', 'misafir-yazar', 'test-kullanici' );
if ( isset( $current_author->user_login ) && in_array( $current_author->user_login, $hidden_authors ) ) {
wp_redirect( home_url( '/' ), 301 );
exit;
}
}
}
add_action( 'template_redirect', 'hide_specific_authors' );
get_queried_object() mevcut sorgunun nesnesini döndürür. Yazar sayfasındaysak bu nesne ilgili kullanıcı bilgilerini içerir. user_login alanıyla kullanıcı adını alıp listemizle karşılaştırıyoruz.
Rol Bazlı Yönlendirme: Belirli Rolleri Gizle
Kullanıcı adı bazlı engelleme yerine rol bazlı bir yapı kurabilirsin. Örneğin, sadece “Editor” ve “Administrator” rolündeki kullanıcıların yazar sayfasını tutmak, diğer tüm roller için yönlendirme yapmak isteyebilirsin.
function redirect_by_author_role() {
if ( is_author() ) {
$author = get_queried_object();
if ( ! $author || ! isset( $author->roles ) ) {
wp_redirect( home_url( '/' ), 301 );
exit;
}
// Sayfasi gorunur kalacak roller
$allowed_roles = array( 'administrator', 'editor' );
$author_roles = $author->roles;
$has_allowed_role = array_intersect( $allowed_roles, $author_roles );
if ( empty( $has_allowed_role ) ) {
wp_redirect( home_url( '/' ), 301 );
exit;
}
}
}
add_action( 'template_redirect', 'redirect_by_author_role' );
Bu kod array_intersect() kullanarak yazarın rollerini izin verilen roller listesiyle karşılaştırır. Kesişim yoksa yönlendirme yapılır. WooCommerce’de müşteri hesaplarına bağlı kullanıcıların yazar sayfaları varsa bu tür bir filtre çok işe yarar.
Yönlendirmeyi Loglama
Üretim ortamında hangi yazar sayfalarına istek geldiğini takip etmek isteyebilirsin. Bu hem güvenlik denetimi hem de debug amacıyla kullanışlıdır. WordPress’in kendi loglama mekanizmasını kullanarak bunu yapabilirsin.
function redirect_and_log_author_pages() {
if ( is_author() ) {
$author = get_queried_object();
$author_login = isset( $author->user_login ) ? $author->user_login : 'bilinmiyor';
$request_ip = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( $_SERVER['REMOTE_ADDR'] ) : 'bilinmiyor';
$request_url = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( $_SERVER['REQUEST_URI'] ) : '';
if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
error_log( sprintf(
'[YAZAR SAYFASI ISTEGI] Kullanici: %s | IP: %s | URL: %s | Zaman: %s',
$author_login,
$request_ip,
$request_url,
current_time( 'mysql' )
) );
}
wp_redirect( home_url( '/' ), 301 );
exit;
}
}
add_action( 'template_redirect', 'redirect_and_log_author_pages' );
Bu fonksiyon wp-content/debug.log dosyasına şu formatta kayıt düşer:
[YAZAR SAYFASI ISTEGI] Kullanici: admin | IP: 45.33.32.156 | URL: /author/admin/ | Zaman: 2024-01-15 14:23:45
Tabii bu loglama özelliğinin çalışması için wp-config.php dosyasında şu satırların tanımlı olması gerekir:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
REST API Üzerinden Kullanıcı Listelenmesini Engelleme
Yazar sayfalarını kapattın ama bir adım daha atmak gerekiyor. WordPress’in REST API’si /wp-json/wp/v2/users/ endpoint’i üzerinden kullanıcı bilgilerini döndürür. Bunu da kapatman gerekir, yoksa tüm emek boşa gider.
function restrict_rest_api_users( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error(
'rest_forbidden',
__( 'Kullanici listesine erisim yetkiniz yok.', 'textdomain' ),
array( 'status' => 401 )
);
}
return $result;
}
add_filter( 'rest_authentication_errors', 'restrict_rest_api_users' );
function disable_users_endpoint( $endpoints ) {
if ( isset( $endpoints['/wp/v2/users'] ) ) {
foreach ( $endpoints['/wp/v2/users'] as $key => $endpoint ) {
if ( isset( $endpoint['methods'] ) && in_array( 'GET', $endpoint['methods'] ) ) {
if ( ! current_user_can( 'list_users' ) ) {
unset( $endpoints['/wp/v2/users'][ $key ] );
}
}
}
}
return $endpoints;
}
add_filter( 'rest_endpoints', 'disable_users_endpoint' );
Bu iki fonksiyon birlikte çalışır. İlki REST API kimlik doğrulama hatalarını filtreler, ikincisi ise giriş yapmamış kullanıcılar için /wp/v2/users endpoint’ini kaldırır. Gerçek senaryoda sadece manage_options yetkisine sahip adminlerin kullanıcı listesine API üzerinden erişmesini sağlamış olursun.
WooCommerce ile Entegrasyon
WooCommerce sitelerinde yazar sayfaları ekstra sorun çıkarabilir. Müşteri hesapları bazen yazar olarak atanır ve bu durum istemeden yazar sayfaları oluşturur. Ayrıca WooCommerce’in kendi my-account sayfası varken ayrı bir yazar sayfasının varlığı kullanıcı deneyimini bozar.
function woocommerce_disable_author_pages() {
if ( is_author() ) {
$author = get_queried_object();
// WooCommerce aktif mi kontrol et
if ( class_exists( 'WooCommerce' ) ) {
// Musteri rolundeki kullanicilari ana sayfaya yonlendir
if ( isset( $author->roles ) && in_array( 'customer', $author->roles ) ) {
wp_redirect( home_url( '/' ), 301 );
exit;
}
// Subscriber rolundeki kullanicilari da yonlendir
if ( isset( $author->roles ) && in_array( 'subscriber', $author->roles ) ) {
wp_redirect( home_url( '/' ), 301 );
exit;
}
// Hicbir yayinlanmis icerigi yoksa yonlendir
$author_posts = count_user_posts( $author->ID, 'post', true );
if ( $author_posts < 1 ) {
wp_redirect( home_url( '/' ), 301 );
exit;
}
}
}
}
add_action( 'template_redirect', 'woocommerce_disable_author_pages' );
Bu fonksiyonda üç katmanlı bir kontrol var:
- Müşteri rolü kontrolü: WooCommerce müşterileri yazar sayfasına sahip olamaz.
- Subscriber rolü kontrolü: Abone kullanıcılar da engellenir.
- İçerik sayısı kontrolü: Hiç yayınlanmış içeriği olmayan kullanıcıların sayfası yönlendirilir.
Sitemap’ten Yazar Sayfalarını Kaldırma
Yönlendirme yaptın ama Yoast SEO veya Rank Math gibi eklentiler sitemap’e yazar sayfalarını eklemeye devam edebilir. Bunu da düzeltmek gerekir.
// Yoast SEO icin
function remove_authors_from_yoast_sitemap( $url ) {
if ( isset( $url['loc'] ) && strpos( $url['loc'], '/author/' ) !== false ) {
return false;
}
return $url;
}
add_filter( 'wpseo_sitemap_url', 'remove_authors_from_yoast_sitemap' );
// WordPress core sitemap icin (5.5+)
function disable_core_author_sitemap( $provider, $name ) {
if ( 'users' === $name ) {
return false;
}
return $provider;
}
add_filter( 'wp_sitemaps_add_provider', 'disable_core_author_sitemap', 10, 2 );
WordPress 5.5’ten itibaren gelen dahili sitemap özelliği için wp_sitemaps_add_provider filtresi kullanılır. users provider’ını false döndürerek devre dışı bırakıyoruz. Yoast kullanıyorsan wpseo_sitemap_url filtresiyle URL bazlı filtreleme yapıyoruz.
Her Şeyi Bir Arada: Kapsamlı Fonksiyon
Yukarıdaki tüm parçaları birleştirip temiz, tek bir yapıya dönüştürmek her zaman daha iyi bir pratiktir. Bunu bir plugin olarak da kullanabilirsin ya da direkt functions.php dosyana ekleyebilirsin.
/**
* Yazar sayfalarini devre disi birak ve yonlendir
* Kullanim: functions.php dosyasina ekle
*/
class Disable_Author_Pages {
private $redirect_to;
private $log_requests;
public function __construct( $redirect_to = null, $log_requests = false ) {
$this->redirect_to = $redirect_to ? $redirect_to : home_url( '/' );
$this->log_requests = $log_requests;
add_action( 'template_redirect', array( $this, 'handle_author_request' ) );
add_filter( 'wp_sitemaps_add_provider', array( $this, 'remove_from_sitemap' ), 10, 2 );
add_filter( 'rest_endpoints', array( $this, 'restrict_users_endpoint' ) );
}
public function handle_author_request() {
$is_author_query = isset( $_GET['author'] ) && ! is_admin();
if ( ! is_author() && ! $is_author_query ) {
return;
}
if ( $this->log_requests ) {
$this->log_request();
}
wp_redirect( $this->redirect_to, 301 );
exit;
}
private function log_request() {
if ( ! defined( 'WP_DEBUG_LOG' ) || ! WP_DEBUG_LOG ) {
return;
}
$author = get_queried_object();
$login = isset( $author->user_login ) ? $author->user_login : 'bilinmiyor';
$ip = isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : '-';
$uri = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '-';
error_log( "[YAZAR BLOKLAMA] Login: {$login} | IP: {$ip} | URI: {$uri}" );
}
public function remove_from_sitemap( $provider, $name ) {
if ( 'users' === $name ) {
return false;
}
return $provider;
}
public function restrict_users_endpoint( $endpoints ) {
if ( ! is_user_logged_in() || ! current_user_can( 'list_users' ) ) {
unset( $endpoints['/wp/v2/users'] );
unset( $endpoints['/wp/v2/users/(?P<id>[d]+)'] );
}
return $endpoints;
}
}
// Kullanim
new Disable_Author_Pages(
home_url( '/' ), // Yonlendirilecek URL
true // Loglama aktif mi?
);
Bu OOP yaklaşımı kodun okunabilirliğini artırır ve sonradan değişiklik yapmayı kolaylaştırır. Constructor’da sadece iki parametre geçiriyorsun: yönlendirme URL’si ve loglama tercihi.
Dikkat Edilmesi Gereken Noktalar
Bu işlemi yaparken bazı konulara dikkat etmezsen kendine sorun yaratabilirsin:
- Child theme kullan: Kodu direkt parent theme’in
functions.phpdosyasına koyarsan tema güncellemelerinde silinir. Her zaman child theme kullan. - Cache temizleme: Yönlendirme kodunu ekledikten sonra Cloudflare, WP Rocket veya kullandığın herhangi bir cache sistemini temizle. Cache’lenmiş yazar sayfaları hala görünmeye devam edebilir.
- 301 vs 302: Kalıcı değişiklikler için 301 kullan. 302 geçici yönlendirmedir ve arama motorları bunu farklı değerlendirir.
- Staging ortamında test et: Canlıya geçmeden önce staging ortamında dene. Özellikle WooCommerce sitelerde beklenmedik çakışmalar olabilir.
- Google Search Console: Yazar sayfalarına ait halihazırda indekslenmiş URL’ler varsa Search Console’dan URL kaldırma isteği gönder. 301 yönlendirmesi zamanla bu sayfaları indeksten çıkarır ama aktif talep süreci hızlandırır.
Sonuç
Yazar sayfalarını devre dışı bırakmak küçük ama etkili bir güvenlik ve SEO adımıdır. Kullanıcı adı ifşasını önler, duplicate content sorununu ortadan kaldırır ve özellikle WooCommerce sitelerinde kullanıcı deneyimini düzeltir. functions.php üzerinden yapılan bu müdahaleler herhangi bir ek eklenti gerektirmez ve sitenin performansını olumsuz etkilemez.
Hangi yaklaşımı seçeceğine senaryona göre karar ver. Tek yazarlı, küçük bir blog için basit is_author() kontrolü ve ana sayfaya yönlendirme yeterlidir. Çok yazarlı kurumsal bir site veya WooCommerce mağazası için rol bazlı filtreleme ve REST API kısıtlamasını da işin içine katman şart. En kapsamlı koruma için ise tüm katmanları birleştiren OOP sınıfını kullanabilir ve bunu bir must-use plugin olarak wp-content/mu-plugins/ klasörüne koyabilirsin. Bu sayede theme değişikliklerinden bağımsız çalışır ve her zaman aktif kalır.
