WordPress functions.php ile Yazar Bilgisi Kutusunu Özelleştirme
WordPress ile site yönetirken en çok ihmal edilen ama aslında ziyaretçi güveni açısından kritik olan detaylardan biri yazar bilgisi kutusudur. Bir blog yazısının altında yazarın kim olduğunu, ne iş yaptığını ve sosyal medya bağlantılarını gösteren bu kutu, okuyucuyla kurulan ilk kişisel bağlantı noktasıdır. Maalesef WordPress’in varsayılan yazar kutusu oldukça sade ve çoğu zaman yetersiz kalır. İşte bu yüzden functions.php dosyasına birkaç fonksiyon ekleyerek bu kutuyu tamamen kendi ihtiyaçlarınıza göre şekillendirebilirsiniz.
Varsayılan WordPress Yazar Kutusunun Sınırlamaları
WordPress, her kullanıcı profilinde yalnızca birkaç temel alan sunar. Ad, biyografi ve web sitesi URL’si bunların başında gelir. Oysa günümüz içerik pazarlamasında bir yazarın LinkedIn profili, Twitter hesabı, uzmanlık alanı ve belki de bir rozet veya sertifika bilgisi göstermek çok daha anlamlı hale gelmiştir.
Temalar genellikle get_the_author_meta() ve the_author_posts_link() gibi standart fonksiyonları kullanarak basit bir yazar kutusu çizer. Bu kutuda fotoğraf, isim ve kısa biyografi yer alır. Ama sosyal medya linkleri, özel başlıklar veya “Bu Yazarın Diğer Yazıları” gibi dinamik içerikler için ek kod gerekir.
functions.php’ye Neden Dokunuyoruz?
Birçok sysadmin ve WordPress geliştiricisi, tema dosyalarını doğrudan düzenleme yoluna gider. Bu tehlikeli bir alışkanlıktır çünkü tema güncellendiğinde tüm değişiklikler silinir. functions.php dosyası ise (özellikle child theme içindeyse) güncellemelerden etkilenmez ve sitenizin işlevselliğini merkezi bir yerden yönetmenizi sağlar.
Eğer bir child theme kullanmıyorsanız, mutlaka oluşturmanızı öneririm. Şu an için ana tema functions.php dosyasını düzenleyecek olsak bile, mantık aynı kalır.
Kullanıcı Profiline Özel Alanlar Eklemek
İlk adım, WordPress kullanıcı profil sayfasına yeni alanlar eklemektir. Sosyal medya linkleri için birkaç ekstra alan tanımlayalım.
// functions.php içine ekleyin
function custom_author_profile_fields( $user ) {
?>
<h3>Sosyal Medya Bilgileri</h3>
<table class="form-table">
<tr>
<th><label for="twitter">Twitter / X</label></th>
<td>
<input type="text" name="twitter" id="twitter"
value="<?php echo esc_attr( get_user_meta( $user->ID, 'twitter', true ) ); ?>"
class="regular-text" /><br />
<span class="description">Twitter kullanıcı adınız (@olmadan)</span>
</td>
</tr>
<tr>
<th><label for="linkedin">LinkedIn</label></th>
<td>
<input type="text" name="linkedin" id="linkedin"
value="<?php echo esc_attr( get_user_meta( $user->ID, 'linkedin', true ) ); ?>"
class="regular-text" /><br />
<span class="description">LinkedIn profil URL'niz</span>
</td>
</tr>
<tr>
<th><label for="github">GitHub</label></th>
<td>
<input type="text" name="github" id="github"
value="<?php echo esc_attr( get_user_meta( $user->ID, 'github', true ) ); ?>"
class="regular-text" /><br />
<span class="description">GitHub kullanıcı adınız</span>
</td>
</tr>
<tr>
<th><label for="author_title">Unvan</label></th>
<td>
<input type="text" name="author_title" id="author_title"
value="<?php echo esc_attr( get_user_meta( $user->ID, 'author_title', true ) ); ?>"
class="regular-text" /><br />
<span class="description">Örn: Kıdemli Sistem Yöneticisi</span>
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'custom_author_profile_fields' );
add_action( 'edit_user_profile', 'custom_author_profile_fields' );
Bu kod, WordPress yönetici panelindeki kullanıcı profil sayfasına Twitter, LinkedIn, GitHub ve unvan alanlarını ekler. show_user_profile kendi profilinizi düzenlerken, edit_user_profile ise başka bir kullanıcının profilini admin olarak düzenlerken tetiklenir.
Özel Alanları Kaydetmek
Alanları eklemek yetmez, kaydetme işlemini de yazmak gerekir. Güvenlik açısından nonce doğrulaması ve veri temizleme mutlaka yapılmalıdır.
function save_custom_author_profile_fields( $user_id ) {
if ( ! current_user_can( 'edit_user', $user_id ) ) {
return false;
}
$fields = array( 'twitter', 'linkedin', 'github', 'author_title' );
foreach ( $fields as $field ) {
if ( isset( $_POST[ $field ] ) ) {
update_user_meta(
$user_id,
$field,
sanitize_text_field( $_POST[ $field ] )
);
}
}
}
add_action( 'personal_options_update', 'save_custom_author_profile_fields' );
add_action( 'edit_user_profile_update', 'save_custom_author_profile_fields' );
sanitize_text_field() kullanarak SQL injection ve XSS saldırılarına karşı basit bir önlem alıyoruz. URL alanları için esc_url_raw() kullanmak daha uygun olurdu ama bu örnekte kullanıcı adı girişi olduğu için metin sanitizasyonu yeterli.
Özel Yazar Kutusu HTML’ini Oluşturmak
Artık veriler var, şimdi bunları güzel bir kutu haline getirme vakti. Bir shortcode veya fonksiyon olarak tanımlayıp tema şablonlarınızda çağırabilirsiniz.
function custom_author_box( $author_id = null ) {
if ( ! $author_id ) {
$author_id = get_the_author_meta( 'ID' );
}
$display_name = get_the_author_meta( 'display_name', $author_id );
$bio = get_the_author_meta( 'description', $author_id );
$author_title = get_user_meta( $author_id, 'author_title', true );
$twitter = get_user_meta( $author_id, 'twitter', true );
$linkedin = get_user_meta( $author_id, 'linkedin', true );
$github = get_user_meta( $author_id, 'github', true );
$avatar = get_avatar( $author_id, 120 );
$author_url = get_author_posts_url( $author_id );
ob_start();
?>
<div class="custom-author-box">
<div class="author-avatar">
<a href="<?php echo esc_url( $author_url ); ?>">
<?php echo $avatar; ?>
</a>
</div>
<div class="author-info">
<h4 class="author-name">
<a href="<?php echo esc_url( $author_url ); ?>">
<?php echo esc_html( $display_name ); ?>
</a>
</h4>
<?php if ( $author_title ) : ?>
<p class="author-title"><?php echo esc_html( $author_title ); ?></p>
<?php endif; ?>
<?php if ( $bio ) : ?>
<p class="author-bio"><?php echo wp_kses_post( $bio ); ?></p>
<?php endif; ?>
<div class="author-social">
<?php if ( $twitter ) : ?>
<a href="https://twitter.com/<?php echo esc_attr( $twitter ); ?>"
target="_blank" rel="noopener noreferrer" class="social-link twitter">
Twitter
</a>
<?php endif; ?>
<?php if ( $linkedin ) : ?>
<a href="<?php echo esc_url( $linkedin ); ?>"
target="_blank" rel="noopener noreferrer" class="social-link linkedin">
LinkedIn
</a>
<?php endif; ?>
<?php if ( $github ) : ?>
<a href="https://github.com/<?php echo esc_attr( $github ); ?>"
target="_blank" rel="noopener noreferrer" class="social-link github">
GitHub
</a>
<?php endif; ?>
</div>
</div>
</div>
<?php
return ob_get_clean();
}
Bu fonksiyon, yazar bilgilerini HTML olarak döndürür. ob_start() ve ob_get_clean() kullanarak HTML’i doğrudan ekrana basmak yerine bir değişkene atıyoruz. Bu sayede fonksiyon hem echo hem de return senaryolarında kullanılabilir hale gelir.
Yazar Kutusunu Otomatik Olarak Yazılara Eklemek
Fonksiyonu yazdık ama hâlâ göründüğü yer yok. WordPress’in the_content filtresini kullanarak yazar kutusunu her yazının sonuna otomatik olarak ekleyebiliriz.
function append_author_box_to_content( $content ) {
if ( is_single() && get_post_type() === 'post' && in_the_loop() && is_main_query() ) {
$author_box = custom_author_box( get_the_author_meta( 'ID' ) );
$content .= $author_box;
}
return $content;
}
add_filter( 'the_content', 'append_author_box_to_content' );
Buradaki koşulları tek tek açıklamak gerekirse:
- is_single(): Sadece tekil yazı sayfalarında çalışır, arşiv veya ana sayfada çalışmaz
- get_post_type() === ‘post’: Yalnızca standart blog yazılarında aktif olur, sayfalarda veya özel post type’larda tetiklenmez
- in_the_loop(): WordPress döngüsü içinde olduğumuzu doğrular, sidebar widget’larını dışarıda bırakır
- is_main_query(): Yan sorgular veya widget sorgularını devre dışı bırakır
Bu dört koşul birlikte çok önemlidir. Eğer sadece is_single() kullansaydınız, yazar kutusu yanlış yerlerde de görünebilirdi.
Shortcode ile Esnek Kullanım
Bazen yazar kutusunu belirli bir sayfada manuel olarak göstermek istersiniz. Bunun için shortcode tanımlamak çok pratik bir çözümdür.
function author_box_shortcode( $atts ) {
$atts = shortcode_atts(
array(
'id' => null,
'user' => null,
),
$atts,
'author_box'
);
$author_id = null;
if ( ! empty( $atts['id'] ) ) {
$author_id = intval( $atts['id'] );
} elseif ( ! empty( $atts['user'] ) ) {
$user = get_user_by( 'login', sanitize_user( $atts['user'] ) );
if ( $user ) {
$author_id = $user->ID;
}
} else {
$author_id = get_the_author_meta( 'ID' );
}
if ( ! $author_id ) {
return '';
}
return custom_author_box( $author_id );
}
add_shortcode( 'author_box', 'author_box_shortcode' );
Bu shortcode’u şu şekillerde kullanabilirsiniz:
- [author_box]: Mevcut yazının yazarını gösterir
- [author_box id=”5″]: ID’si 5 olan kullanıcıyı gösterir
- [author_box user=”ahmet”]: Kullanıcı adı “ahmet” olan yazarı gösterir
Özellikle birden fazla yazarın katkıda bulunduğu “Rehber” türü yazılarda bu esneklik çok işe yarar.
CSS ile Yazar Kutusunu Güzel Hale Getirmek
Kod çalışıyor ama görsel olarak henüz bir şey yok. functions.php üzerinden inline CSS eklemek yerine bu stilleri ya child theme’nizin style.css dosyasına ya da ayrı bir CSS dosyasına ekleyin. Ancak hızlı bir prototip için şu yöntemi de kullanabilirsiniz:
function enqueue_author_box_styles() {
if ( is_single() ) {
wp_add_inline_style(
get_stylesheet_handle(),
'
.custom-author-box {
display: flex;
gap: 20px;
padding: 24px;
background: #f8f9fa;
border-left: 4px solid #0073aa;
border-radius: 4px;
margin: 40px 0;
align-items: flex-start;
}
.author-avatar img {
border-radius: 50%;
display: block;
}
.author-info {
flex: 1;
}
.author-name {
margin: 0 0 4px 0;
font-size: 1.1em;
}
.author-title {
color: #666;
font-size: 0.9em;
margin: 0 0 10px 0;
font-style: italic;
}
.author-bio {
margin: 0 0 12px 0;
font-size: 0.95em;
line-height: 1.6;
}
.author-social {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.social-link {
padding: 4px 12px;
border-radius: 3px;
font-size: 0.85em;
text-decoration: none;
font-weight: bold;
}
.social-link.twitter { background: #1da1f2; color: #fff; }
.social-link.linkedin { background: #0077b5; color: #fff; }
.social-link.github { background: #333; color: #fff; }
'
);
}
}
add_action( 'wp_enqueue_scripts', 'enqueue_author_box_styles' );
wp_add_inline_style() kullanımında dikkat edilmesi gereken nokta, ilk parametrenin temanızın kayıtlı stil handle’ı olması gerektiğidir. Çoğu tema için bu get_stylesheet_handle() ile alınabilir ama bazı temalarda farklı bir handle kullanılıyor olabilir.
Çoklu Yazar Desteği ve Özel Post Meta
Bir yazıya birden fazla yazar atamak isteyebilirsiniz. Bu durum özellikle kurumsal bloglarda yaygındır. WordPress bunu varsayılan olarak desteklemez ama özel bir post meta alanıyla çözebilirsiniz.
function add_coauthors_meta_box() {
add_meta_box(
'coauthors_box',
'Ortak Yazarlar',
'render_coauthors_meta_box',
'post',
'side',
'default'
);
}
add_action( 'add_meta_boxes', 'add_coauthors_meta_box' );
function render_coauthors_meta_box( $post ) {
$coauthors = get_post_meta( $post->ID, '_coauthors', true );
$coauthors = $coauthors ? $coauthors : array();
wp_nonce_field( 'save_coauthors', 'coauthors_nonce' );
$all_users = get_users( array( 'who' => 'authors' ) );
?>
<p><strong>Ortak yazar ekleyin:</strong></p>
<?php foreach ( $all_users as $user ) : ?>
<label>
<input type="checkbox"
name="coauthors[]"
value="<?php echo esc_attr( $user->ID ); ?>"
<?php checked( in_array( $user->ID, $coauthors ) ); ?> />
<?php echo esc_html( $user->display_name ); ?>
</label><br/>
<?php endforeach; ?>
<?php
}
function save_coauthors_meta( $post_id ) {
if ( ! isset( $_POST['coauthors_nonce'] ) ) return;
if ( ! wp_verify_nonce( $_POST['coauthors_nonce'], 'save_coauthors' ) ) return;
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( ! current_user_can( 'edit_post', $post_id ) ) return;
$coauthors = isset( $_POST['coauthors'] ) ? array_map( 'intval', $_POST['coauthors'] ) : array();
update_post_meta( $post_id, '_coauthors', $coauthors );
}
add_action( 'save_post', 'save_coauthors_meta' );
Bu kod, yazı düzenleme ekranına bir meta box ekler. Buradan birden fazla yazar seçebilirsiniz. Seçilen yazarların ID’leri post meta olarak saklanır.
Şimdi bu ortak yazarları görüntülemek için içerik filtresini güncelleyelim:
function append_multiple_author_boxes( $content ) {
if ( ! is_single() || get_post_type() !== 'post' || ! in_the_loop() || ! is_main_query() ) {
return $content;
}
global $post;
// Ana yazar kutusu
$output = custom_author_box( get_the_author_meta( 'ID' ) );
// Ortak yazarlar
$coauthors = get_post_meta( $post->ID, '_coauthors', true );
if ( ! empty( $coauthors ) && is_array( $coauthors ) ) {
foreach ( $coauthors as $coauthor_id ) {
if ( $coauthor_id != get_the_author_meta( 'ID' ) ) {
$output .= custom_author_box( intval( $coauthor_id ) );
}
}
}
return $content . $output;
}
add_filter( 'the_content', 'append_multiple_author_boxes' );
Gerçek Dünya Senaryosu: Teknik Blog
Bir IT şirketinin teknik blogunu yönettiğinizi düşünün. Yazarlar arasında sistem yöneticileri, network mühendisleri ve güvenlik uzmanları var. Her birinin farklı sertifikaları ve uzmanlık alanları bulunuyor.
Bu senaryo için author_certifications ve expertise_areas gibi ek meta alanlar ekleyebilirsiniz:
function add_technical_author_fields( $user ) {
?>
<h3>Teknik Profil Bilgileri</h3>
<table class="form-table">
<tr>
<th><label for="certifications">Sertifikalar</label></th>
<td>
<textarea name="certifications" id="certifications" rows="3" cols="30"><?php
echo esc_textarea( get_user_meta( $user->ID, 'certifications', true ) );
?></textarea>
<p class="description">Virgülle ayırın: RHCE, CCNA, AWS Solutions Architect</p>
</td>
</tr>
<tr>
<th><label for="expertise">Uzmanlık Alanları</label></th>
<td>
<textarea name="expertise" id="expertise" rows="3" cols="30"><?php
echo esc_textarea( get_user_meta( $user->ID, 'expertise', true ) );
?></textarea>
<p class="description">Örn: Linux, Docker, Kubernetes, Network Güvenliği</p>
</td>
</tr>
<tr>
<th><label for="years_experience">Deneyim Yılı</label></th>
<td>
<input type="number" name="years_experience" id="years_experience"
value="<?php echo esc_attr( get_user_meta( $user->ID, 'years_experience', true ) ); ?>"
class="small-text" min="0" max="50" />
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'add_technical_author_fields' );
add_action( 'edit_user_profile', 'add_technical_author_fields' );
function save_technical_author_fields( $user_id ) {
if ( ! current_user_can( 'edit_user', $user_id ) ) return;
$text_fields = array( 'certifications', 'expertise' );
foreach ( $text_fields as $field ) {
if ( isset( $_POST[ $field ] ) ) {
update_user_meta( $user_id, $field, sanitize_textarea_field( $_POST[ $field ] ) );
}
}
if ( isset( $_POST['years_experience'] ) ) {
update_user_meta(
$user_id,
'years_experience',
absint( $_POST['years_experience'] )
);
}
}
add_action( 'personal_options_update', 'save_technical_author_fields' );
add_action( 'edit_user_profile_update', 'save_technical_author_fields' );
Bu bilgileri custom_author_box() fonksiyonuna entegre ederek “8 yıl deneyim | RHCE, CCNA | Linux, Docker uzmanı” gibi zengin profil kartları oluşturabilirsiniz.
Yazar Kutusu Önbelleğe Alma
Büyük sitelerde yazar bilgilerini her sayfa yüklemesinde veritabanından çekmek performans sorunu yaratabilir. Transient API ile basit bir önbellek mekanizması kurabilirsiniz:
function cached_author_box( $author_id ) {
$cache_key = 'author_box_' . $author_id;
$cached = get_transient( $cache_key );
if ( false !== $cached ) {
return $cached;
}
$output = custom_author_box( $author_id );
// 12 saat önbellek
set_transient( $cache_key, $output, 12 * HOUR_IN_SECONDS );
return $output;
}
// Profil güncellendiğinde önbelleği temizle
function clear_author_box_cache( $user_id ) {
delete_transient( 'author_box_' . $user_id );
}
add_action( 'profile_update', 'clear_author_box_cache' );
HOUR_IN_SECONDS WordPress’in tanımladığı bir sabit olup 3600 değerine eşittir. Bu yapı sayesinde profil güncellenmediği sürece yazar kutusu veritabanından değil önbellekten gelir.
Dikkat Edilmesi Gereken Noktalar
Yazar kutusu özelleştirirken birkaç önemli konuya dikkat etmek gerekir:
- Güvenlik: Kullanıcıdan gelen her veriyi
sanitize_text_field(),esc_url(),absint()gibi fonksiyonlarla temizleyin. XSS saldırıları çoğunlukla ihmal edilen alanlarda kendini gösterir. - Performans:
get_user_meta()fonksiyonu gereksiz yere döngü içinde çağırılmamalıdır. Tüm meta değerlerini tek seferde çekmek içinget_user_meta( $user_id )şeklinde kullanabilirsiniz. - Child Theme Kullanımı: Tüm bu kodları mutlaka child theme’nin
functions.phpdosyasına ekleyin. Ana tema güncellendiğinde değişiklikleriniz kaybolmaz. - Test Ortamı: Canlı sitenizde doğrudan değişiklik yapmadan önce yerel bir WordPress kurulumunda veya staging ortamında test edin.
- PHP Uyumluluğu: WordPress 6.x ile PHP 8.x uyumluluğuna dikkat edin. Özellikle deprecated fonksiyon kullanımlarına karşı güncel belgeleri takip edin.
Sonuç
WordPress yazar kutusunu özelleştirmek ilk bakışta küçük bir detay gibi görünse de okuyucu güveni ve içerik otoritesi açısından ciddi bir fark yaratır. Bir teknik blog yöneticisi olarak düşündüğünüzde, sertifika bilgileri ve uzmanlık alanları gösteren bir yazar profili, anonim bir isimden çok daha ikna edicidir.
functions.php üzerinden yapılan bu özelleştirmeler tema bağımsız çalışır, güncelleme güvenlidir ve WordPress’in kendi API’larını kullanır. Transient önbellekleme ile performans kaybı yaşamazsınız, nonce doğrulaması ve sanitizasyon ile de güvenlik açıkları minimize edilir.
Adım adım özetleyecek olursak: önce kullanıcı profiline özel alanlar eklediniz, ardından bu alanları kaydettiniz, sonra güzel bir HTML kutusu oluşturdunuz ve bunu içeriğe ya da shortcode ile istediğiniz yere yerleştirdiniz. Ortak yazar desteği ve önbellek mekanizmasıyla da kurumsal kullanıma hazır hale getirdiniz. Artık sitenizin yazar profilleri hem işlevsel hem de profesyonel görünüyor.
