WordPress Sayfa Sonuna Script Ekleme: wp_footer Kullanımı
WordPress projelerinde en sık karşılaşılan ihtiyaçlardan biri, belirli scriptleri sayfanın sonuna doğru şekilde eklemektir. Tema dosyalarını direkt düzenlemek yerine functions.php üzerinden bu işi yapmak hem daha temiz hem de tema güncellemelerinde kayıp yaşamazsın. Bu yazıda WordPress’in script yükleme sistemini, wp_footer hook’unu ve wp_enqueue_scripts fonksiyonunu gerçek dünya senaryolarıyla birlikte ele alacağız.
WordPress Script Yükleme Sistemi Neden Önemli?
Çoğu geliştirici başlangıçta şablona direkt etiketi yerleştiriyor. Bu yaklaşım kısa vadede çalışıyor gibi görünse de büyük projelerde ciddi sorunlara yol açıyor. Aynı script iki kez yükleniyor, plugin çakışmaları oluyor ya da script sıralaması bozuluyor.
WordPress’in wp_enqueue_scripts sistemi bu sorunları çözmek için tasarlanmış. Bu sistem sayesinde:
- Aynı scriptin birden fazla yüklenmesini engellersin
- Script bağımlılıklarını tanımlarsın (jQuery yüklenmeden çalışan kod olmaz)
- Scriptlerin head veya footer’a yerleşimini kontrol edersin
- Cache ve minification araçlarıyla uyumlu çalışırsın
Temel wp_enqueue_script Kullanımı
En basit haliyle bir scripti footer’a eklemek şu şekilde yapılıyor:
function site_scriptleri_yukle() {
wp_enqueue_script(
'ozel-script',
get_template_directory_uri() . '/js/ozel.js',
array(),
'1.0.0',
true
);
}
add_action( 'wp_enqueue_scripts', 'site_scriptleri_yukle' );
Burada son parametre olan true kritik. Bu değer true olduğunda WordPress script’i etiketinden hemen önce yükler. false veya boş bırakırsan içine gider.
wp_enqueue_script parametrelerine bakalım:
- handle: Scriptin benzersiz adı, WordPress bunu takip etmek için kullanır
- src: Dosyanın tam URL’i
- deps: Bağımlı olduğu scriptlerin handle listesi
- ver: Versiyon numarası, cache sorunlarını önler
- in_footer:
trueolursa footer’a,falseolursa head’e eklenir
jQuery Bağımlılığıyla Script Ekleme
Eğer yazacağın script jQuery kullanıyorsa bağımlılığı belirtmen gerekiyor. WordPress zaten jQuery’i barındırıyor, sadece jquery handle’ını deps dizisine eklemen yeterli:
function jquery_bagli_script_yukle() {
wp_enqueue_script(
'slider-script',
get_template_directory_uri() . '/js/slider.js',
array( 'jquery' ),
'2.1.0',
true
);
}
add_action( 'wp_enqueue_scripts', 'jquery_bagli_script_yukle' );
Bu tanımlamayı yaptıktan sonra jQuery her zaman slider scriptinden önce yüklenecek. Bağımlılık zinciri WordPress tarafından otomatik yönetiliyor.
Inline Script Ekleme (wp_add_inline_script)
Bazen dış dosya yerine küçük bir JavaScript bloğunu direkt sayfaya gömmek isteyebilirsin. Analitik kodları, konfigürasyon değişkenleri veya API anahtarları için bu yöntem çok işe yarıyor:
function php_verisi_scriptine_gonder() {
wp_enqueue_script(
'site-config',
get_template_directory_uri() . '/js/config.js',
array(),
'1.0',
true
);
$config_data = array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'site_url' => get_site_url(),
'nonce' => wp_create_nonce( 'guvenlik-nonce' ),
'kullanici' => get_current_user_id(),
);
wp_add_inline_script(
'site-config',
'var SiteConfig = ' . json_encode( $config_data ) . ';',
'before'
);
}
add_action( 'wp_enqueue_scripts', 'php_verisi_scriptine_gonder' );
wp_add_inline_script‘in üçüncü parametresi before veya after alıyor. before dersen inline kod dosyadan önce çalışır, after dersen dosyadan sonra. PHP verilerini JavaScript’e aktarırken genellikle before kullanmak daha mantıklı.
Belirli Sayfalarda Script Yükleme
Her sayfada her scripti yüklemek gereksiz istek sayısını artırır. Koşullu etiketler kullanarak scriptleri sadece ihtiyaç duyulan sayfalarda yükleyebilirsin:
function kosullu_script_yukle() {
// Sadece tekil yazılarda yükle
if ( is_single() ) {
wp_enqueue_script(
'yorum-efekti',
get_template_directory_uri() . '/js/yorumlar.js',
array( 'jquery' ),
'1.0',
true
);
}
// Sadece iletisim sayfasında yükle
if ( is_page( 'iletisim' ) ) {
wp_enqueue_script(
'google-maps',
'https://maps.googleapis.com/maps/api/js?key=ANAHTAR_BURAYA',
array(),
null,
true
);
}
// Sadece WooCommerce sepet sayfasında yükle
if ( function_exists( 'is_cart' ) && is_cart() ) {
wp_enqueue_script(
'sepet-hesaplama',
get_template_directory_uri() . '/js/sepet.js',
array( 'jquery', 'wc-cart' ),
'1.2',
true
);
}
}
add_action( 'wp_enqueue_scripts', 'kosullu_script_yukle' );
Sık kullandığım koşullu etiketler:
- is_front_page(): Ana sayfa kontrolü
- is_page(): Belirli bir sayfa kontrolü (ID, slug veya başlık alır)
- is_single(): Tekil yazı sayfası
- is_category(): Kategori arşiv sayfası
- is_user_logged_in(): Giriş yapmış kullanıcı kontrolü
- is_admin(): Admin paneli kontrolü
wp_footer Hook ile Doğrudan Script Yerleştirme
Bazen wp_enqueue sistemini atlamak ve direkt footer’a bir şey gömmek gerekebilir. Özellikle üçüncü parti araçların verdiği embed kodları için bu yöntem kullanılıyor:
function footer_tracking_kodu_ekle() {
// Sadece admin olmayan kullanicilarda calis
if ( current_user_can( 'manage_options' ) ) {
return;
}
?>
<!-- Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX');
</script>
<?php
}
add_action( 'wp_footer', 'footer_tracking_kodu_ekle' );
Dikkat etmem gereken nokta: wp_footer hook’u çalışması için temanın footer.php dosyasında çağrısı bulunması gerekiyor. Eğer bu çağrı eksikse hiçbir footer scripti çalışmaz.
WooCommerce Sipariş Sayfasına Özel Script
Gerçek bir senaryo olarak WooCommerce sipariş tamamlama sayfasına dönüşüm takip kodu ekleyelim. Bu sayfa çok kritik çünkü her yenilenmesinde script çalışmamalı, sadece gerçek satın alma sonrasında çalışmalı:
function woo_siparis_tamamlama_scripti() {
if ( ! function_exists( 'is_order_received_page' ) ) {
return;
}
if ( is_order_received_page() ) {
global $wp;
$siparis_id = absint( $wp->query_vars['order-received'] );
if ( $siparis_id > 0 ) {
$siparis = wc_get_order( $siparis_id );
if ( $siparis ) {
$toplam = $siparis->get_total();
$para_br = get_woocommerce_currency();
wp_add_inline_script(
'jquery',
"
jQuery(document).ready(function($) {
console.log('Siparis tamamlandi: " . esc_js( $toplam ) . " " . esc_js( $para_br ) . "');
// Burada donusum pikseli veya ozel kod calistirilabilir
if(typeof fbq !== 'undefined') {
fbq('track', 'Purchase', {
value: " . floatval( $toplam ) . ",
currency: '" . esc_js( $para_br ) . "'
});
}
});
",
'after'
);
}
}
}
}
add_action( 'wp_enqueue_scripts', 'woo_siparis_tamamlama_scripti' );
Bu kod gerçek sipariş ID’sini alıyor, sipariş verilerini çekiyor ve bu verileri Facebook Pixel’e gönderiyor. Statik bir dönüşüm kodu yerine dinamik sipariş tutarı kullanıldığı için çok daha doğru analitik verisi elde edilir.
Script Versiyonlama ve Cache Yönetimi
Üretim ortamında script güncellemelerinin kullanıcılara ulaşmaması çok sinir bozucu bir durum. Versiyon numarasına dosyanın değiştirilme tarihini ekleyerek cache sorununu otomatik olarak çözebilirsin:
function cache_dostu_script_yukle() {
$script_dosyasi = get_template_directory() . '/js/ana.js';
$versiyon = file_exists( $script_dosyasi )
? filemtime( $script_dosyasi )
: '1.0.0';
wp_enqueue_script(
'ana-script',
get_template_directory_uri() . '/js/ana.js',
array( 'jquery' ),
$versiyon,
true
);
}
add_action( 'wp_enqueue_scripts', 'cache_dostu_script_yukle' );
filemtime() fonksiyonu dosyanın son değiştirilme zamanını Unix timestamp olarak döndürüyor. Dosyayı her güncellediğinde URL parametresi değişeceği için tarayıcı cache’i otomatik olarak sıfırlanıyor. Geliştirme ortamında bunu WP_DEBUG ile kontrol altına alabilirsin:
function gelistirme_ortami_script() {
$versiyon = WP_DEBUG ? time() : '1.5.2';
wp_enqueue_script(
'gelistirme-script',
get_template_directory_uri() . '/js/main.js',
array( 'jquery' ),
$versiyon,
true
);
}
add_action( 'wp_enqueue_scripts', 'gelistirme_ortami_script' );
Geliştirme modunda time() kullanmak her sayfa yüklemesinde taze dosyayı getiriyor. Prodüksiyonda ise sabit versiyon numarası cache’in verimli çalışmasını sağlıyor.
Birden Fazla Scripti Düzenli Yönetme
Projelerde script sayısı arttıkça tek bir büyük fonksiyon karmaşıklaşıyor. Scriptleri dizi olarak tanımlayıp döngüyle yüklemek çok daha yönetilebilir bir yapı sunuyor:
function tum_site_scriptlerini_yukle() {
$scriptler = array(
array(
'handle' => 'slick-slider',
'src' => get_template_directory_uri() . '/js/slick.min.js',
'deps' => array( 'jquery' ),
'ver' => '1.8.1',
'footer' => true,
'kosul' => true,
),
array(
'handle' => 'iletisim-formu',
'src' => get_template_directory_uri() . '/js/iletisim.js',
'deps' => array( 'jquery' ),
'ver' => '2.0',
'footer' => true,
'kosul' => is_page( 'iletisim' ),
),
array(
'handle' => 'urun-galerisi',
'src' => get_template_directory_uri() . '/js/galeri.js',
'deps' => array( 'jquery', 'slick-slider' ),
'ver' => '1.1',
'footer' => true,
'kosul' => ( function_exists( 'is_product' ) && is_product() ),
),
array(
'handle' => 'analitik-kod',
'src' => 'https://cdn.ornek.com/analytics.js',
'deps' => array(),
'ver' => null,
'footer' => true,
'kosul' => ! is_user_logged_in(),
),
);
foreach ( $scriptler as $script ) {
if ( ! empty( $script['kosul'] ) ) {
wp_enqueue_script(
$script['handle'],
$script['src'],
$script['deps'],
$script['ver'],
$script['footer']
);
}
}
}
add_action( 'wp_enqueue_scripts', 'tum_site_scriptlerini_yukle' );
Bu yapıyla yeni bir script eklemek sadece diziye bir eleman eklemek anlamına geliyor. Hangi scriptlerin aktif olduğunu, bağımlılıklarını ve koşullarını tek yerden görebiliyorsun.
Sık Yapılan Hatalar ve Çözümleri
Yıllarca WordPress projesinde çalışırken aynı hataların tekrar edildiğini görüyorum:
wp_footer çağrısı eksik: Tema footer.php’de wp_footer() yoksa hiçbir script çalışmaz. Her özel temada bunu kontrol et.
handle çakışması: İki farklı plugin aynı handle ismini kullanırsa biri diğerini eziyor. Projene özgü prefix kullan: mytema-jquery gibi.
Yanlış URL fonksiyonu: Child tema kullanıyorsan get_template_directory_uri() yerine get_stylesheet_directory_uri() kullanman gerekebilir. İkisinin farkını bilmek önemli:
- get_template_directory_uri(): Her zaman parent temayı gösterir
- get_stylesheet_directory_uri(): Aktif temayı gösterir, child temada child klasörünü döner
Null versiyon parametresi: Dış CDN’den yüklenen scriptlerde kendi versiyon numaranı eklemek anlamsız. Bu durumda null geçerek WordPress’in o parametreyi URL’e eklememesini sağlarsın.
Admin panelinde de çalışan scriptler: wp_enqueue_scripts hook’u frontend için çalışıyor ama eğer dikkatli olmazsan bazı kodlar admin panelini de etkiler. is_admin() kontrolü eklemek iyi bir alışkanlık.
Performans Optimizasyonu için defer ve async
Modern tarayıcılar defer ve async attribute’larını destekliyor. WordPress bu özellikleri doğrudan wp_enqueue_script üzerinden sunmuyor ama script_loader_tag filtresiyle ekleyebilirsin:
function script_defer_ekle( $tag, $handle, $src ) {
$defer_scriptler = array( 'slick-slider', 'analitik-kod', 'chat-widget' );
if ( in_array( $handle, $defer_scriptler ) ) {
return '<script defer src="' . esc_url( $src ) . '"></script>' . "n";
}
return $tag;
}
add_filter( 'script_loader_tag', 'script_defer_ekle', 10, 3 );
defer attribute’u scriptin parse işlemini engellemeden arka planda indirilmesini ve DOM yüklendikten sonra çalışmasını sağlıyor. Analytics ve chat widget gibi kritik olmayan scriptler için bu yöntemi her projede kullanıyorum. PageSpeed skorları belirgin şekilde artıyor.
async ile defer arasındaki fark önemli:
- defer: DOM parse tamamlandıktan sonra, sırayla çalışır
- async: İndirilir inmez çalışır, sıra garantisi yoktur
jQuery’e bağımlı scriptlerde async kullanma, sıralama bozulabilir. Bağımsız scriptlerde ise async daha iyi performans verebilir.
Gerçek Dünya Senaryosu: Üyelik Sitesi Script Yönetimi
Bir üyelik sitesi düşün. Misafir kullanıcılara kayıt teşvik popup’u, üyelere dashboard scripti, premium üyelere ek özellikler lazım. Bunu functions.php‘de şu şekilde yönetebilirsin:
function uyelik_sitesi_scriptleri() {
// Herkes icin temel script
wp_enqueue_script(
'site-temel',
get_template_directory_uri() . '/js/temel.js',
array( 'jquery' ),
'3.0',
true
);
if ( ! is_user_logged_in() ) {
// Misafir kullanicilar icin kayit popup
wp_enqueue_script(
'kayit-popup',
get_template_directory_uri() . '/js/popup.js',
array( 'jquery', 'site-temel' ),
'1.5',
true
);
// Popup ayarlarini JS'e gonder
wp_add_inline_script(
'kayit-popup',
'var PopupConfig = { gosterim_suresi: 5000, cookie_sure: 7 };',
'before'
);
} else {
$kullanici = wp_get_current_user();
$uye_seviyesi = get_user_meta( $kullanici->ID, 'uyelik_seviyesi', true );
// Tum uyeler icin dashboard
wp_enqueue_script(
'uye-dashboard',
get_template_directory_uri() . '/js/dashboard.js',
array( 'jquery', 'site-temel' ),
'2.0',
true
);
// Sadece premium uyeler icin
if ( 'premium' === $uye_seviyesi ) {
wp_enqueue_script(
'premium-ozellikler',
get_template_directory_uri() . '/js/premium.js',
array( 'jquery', 'uye-dashboard' ),
'1.0',
true
);
}
}
}
add_action( 'wp_enqueue_scripts', 'uyelik_sitesi_scriptleri' );
Bu yapı hem temiz hem de genişletmesi kolay. Yeni bir üyelik seviyesi eklemek istediğinde sadece ilgili bloğu genişletiyorsun.
Sonuç
WordPress’te scriptleri sayfa sonuna doğru şekilde eklemek, hem performans hem de bakım kolaylığı açısından büyük fark yaratıyor. Tema dosyalarına direkt etiketi yerleştirmek yerine wp_enqueue_scripts sistemini kullanmak uzun vadede çok daha sağlam bir yapı sunuyor.
Özetlemek gerekirse en kritik noktalar şunlar:
- Her zaman
wp_enqueue_scriptkullan, direkt script etiketi yerleştirme - Bağımlılıkları tanımla, özellikle jQuery kullanan scriptlerde
- Koşullu yükleme yap, gereksiz her sayfada her şeyi yükleme
- Cache yönetimini ihmal etme, versiyon parametresini akıllıca kullan
deferveasynckullan, kritik olmayan scriptleri engelleme- Temanın
wp_footer()çağırıp çağırmadığını kontrol et
Bu prensipleri uygulayan bir WordPress sitesinde hem kullanıcı deneyimi hem de arama motoru performansı belirgin şekilde iyileşiyor. functions.php, doğru kullanıldığında tema dosyalarına dokunmadan sitenin davranışını şekillendirmenin en güçlü aracı olmaya devam ediyor.
