WordPress Dashboard Widget Ekleme ve Kaldırma
WordPress yönetim panelini ilk kurduğunuzda sizi karşılayan o dashboard ekranı, zamanla gereksiz widget’larla dolup taşabiliyor. Öte yandan bazen tam olarak ihtiyacınız olan bilgi orada bulunmuyor. İşte tam bu noktada functions.php dosyası devreye giriyor ve size dashboard üzerinde tam kontrol sağlıyor.
Bu yazıda WordPress dashboard widget’larını nasıl ekleyeceğinizi, kaldıracağınızı ve özelleştireceğinizi gerçek dünya senaryolarıyla ele alacağız. Müşteri sitelerini yönetiyorsanız, bir ajans olarak çok sayıda WordPress kurulumunu idare ediyorsanız ya da sadece kendi sitenizi düzenlemek istiyorsanız bu bilgiler işinize yarayacak.
Dashboard Widget Sistemi Nasıl Çalışır?
WordPress’in dashboard widget sistemi, wp_dashboard_setup hook’u üzerine kurulu. Bu hook, dashboard yüklendiğinde tetikleniyor ve tüm widget’ların kaydedilip yönetildiği ana nokta burası.
İki temel fonksiyon var:
wp_add_dashboard_widget(): Yeni widget eklerwp_remove_dashboard_widget(): Mevcut widget’ları kaldırır
Bunların dışında global $wp_meta_boxes değişkeni aracılığıyla daha gelişmiş manipülasyonlar da yapılabilir. Ama önce temelden başlayalım.
Gereksiz Widget’ları Kaldırmak
Varsayılan WordPress kurulumunda birçok widget geliyor. Bunların bir kısmı gerçekten işe yarıyor, bir kısmı ise sadece yer kaplıyor. Özellikle müşterinize teslim ettiğiniz bir sitede “WordPress News” widget’ının görünmesi pek hoş değil.
İşte en yaygın kullanılan default widget ID’leri:
dashboard_right_now: “Bir Bakışta” widget’ı (gönderi, yorum sayıları)dashboard_activity: Son aktivitelerdashboard_quick_press: Hızlı taslak oluşturmadashboard_primary: WordPress haberleri ve duyurularıdashboard_site_health: Site sağlığı özetiwelcome_panel: Hoşgeldiniz paneli
Temel kaldırma işlemi şu şekilde:
// functions.php içine ekleyin
function remove_default_dashboard_widgets() {
remove_meta_box('dashboard_right_now', 'dashboard', 'normal');
remove_meta_box('dashboard_activity', 'dashboard', 'normal');
remove_meta_box('dashboard_quick_press', 'dashboard', 'side');
remove_meta_box('dashboard_primary', 'dashboard', 'side');
remove_meta_box('dashboard_site_health', 'dashboard', 'normal');
}
add_action('wp_dashboard_setup', 'remove_default_dashboard_widgets');
Burada remove_meta_box() fonksiyonunun üç parametresi var:
- Birinci parametre: Widget’ın ID’si
- İkinci parametre: Hangi ekranda olduğu (dashboard için ‘dashboard’)
- Üçüncü parametre: Konumu (‘normal’, ‘side’, ‘advanced’)
Hoşgeldiniz Panelini Kapatmak
WordPress, yeni kurulumda büyük bir “Hoşgeldiniz” paneli gösteriyor. Bu panel teknik olarak bir meta_box değil, ayrı bir yapı. Bunu kaldırmak için farklı bir yöntem gerekiyor:
// Hoşgeldiniz panelini kaldır
function remove_welcome_panel() {
remove_action('welcome_panel', 'wp_welcome_panel');
}
add_action('wp_dashboard_setup', 'remove_welcome_panel');
Alternatif olarak remove_action yerine CSS ile gizleyebilirsiniz ama bu temiz bir çözüm değil. Hook üzerinden kaldırmak her zaman daha doğru.
Özel Dashboard Widget Ekleme
Şimdi asıl eğlenceli kısma gelelim. Kendi widget’ınızı eklemek, dashboard’u gerçekten işlevsel hale getirmenin en iyi yolu.
wp_add_dashboard_widget() fonksiyonunun temel kullanımı:
function add_custom_dashboard_widget() {
wp_add_dashboard_widget(
'custom_help_widget', // Widget ID
'Site Yardım ve Bilgi', // Widget başlığı
'custom_dashboard_widget_content' // İçerik callback fonksiyonu
);
}
add_action('wp_dashboard_setup', 'add_custom_dashboard_widget');
function custom_dashboard_widget_content() {
echo '<p>Sitenizle ilgili yardım almak için:</p>';
echo '<ul>';
echo '<li><a href="mailto:[email protected]">[email protected]</a></li>';
echo '<li><strong>Telefon:</strong> 0212 XXX XX XX</li>';
echo '<li><a href="https://wiki.sirket.com" target="_blank">Dokümantasyon</a></li>';
echo '</ul>';
}
Bu kadar basit. Ancak gerçek dünya projelerinde bundan çok daha fazlasına ihtiyaç duyuyorsunuz.
Gerçek Dünya Senaryosu 1: Müşteri Bilgi Paneli
Bir ajans olarak müşteriye WordPress sitesi teslim ettiğinizde, onların kafasındaki soru işaretlerini baştan gidermek için dashboard’a özel bir bilgi paneli ekleyebilirsiniz. Bu hem destek yükünüzü azaltır hem de müşteri memnuniyetini artırır:
function ajans_musteri_bilgi_widget() {
wp_add_dashboard_widget(
'ajans_bilgi_paneli',
'Dijital Ajans - Destek Bilgileri',
'ajans_bilgi_paneli_icerik'
);
}
add_action('wp_dashboard_setup', 'ajans_musteri_bilgi_widget');
function ajans_bilgi_paneli_icerik() {
$son_yedek = get_option('last_backup_date', 'Henüz yedek alınmadı');
$site_versiyonu = wp_get_theme()->get('Version');
$wp_versiyon = get_bloginfo('version');
?>
<div style="padding: 10px 0;">
<h4 style="margin: 0 0 10px; color: #0073aa;">Teknik Destek</h4>
<p><strong>Destek E-posta:</strong> [email protected]</p>
<p><strong>Çalışma Saatleri:</strong> Hafta içi 09:00 - 18:00</p>
<p><strong>Acil Durum Hattı:</strong> 0212 XXX XX XX</p>
<hr style="margin: 15px 0;">
<h4 style="margin: 0 0 10px; color: #0073aa;">Site Bilgileri</h4>
<p><strong>WordPress Versiyonu:</strong> <?php echo esc_html($wp_versiyon); ?></p>
<p><strong>Tema Versiyonu:</strong> <?php echo esc_html($site_versiyonu); ?></p>
<p><strong>Son Yedekleme:</strong> <?php echo esc_html($son_yedek); ?></p>
<hr style="margin: 15px 0;">
<p style="font-size: 12px; color: #666;">
Sözleşme kapsamı dışında bir değişiklik yapmadan önce lütfen bizimle iletişime geçin.
</p>
</div>
<?php
}
Gerçek Dünya Senaryosu 2: WooCommerce Satış Özeti Widget’ı
E-ticaret sitelerinde yöneticinin dashboard’u açar açmaz günlük/haftalık satış rakamlarını görmesi büyük kolaylık sağlıyor. WooCommerce aktifse bunu dinamik olarak çekebilirsiniz:
function woo_satis_ozet_widget_ekle() {
if (class_exists('WooCommerce')) {
wp_add_dashboard_widget(
'woo_satis_ozet',
'WooCommerce Satış Özeti',
'woo_satis_ozet_icerik'
);
}
}
add_action('wp_dashboard_setup', 'woo_satis_ozet_widget_ekle');
function woo_satis_ozet_icerik() {
// Bugünün siparişleri
$bugun_baslangic = date('Y-m-d 00:00:00');
$bugun_bitis = date('Y-m-d 23:59:59');
$bugun_siparisler = wc_get_orders(array(
'status' => array('wc-completed', 'wc-processing'),
'date_after' => $bugun_baslangic,
'date_before' => $bugun_bitis,
'limit' => -1,
'return' => 'ids',
));
$bugun_ciro = 0;
foreach ($bugun_siparisler as $siparis_id) {
$siparis = wc_get_order($siparis_id);
$bugun_ciro += $siparis->get_total();
}
// Bu haftanın siparişleri
$hafta_baslangic = date('Y-m-d 00:00:00', strtotime('monday this week'));
$hafta_siparisler = wc_get_orders(array(
'status' => array('wc-completed', 'wc-processing'),
'date_after' => $hafta_baslangic,
'limit' => -1,
'return' => 'ids',
));
$hafta_ciro = 0;
foreach ($hafta_siparisler as $siparis_id) {
$siparis = wc_get_order($siparis_id);
$hafta_ciro += $siparis->get_total();
}
echo '<div style="padding: 5px 0;">';
echo '<p><strong>Bugünkü Sipariş:</strong> ' . count($bugun_siparisler) . ' adet</p>';
echo '<p><strong>Bugünkü Ciro:</strong> ' . number_format($bugun_ciro, 2) . ' TL</p>';
echo '<hr>';
echo '<p><strong>Bu Haftaki Sipariş:</strong> ' . count($hafta_siparisler) . ' adet</p>';
echo '<p><strong>Bu Haftaki Ciro:</strong> ' . number_format($hafta_ciro, 2) . ' TL</p>';
echo '<p style="text-align: right; margin-top: 10px;">';
echo '<a href="' . admin_url('admin.php?page=wc-reports') . '">Tüm Raporlar →</a>';
echo '</p>';
echo '</div>';
}
Widget’ları Kullanıcı Rolüne Göre Kontrol Etmek
Her kullanıcının her widget’ı görmesi gerekmez. Editörün satış raporlarını görmesi mantıksız, müşteri yöneticisinin teknik site sağlığı bilgilerini görmesi de öyle. Rol bazlı kontrol şu şekilde yapılır:
function rol_bazli_dashboard_duzenle() {
$kullanici = wp_get_current_user();
// Sadece admin değilse bazı widget'ları kaldır
if (!in_array('administrator', $kullanici->roles)) {
remove_meta_box('dashboard_site_health', 'dashboard', 'normal');
remove_meta_box('dashboard_php_nag', 'dashboard', 'normal');
}
// Editor rolü için özel düzenleme
if (in_array('editor', $kullanici->roles)) {
remove_meta_box('dashboard_primary', 'dashboard', 'side');
remove_meta_box('dashboard_quick_press', 'dashboard', 'side');
// Editöre özel yardım widget'ı ekle
wp_add_dashboard_widget(
'editor_yardim',
'İçerik Editörü Kılavuzu',
'editor_yardim_icerik'
);
}
// Abone ve contributor için neredeyse her şeyi kaldır
if (in_array('subscriber', $kullanici->roles) ||
in_array('contributor', $kullanici->roles)) {
remove_meta_box('dashboard_right_now', 'dashboard', 'normal');
remove_meta_box('dashboard_activity', 'dashboard', 'normal');
remove_meta_box('dashboard_site_health', 'dashboard', 'normal');
}
}
add_action('wp_dashboard_setup', 'rol_bazli_dashboard_duzenle');
function editor_yardim_icerik() {
echo '<p>Yeni içerik eklemek için sol menüden <strong>Yazılar > Yeni Ekle</strong> seçeneğini kullanın.</p>';
echo '<p>Görsel eklerken dosya boyutunun <strong>2MB</strong> altında olmasına dikkat edin.</p>';
echo '<p>Yayınlamadan önce SEO alanlarını doldurmayı unutmayın.</p>';
}
Widget Sıralamasını Değiştirmek
Bazen widget’ları kaldırmak değil, sadece yeniden sıralamak istersiniz. Kendi eklediğiniz widget’ı en üste taşımak için global $wp_meta_boxes dizisini manipüle edebilirsiniz:
function dashboard_widget_sirasini_ayarla() {
// Önce widget'ı normal şekilde ekle
wp_add_dashboard_widget(
'onemli_duyuru_widget',
'Önemli Duyurular',
'onemli_duyuru_icerik'
);
// Sonra sıralamayı yeniden düzenle
global $wp_meta_boxes;
// Yeni eklediğimiz widget'ı al
$yeni_widget = $wp_meta_boxes['dashboard']['normal']['core']['onemli_duyuru_widget'];
// Mevcut widget'ı kaldır
unset($wp_meta_boxes['dashboard']['normal']['core']['onemli_duyuru_widget']);
// Dizinin başına ekle (en üstte görünsün)
$wp_meta_boxes['dashboard']['normal']['core'] = array_merge(
array('onemli_duyuru_widget' => $yeni_widget),
$wp_meta_boxes['dashboard']['normal']['core']
);
}
add_action('wp_dashboard_setup', 'dashboard_widget_sirasini_ayarla');
function onemli_duyuru_icerik() {
echo '<div style="background: #fff3cd; padding: 10px; border-left: 4px solid #ffc107;">';
echo '<strong>Dikkat!</strong> Bu hafta sonu 02:00-04:00 arası planlı bakım yapılacaktır.';
echo '</div>';
}
Üçüncü Parti Plugin Widget’larını Kaldırmak
Bazı plugin’ler dashboard’a kendiliğinden widget ekliyor. Yoast SEO, WooCommerce, Contact Form 7 gibi popüler plugin’lerin eklediği widget’ları kaldırmak isteyebilirsiniz. Buradaki püf nokta, plugin widget’larının bazılarının farklı hook önceliğiyle yüklenmesi:
function plugin_widget_temizle() {
// Yoast SEO dashboard widget'ı
remove_meta_box('wpseo-dashboard-overview', 'dashboard', 'normal');
// WooCommerce default widget'ları
remove_meta_box('woocommerce_dashboard_status', 'dashboard', 'normal');
remove_meta_box('woocommerce_dashboard_recent_reviews', 'dashboard', 'normal');
// Contact Form 7 (eğer eklediyse)
remove_meta_box('wpcf7_dashboard', 'dashboard', 'normal');
// Wordfence
remove_meta_box('wordfence_activity_widget', 'dashboard', 'normal');
// Elementor
remove_meta_box('e-dashboard-overview', 'dashboard', 'normal');
}
// Önceliği yüksek tutuyoruz ki plugin'lerin ekledikten sonra kaldırabilelim
add_action('wp_dashboard_setup', 'plugin_widget_temizle', 999);
Burada öncelik değeri 999 kullanmak kritik. Çünkü bazı plugin’ler kendi widget’larını yüksek öncelikle ekliyor ve normal öncelikle kaldırmaya çalışırsanız işe yaramıyor. 999 gibi yüksek bir değer, fonksiyonunuzun diğer tüm widget’lar eklendikten sonra çalışmasını garantiliyor.
Dinamik İçerikli Haber Widget’ı
RSS beslemesinden içerik çeken, kurumsal intranet ya da şirket haberleri için kullanılabilecek bir widget örneği:
function sirket_haberleri_widget_ekle() {
wp_add_dashboard_widget(
'sirket_haberleri',
'Şirket Haberleri',
'sirket_haberleri_icerik'
);
}
add_action('wp_dashboard_setup', 'sirket_haberleri_widget_ekle');
function sirket_haberleri_icerik() {
$rss_url = 'https://sirket.com/feed/';
$cache_key = 'sirket_dashboard_haberler';
// Cache kontrolü - her 2 saatte bir güncelle
$haberler = get_transient($cache_key);
if (false === $haberler) {
$rss = fetch_feed($rss_url);
if (!is_wp_error($rss)) {
$haberler = array();
$maks_haber = $rss->get_item_quantity(5);
$haber_listesi = $rss->get_items(0, $maks_haber);
foreach ($haber_listesi as $haber) {
$haberler[] = array(
'baslik' => esc_html($haber->get_title()),
'link' => esc_url($haber->get_permalink()),
'tarih' => $haber->get_date('d.m.Y'),
);
}
set_transient($cache_key, $haberler, 2 * HOUR_IN_SECONDS);
}
}
if (!empty($haberler)) {
echo '<ul style="margin: 0; padding-left: 20px;">';
foreach ($haberler as $haber) {
echo '<li style="margin-bottom: 8px;">';
echo '<a href="' . $haber['link'] . '" target="_blank">';
echo $haber['baslik'];
echo '</a>';
echo ' <small style="color: #999;">(' . $haber['tarih'] . ')</small>';
echo '</li>';
}
echo '</ul>';
} else {
echo '<p>Haberler yüklenirken bir sorun oluştu.</p>';
}
}
Multisite Ortamında Dashboard Widget Yönetimi
WordPress Multisite kullanıyorsanız, network genelinde tüm alt sitelere uygulanacak bir widget düzeni oluşturmak isteyebilirsiniz. Bunu mu-plugins klasöründe bir dosyayla halledebilirsiniz:
// wp-content/mu-plugins/network-dashboard.php
if (!defined('ABSPATH')) exit;
function network_geneli_dashboard_duzenle() {
// Tüm sitelerde WordPress haberlerini kaldır
remove_meta_box('dashboard_primary', 'dashboard', 'side');
// Network geneli bilgi widget'ı ekle
wp_add_dashboard_widget(
'network_bilgi',
'Network Bilgileri',
'network_bilgi_icerik'
);
}
add_action('wp_dashboard_setup', 'network_geneli_dashboard_duzenle');
function network_bilgi_icerik() {
$network_adi = get_network()->site_name;
$mevcut_blog = get_current_blog_id();
$site_url = get_site_url();
echo '<p><strong>Network:</strong> ' . esc_html($network_adi) . '</p>';
echo '<p><strong>Site ID:</strong> ' . $mevcut_blog . '</p>';
echo '<p><strong>URL:</strong> ' . esc_url($site_url) . '</p>';
echo '<p><a href="' . network_admin_url() . '">Network Yönetimine Git →</a></p>';
}
Dikkat Edilmesi Gereken Noktalar
Kod yazarken birkaç kritik konuya dikkat etmek gerekiyor:
- Güvenlik: Widget içinde kullanıcı girdisi veya veritabanından gelen veri gösteriyorsanız mutlaka
esc_html(),esc_url()gibi escape fonksiyonlarını kullanın - Performans: Widget içinde ağır sorgular çalıştırıyorsanız
get_transient()veset_transient()ile cache’leyin. Her sayfa yüklemesinde ağır bir WooCommerce sorgusu çalıştırmak sunucunuzu yorar - Doğru hook kullanımı: Dashboard widget’ları için
admin_initdeğil,wp_dashboard_setuphook’unu kullanın - Plugin çakışmaları: Bir widget’ı kaldıramıyorsanız önce doğru ID’yi ve konumu bulun. Bunu yapmak için
var_dump($wp_meta_boxes['dashboard'])ile mevcut tüm widget’ları listeleyebilirsiniz - Responsive: Widget içindeki HTML’i fazla karmaşık yapmamaya çalışın. WordPress’in dashboard’u zaten responsive ama aşırı karmaşık layoutlar mobilde bozulabilir
- Nonce kullanımı: Widget’ınızda form veya AJAX işlemi varsa mutlaka WordPress nonce mekanizmasını kullanın
Sonuç
Dashboard widget yönetimi, WordPress özelleştirmesinin en pratik ama çoğu zaman göz ardı edilen alanlarından biri. Müşteriye teslim ettiğiniz her sitede varsayılan WordPress haberlerini ve teknik widget’ları kaldırmak, yerine size ulaşmaları için gerekli bilgileri içeren özel bir yardım widget’ı eklemek hem profesyonel bir görünüm sağlıyor hem de gerçekten işlevsel bir yönetim paneli ortaya çıkarıyor.
WooCommerce sitelerinde satış özetlerini direkt dashboard’da görmek, editörlere sadece ihtiyaçları olan araçları sunmak ve gereksiz her şeyi temizlemek, yöneticilerin işini gerçekten kolaylaştırıyor. Tüm bu işlemler functions.php‘ye eklenen birkaç satır kodla halledilebilir ve bir kez yazıldıktan sonra hiç bakım gerektirmiyor.
Eğer bu tür özelleştirmeleri çok sayıda sitede yapıyorsanız, bu kodları bir mu-plugin veya kendi geliştirdiğiniz bir tema altında toplamak bakım sürecini çok kolaylaştırır. functions.php doğrudan temaya bağlı olduğu için tema güncellemelerinde kaybolabilir. Önemli işlevselliği her zaman bir plugin ya da mu-plugin olarak ayrı tutmak en güvenli yaklaşım.
