WordPress Admin Sayfalarına Özel Bildirim Ekleme
WordPress sitenizi yönetirken, özellikle bir ajans ortamında veya müşteri sitelerinde çalışırken, admin paneline özel bildirimler eklemek hayat kurtarıcı olabilir. Bir eklenti güncellemesi gerektiğinde, bakım modu devreye girecekse ya da editörlerin dikkat etmesi gereken özel bir durum varsa, bu bildirimleri doğrudan admin arayüzüne yerleştirmek iletişimi çok daha verimli hale getirir. Bu yazıda functions.php dosyasını kullanarak WordPress admin sayfalarına nasıl özel bildirimler ekleyeceğimizi, farklı kullanıcı rollerine göre nasıl özelleştireceğimizi ve gerçek dünya senaryolarında bunları nasıl işe koşabileceğimizi adım adım ele alacağız.
WordPress Admin Bildirimleri Nedir ve Neden Gereklidir?
WordPress admin panelinde üst kısımda gördüğünüz sarı, kırmızı veya yeşil renkli o bilgi çubuklarını bilirsiniz. Bunlar WordPress’in kendi admin_notices hook’u aracılığıyla gösterdiği bildirimlerdir. Siz de aynı mekanizmayı kullanarak kendi özel bildirimlerinizi ekleyebilirsiniz.
Gerçek dünyada buna ne zaman ihtiyaç duyarsınız?
- Müşteri sitesine bakım yapacaksınız ve editörlerin içerik girmemesini istiyorsunuz
- WooCommerce’de stok durumu kritik seviyelere düşmüş, ilgili kişilerin bunu görmesi gerekiyor
- Site yeni bir sunucuya taşındı ve ekibe bazı geçici kısıtlamaları hatırlatmanız gerekiyor
- Belirli bir eklentinin lisansının bitmesine az kaldı ve bunu sadece yöneticilere göstermek istiyorsunuz
- Yeni bir içerik politikası uygulamaya girdi ve editörlerin bunu görmesi şart
Bunların hepsini e-posta göndererek ya da Slack mesajı atarak halledebilirsiniz elbette. Ama çalıştıkları ortama, yani admin paneline doğrudan not bırakmak çok daha etkili bir yöntemdir.
Temel Admin Bildirimi Ekleme
En basit haliyle admin bildirimi eklemek için admin_notices hook’unu kullanırız. functions.php dosyanıza şu kodu ekleyerek başlayabilirsiniz:
// functions.php
function ozel_admin_bildirimi() {
echo '<div class="notice notice-warning is-dismissible">
<p><strong>Dikkat:</strong> Bu hafta sonu 03:00-05:00 saatleri arasında site bakım moduna alınacaktır. Lütfen kaydedilmemiş içeriklerinizi önceden yedekleyin.</p>
</div>';
}
add_action( 'admin_notices', 'ozel_admin_bildirimi' );
Bu kadar basit. Ama tabii ki bu kodu olduğu gibi bırakırsanız, siteye giren her kullanıcı bu bildirimi görür ve sonsuza kadar görmeye devam eder. Bunu daha kontrollü hale getirmemiz gerekiyor.
WordPress’in bildirim sınıfları şu şekilde çalışır:
- notice-success: Yeşil renk, başarı mesajları için
- notice-warning: Sarı renk, uyarı mesajları için
- notice-error: Kırmızı renk, hata veya kritik uyarılar için
- notice-info: Mavi renk, genel bilgilendirme için
- is-dismissible: Bildirimi kapatılabilir yapar, sağ üstte X butonu çıkar
Kullanıcı Rolüne Göre Bildirim Gösterme
Her bildirimi herkese göstermek genellikle iyi bir fikir değildir. Bir editörün sunucu bakım bildirimini görmesine gerek yoktur. Bir yöneticiye ise içerik politikası hatırlatması gerekmeyebilir. Rol bazlı bildirimler için şu yaklaşımı kullanın:
// Sadece yöneticilere (administrator) bildirim göster
function sadece_admin_bildirimi() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
echo '<div class="notice notice-error is-dismissible">
<p><strong>Kritik:</strong> Sitenizin SSL sertifikası 7 gün içinde sona erecek. Lütfen hosting panelinizden yenileme işlemini gerçekleştirin.</p>
</div>';
}
add_action( 'admin_notices', 'sadece_admin_bildirimi' );
// Sadece editörlere bildirim göster
function sadece_editor_bildirimi() {
$kullanici = wp_get_current_user();
if ( ! in_array( 'editor', $kullanici->roles ) ) {
return;
}
echo '<div class="notice notice-info is-dismissible">
<p><strong>Hatırlatma:</strong> Yeni SEO rehberimiz yayınlandı. İçerik yazarken lütfen <a href="/yeni-seo-kilavuzu.pdf" target="_blank">bu kılavuzu</a> dikkate alın.</p>
</div>';
}
add_action( 'admin_notices', 'sadece_editor_bildirimi' );
Burada iki farklı yaklaşım kullandım. current_user_can('manage_options') yönetici yetkisini kontrol ederken, wp_get_current_user()->roles dizisi üzerinden de doğrudan rol kontrolü yapabilirsiniz. İkincisi daha esnek çünkü WooCommerce’in shop_manager rolü gibi özel rolleri de bu şekilde hedefleyebilirsiniz.
Belirli Admin Sayfalarına Özel Bildirim
Bazı durumlarda bildirimi sadece belirli bir admin sayfasında göstermek isteyebilirsiniz. Mesela WooCommerce siparişler sayfasında, yazı düzenleme ekranında ya da sadece dashboard’da. Bunun için $screen nesnesini kullanırız:
// Sadece yazı düzenleme ekranında bildirim göster
function yazi_ekrani_bildirimi() {
$ekran = get_current_screen();
// Sadece post (yazı) ekleme/düzenleme ekranında göster
if ( $ekran->base !== 'post' || $ekran->post_type !== 'post' ) {
return;
}
echo '<div class="notice notice-warning">
<p><strong>İçerik Politikası Hatırlatması:</strong> Tüm görseller için mutlaka alt metin (alt text) ekleyin. Eksik alt metin içeren yazılar onaylanmayacaktır.</p>
</div>';
}
add_action( 'admin_notices', 'yazi_ekrani_bildirimi' );
// WooCommerce siparişler sayfasında bildirim göster
function woo_siparisler_bildirimi() {
$ekran = get_current_screen();
if ( ! isset( $ekran ) ) {
return;
}
// WooCommerce siparişler için ekran ID'si
if ( $ekran->id !== 'edit-shop_order' && $ekran->id !== 'woocommerce_page_wc-orders' ) {
return;
}
$bekleyen_siparis_sayisi = wc_orders_count( 'pending' );
if ( $bekleyen_siparis_sayisi > 10 ) {
echo '<div class="notice notice-error is-dismissible">
<p><strong>Dikkat!</strong> Şu anda <strong>' . $bekleyen_siparis_sayisi . '</strong> adet bekleyen siparişiniz var. Kargo süreleri etkilenebilir.</p>
</div>';
}
}
add_action( 'admin_notices', 'woo_siparisler_bildirimi' );
Ekran ID’lerini öğrenmek için admin sayfasının URL’sine bakabilirsiniz. Örneğin wp-admin/edit.php?post_type=product adresindeki sayfanın ekran ID’si edit-product olur. Veya geliştirme ortamında şu geçici kodu kullanarak anlık ekran ID’sini öğrenebilirsiniz:
// Geliştirme sırasında ekran ID'sini öğrenmek için
function ekran_id_goster() {
$ekran = get_current_screen();
echo '<div class="notice notice-info"><p>Ekran ID: <strong>' . $ekran->id . '</strong> | Base: <strong>' . $ekran->base . '</strong></p></div>';
}
// add_action( 'admin_notices', 'ekran_id_goster' ); // Gerektiğinde yorum satırını kaldır
Kalıcı Olarak Kapatılabilir Bildirimler
WordPress’in varsayılan is-dismissible özelliği sayfayı yenilediğinizde bildirimi tekrar gösterir. Gerçek anlamda “bir kez kapat ve bir daha görme” işlevi için user meta verisi kullanmamız gerekiyor:
// Kullanıcının bir kez kapatıp bir daha görmeyeceği bildirim
function kalici_kapanir_bildirim() {
$kullanici_id = get_current_user_id();
// Bildirimi kapattıysa bir daha gösterme
if ( get_user_meta( $kullanici_id, 'yeni_politika_bildirimi_kapatildi', true ) ) {
return;
}
// Sadece yönetici ve editörlere göster
if ( ! current_user_can( 'edit_posts' ) ) {
return;
}
?>
<div class="notice notice-info" id="yeni-politika-bildirimi">
<p>
<strong>Yeni İçerik Politikası:</strong>
Ocak 2025 itibarıyla tüm blog yazıları en az 1200 kelime olmalıdır.
Detaylar için <a href="#">politika dokümanını inceleyin</a>.
</p>
<p>
<a href="<?php echo esc_url( admin_url( 'admin-post.php?action=kapat_politika_bildirimi&nonce=' . wp_create_nonce( 'kapat_bildirim_nonce' ) ) ); ?>" class="button button-secondary">
Anladım, bir daha gösterme
</a>
</p>
</div>
<?php
}
add_action( 'admin_notices', 'kalici_kapanir_bildirim' );
// Kapatma işlemini handle et
function politika_bildirimini_kapat() {
if ( ! isset( $_GET['nonce'] ) || ! wp_verify_nonce( $_GET['nonce'], 'kapat_bildirim_nonce' ) ) {
wp_die( 'Güvenlik kontrolü başarısız.' );
}
$kullanici_id = get_current_user_id();
update_user_meta( $kullanici_id, 'yeni_politika_bildirimi_kapatildi', true );
// Geri döndüğümüz URL'yi belirleme
$yonlendirme = wp_get_referer() ? wp_get_referer() : admin_url();
wp_safe_redirect( $yonlendirme );
exit;
}
add_action( 'admin_post_kapat_politika_bildirimi', 'politika_bildirimini_kapat' );
Bu yapı gerçekten kullanışlıdır. Her kullanıcı bildirimi kendine göre kapatır, diğer kullanıcılar etkilenmez. nonce kullanımı güvenlik açısından da kritik, bunu atlamayın.
Tarih Bazlı Geçici Bildirimler
Bazen bir bildirimi sadece belirli bir tarih aralığında göstermek istersiniz. Mesela bakım penceresi öncesinde 3 gün boyunca veya bir kampanya süresince:
// Belirli tarih aralığında gösterilen bildirim
function tarih_bazli_bildirim() {
$baslangic = strtotime( '2025-02-01 00:00:00' );
$bitis = strtotime( '2025-02-05 23:59:59' );
$simdi = current_time( 'timestamp' );
if ( $simdi < $baslangic || $simdi > $bitis ) {
return;
}
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$kalan_gun = ceil( ( $bitis - $simdi ) / DAY_IN_SECONDS );
echo '<div class="notice notice-error">
<p>
<span style="font-size:16px;">🔧</span>
<strong>Sunucu Migrasyonu:</strong>
5 Şubat 2025 gece 02:00'da site yeni sunucuya taşınacak.
Taşınmaya <strong>' . $kalan_gun . ' gün</strong> kaldı.
DNS önbelleğinizi temizlemeye hazır olun.
</p>
</div>';
}
add_action( 'admin_notices', 'tarih_bazli_bildirim' );
current_time('timestamp') kullanımına dikkat edin. Sunucunuz farklı bir zaman diliminde olsa bile WordPress’in ayarlarındaki saat dilimini baz alır. Bu özellikle Türkiye’deki sitelerde önemli çünkü sunucular çoğunlukla UTC üzerinde çalışır.
Özel Renklendirilmiş ve Stilli Bildirimler
Bazen standart WordPress bildirim renkleri yetmez. Daha dikkat çekici veya marka uyumlu bir bildirim isteyebilirsiniz. Inline CSS ile bunu kolayca yapabilirsiniz:
// Özel tasarımlı acil durum bildirimi
function acil_durum_bildirimi() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$stil = '
background: linear-gradient(135deg, #ff416c, #ff4b2b);
border-left: none;
border-radius: 6px;
color: #ffffff;
padding: 16px 20px;
display: flex;
align-items: center;
gap: 12px;
box-shadow: 0 4px 15px rgba(255, 65, 108, 0.3);
';
$baslik_stil = 'font-size: 16px; font-weight: 700; margin: 0 0 6px 0;';
$metin_stil = 'margin: 0; opacity: 0.9; font-size: 14px;';
echo '<div class="notice" style="' . esc_attr( $stil ) . '">
<div style="font-size: 32px; line-height: 1;">🚨</div>
<div>
<p style="' . esc_attr( $baslik_stil ) . '">ACİL: Veritabanı Yedekleme Hatası</p>
<p style="' . esc_attr( $metin_stil ) . '">
Son otomatik yedekleme 48 saat önce başarısız oldu.
Lütfen manuel yedek alın ve eklenti ayarlarını kontrol edin.
</p>
</div>
</div>';
}
add_action( 'admin_notices', 'acil_durum_bildirimi' );
Çok Fonksiyonlu Bildirim Sistemi
Büyük projelerde tek tek bildirim eklemek yerine merkezi bir bildirim sistemi kurmak çok daha sürdürülebilirdir. Şöyle bir yapı kurabilirsiniz:
// Merkezi bildirim yönetim sistemi
class AdminBildirimYoneticisi {
private static $bildirimler = array();
public static function ekle( $mesaj, $tip = 'info', $kapat = true, $kime = 'manage_options' ) {
self::$bildirimler[] = array(
'mesaj' => $mesaj,
'tip' => $tip,
'kapat' => $kapat,
'kime' => $kime,
);
}
public static function goster() {
foreach ( self::$bildirimler as $bildirim ) {
// Yetki kontrolü
if ( is_string( $bildirim['kime'] ) && ! current_user_can( $bildirim['kime'] ) ) {
continue;
}
// Dizi olarak gönderilmişse (çoklu rol desteği)
if ( is_array( $bildirim['kime'] ) ) {
$kullanici = wp_get_current_user();
$ortak_roller = array_intersect( $kullanici->roles, $bildirim['kime'] );
if ( empty( $ortak_roller ) ) {
continue;
}
}
$kapat_sinifi = $bildirim['kapat'] ? 'is-dismissible' : '';
echo '<div class="notice notice-' . esc_attr( $bildirim['tip'] ) . ' ' . $kapat_sinifi . '">';
echo '<p>' . wp_kses_post( $bildirim['mesaj'] ) . '</p>';
echo '</div>';
}
}
}
add_action( 'admin_notices', array( 'AdminBildirimYoneticisi', 'goster' ) );
// Kullanım örneği - bu kısımları ihtiyaca göre doldurursunuz
function bildirimleri_tanimla() {
// Bakım bildirimi - sadece adminlere
AdminBildirimYoneticisi::ekle(
'<strong>Bakım Planı:</strong> 15 Şubat'ta PHP 8.2'ye güncelleme yapılacak.',
'warning',
true,
'manage_options'
);
// Editör ve yöneticilere içerik bildirimi
AdminBildirimYoneticisi::ekle(
'<strong>Hatırlatma:</strong> Şubat ayı içerik takvimi paylaşıldı. <a href="#">Görmek için tıklayın.</a>',
'info',
true,
array( 'administrator', 'editor' )
);
}
add_action( 'admin_init', 'bildirimleri_tanimla' );
Bu yapının güzelliği şu: İleride yeni bildirim eklemek için tek bir satır kod yazmanız yeterli. Sistemi bir kez kuruyorsunuz, sonra AdminBildirimYoneticisi::ekle() ile istediğiniz kadar bildirim tanımlayabilirsiniz.
Gerçek Dünya Senaryosu: WooCommerce Düşük Stok Uyarısı
Son olarak pratik ve sıkça karşılaşılan bir senaryoyu inceleyelim. WooCommerce kullanan bir e-ticaret sitesinde stok yönetimi kritik öneme sahiptir. Sipariş yönetimine giren birinin hemen ilk bakışta stok durumunu görmesi için:
// WooCommerce düşük stok admin bildirimi
function woo_dusuk_stok_bildirimi() {
// WooCommerce aktif değilse çalışma
if ( ! class_exists( 'WooCommerce' ) ) {
return;
}
// Sadece shop manager ve adminlere göster
if ( ! current_user_can( 'manage_woocommerce' ) ) {
return;
}
// Stok eşiğini WooCommerce ayarından al
$esik = absint( get_option( 'woocommerce_notify_low_stock_amount', 2 ) );
// Düşük stoktaki ürünleri sorgula
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock',
'value' => $esik,
'compare' => '<=',
'type' => 'NUMERIC',
),
array(
'key' => '_manage_stock',
'value' => 'yes',
),
),
);
$dusuk_stok_urunler = get_posts( $args );
$adet = count( $dusuk_stok_urunler );
if ( $adet === 0 ) {
return;
}
$link = admin_url( 'edit.php?post_type=product&stock_status=lowstock' );
echo '<div class="notice notice-warning is-dismissible">
<p>
📦 <strong>Düşük Stok Uyarısı:</strong>
' . $adet . ' ürünün stoğu kritik seviyede (' . $esik . ' adet veya altında).
<a href="' . esc_url( $link ) . '">Ürünleri görüntüle</a>
</p>
</div>';
}
add_action( 'admin_notices', 'woo_dusuk_stok_bildirimi' );
Bu kod her admin sayfası yüklendiğinde çalışır. Performans açısından endişeniz varsa, sonucu transient ile 1-2 saatliğine önbelleğe alabilirsiniz.
Dikkat Edilmesi Gereken Noktalar
Bildirim eklerken bazı temel prensiplere dikkat etmek gerekiyor:
- Güvenlik: Kullanıcı girdisi içeren her değeri
esc_html(),esc_attr()veyawp_kses_post()ile temizleyin - Nonce kullanımı: POST veya GET ile işlem yapan bildirimlerde nonce doğrulamasını atlamamalısınız
- Performans: Veritabanı sorgusu yapan bildirimleri transient ile önbelleğe alın
- Kullanıcı deneyimi: Çok fazla bildirim admin panelini gürültülü hale getirir, gereksiz bildirimleri kaldırın
- Test: Bildirimleri farklı roller ve yetkiler ile test edin, yanlış kişilere görünmediğinden emin olun
- hook sırası:
admin_noticeshook’u header’dan sonra çalışır, PHP redirect yapamassınız, bunun içinadmin_initkullanın
Sonuç
WordPress admin bildirim sistemi, görünürde küçük ama pratik etkisi büyük olan bir araçtır. admin_notices hook’unu ustalıkla kullanarak siteyi yöneten ekibe kritik bilgileri doğrudan çalıştıkları ortamda iletebilirsiniz. Rol bazlı hedefleme, tarih kısıtlamaları, kalıcı kapatma mekanizması ve merkezi bildirim yöneticisi gibi yapıları birleştirdiğinizde gerçekten güçlü bir iletişim altyapısı kurmuş olursunuz.
Ajans olarak çalışıyorsanız bu tür bildirimleri müşteri sitelerinin functions.php dosyasına veya site-specific eklentilere eklemek, müşterilerinizle iletişim kalitenizi ciddi ölçüde artırır. “Bakım var, içerik girme” ya da “Yedek alındı, sorun yok” gibi mesajları doğrudan admin paneline taşımak, e-posta trafiğini azaltır ve yanlış anlaşılmaları önler. Kod örneklerini kendi ihtiyaçlarınıza göre uyarlayarak başlayın ve zaman içinde kendi bildirim kütüphanenizi oluşturun.
