Facebook Pixel Kodunu WordPress’e functions.php ile Ekleme
E-ticaret sitelerinde dönüşüm takibi yapmak istiyorsanız, Facebook Pixel olmadan işinizi büyütmek neredeyse imkansız. Hangi reklamların satış getirdiğini, hangi sayfaların ziyaretçiyi dönüştürdüğünü, sepeti terk eden kullanıcıları nasıl yeniden hedefleyeceğinizi ancak Pixel verisiyle anlayabilirsiniz. WordPress’te bu entegrasyonu doğru yapmak ise birkaç farklı yol sunar; ama en temiz ve kontrol edilebilir yöntem functions.php üzerinden programatik olarak eklemektir.
Facebook Pixel Nedir ve Neden functions.php Kullanmalıyız
Facebook Pixel, Meta’nın reklam platformunun siteye gömdüğünüz küçük bir JavaScript kod parçasıdır. Ziyaretçilerin siteinizdeki hareketlerini takip eder, bu verileri Meta’ya iletir ve siz de bu verilerle reklam hedeflemenizi optimize edersiniz.
WordPress’e Pixel eklemek için üç yöntem var. Plugin kullanmak, tema editöründen header’a yapıştırmak ya da functions.php üzerinden eklemek. Plugin yöntemi basit görünür ama her eklenti bir ağırlıktır, bakımı gerektirir ve bazen çakışmalar yaratır. Tema editöründen doğrudan header.php’ye yazmak da kötü bir pratik çünkü tema güncellendiğinde her şey gider. functions.php yöntemi ise hem güncelleme korumalı (child theme kullanırsanız) hem de programatik kontrol imkanı sağlar. Belirli sayfalarda farklı eventlar çalıştırabilir, kullanıcı rolüne göre filtreleme yapabilir, WooCommerce siparişlerini otomatik takip edebilirsiniz.
Temel Pixel Kod Yapısı
Meta’nın sunduğu standart Pixel kodu şu şekilde görünür. Bu kodu Business Manager’dan aldığınızda Pixel ID’niz yerleştirilmiş halde gelir.
<!-- Facebook Pixel Code -->
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', 'PIXEL_ID_BURAYA');
fbq('track', 'PageView');
</script>
<noscript>
<img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=PIXEL_ID_BURAYA&ev=PageView&noscript=1"/>
</noscript>
<!-- End Facebook Pixel Code -->
Bu kodu her sayfanın bölümüne eklemek gerekir. functions.php ile bunu şöyle yaparsınız:
<?php
// Facebook Pixel - Temel Kurulum
function fb_pixel_temel() {
$pixel_id = '1234567890123456'; // Kendi Pixel ID'nizi buraya yazin
?>
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '<?php echo esc_js($pixel_id); ?>');
fbq('track', 'PageView');
</script>
<noscript>
<img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=<?php echo esc_attr($pixel_id); ?>&ev=PageView&noscript=1"/>
</noscript>
<?php
}
add_action('wp_head', 'fb_pixel_temel');
Pixel ID’yi sabit string olarak gömmek yerine bir sabit tanımlamak daha iyi bir pratiktir. Bu sayede ID’yi tek yerden yönetirsiniz.
Pixel ID’yi Güvenli ve Yönetilebilir Şekilde Tanımlama
Büyük projelerde ya da birden fazla geliştiricinin çalıştığı ortamlarda, Pixel ID’yi functions.php’nin en üstünde bir sabit olarak tanımlamak hayat kurtarır.
<?php
// Sabitler - functions.php dosyasinin en ustune ekleyin
define('FB_PIXEL_ID', '1234567890123456');
define('FB_PIXEL_AKTIF', true);
// Facebook Pixel - Sabit kullanarak
function fb_pixel_yukle() {
// Pixel aktif mi kontrol et
if (!FB_PIXEL_AKTIF) {
return;
}
// Admin panelinde yukleme (opsiyonel - genellikle istemezsiniz)
if (is_admin()) {
return;
}
// Bot ve crawler filtresi
if (wp_is_mobile() === false) {
// Desktop ve tablet icin normal devam
}
$pixel_id = esc_js(FB_PIXEL_ID);
echo "
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '{$pixel_id}');
fbq('track', 'PageView');
</script>
<noscript>
<img height='1' width='1' style='display:none'
src='https://www.facebook.com/tr?id={$pixel_id}&ev=PageView&noscript=1'/>
</noscript>
";
}
add_action('wp_head', 'fb_pixel_yukle', 1);
wp_head hook’una öncelik olarak 1 vermek, Pixel kodunun diğer scriptlerden önce yüklenmesini sağlar. Bu önemli çünkü bazı pluginler head’e geç eklenen scriptlerin önüne geçebilir.
WooCommerce Entegrasyonu: ViewContent Eventi
WooCommerce kullananlar için en değerli eventlardan biri ViewContent‘dir. Ziyaretçi bir ürün sayfasına girdiğinde bu event tetiklenir. Meta algoritması bu veriyi kullanarak benzer ürünlere ilgi duyan kullanıcıları bulur.
<?php
// WooCommerce Urun Sayfasi - ViewContent Eventi
function fb_pixel_woo_urun_sayfasi() {
if (!FB_PIXEL_AKTIF || !is_product()) {
return;
}
global $product;
if (!$product) {
return;
}
$urun_id = $product->get_id();
$urun_adi = esc_js($product->get_name());
$urun_fiyat = $product->get_price();
$urun_para = get_woocommerce_currency();
$urun_sku = esc_js($product->get_sku());
$kategori = wp_get_post_terms($urun_id, 'product_cat', array('fields' => 'names'));
$kategori_adi = !empty($kategori) ? esc_js($kategori[0]) : '';
echo "
<script>
fbq('track', 'ViewContent', {
content_name: '{$urun_adi}',
content_ids: ['{$urun_sku}'],
content_type: 'product',
value: {$urun_fiyat},
currency: '{$urun_para}',
content_category: '{$kategori_adi}'
});
</script>
";
}
add_action('wp_footer', 'fb_pixel_woo_urun_sayfasi');
Bu kodu wp_footer‘a bağladık çünkü footer’da WooCommerce global $product değişkeni güvenli biçimde erişilebilir durumdadır. wp_head‘de bazen product objesi henüz yüklenmemiş olabilir.
AddToCart Eventi
Sepete ekleme eventi, dönüşüm hunisinin kritik bir noktasıdır. Sepete ürün ekleyen ama satın almayan kullanıcıları yeniden hedeflemek için bu veriye ihtiyacınız var.
<?php
// WooCommerce - Sepete Ekleme Eventi
function fb_pixel_sepete_ekle() {
if (!FB_PIXEL_AKTIF || !is_cart()) {
return;
}
$cart = WC()->cart;
if (!$cart || $cart->is_empty()) {
return;
}
$toplam_tutar = $cart->get_cart_contents_total();
$para_birimi = get_woocommerce_currency();
$urun_idleri = array();
$urun_adlari = array();
foreach ($cart->get_cart() as $cart_item) {
$urun = $cart_item['data'];
if ($urun) {
$urun_idleri[] = $urun->get_sku() ? $urun->get_sku() : $urun->get_id();
$urun_adlari[] = $urun->get_name();
}
}
$idler_json = json_encode($urun_idleri);
echo "
<script>
fbq('track', 'AddToCart', {
content_ids: {$idler_json},
content_type: 'product',
value: {$toplam_tutar},
currency: '{$para_birimi}',
num_items: " . count($urun_idleri) . "
});
</script>
";
}
add_action('wp_footer', 'fb_pixel_sepete_ekle');
Purchase Eventi: En Kritik Dönüşüm Takibi
Satın alma eventi, Meta’ya “bu kullanıcı dönüştü” sinyalini gönderir. Reklam optimizasyonu için en değerli event budur. Bunu WooCommerce’in teşekkür sayfasına bağlayacağız.
<?php
// WooCommerce - Satin Alma Tamamlandi (Thank You Page)
function fb_pixel_satin_alma($siparis_id) {
if (!FB_PIXEL_AKTIF || !$siparis_id) {
return;
}
$siparis = wc_get_order($siparis_id);
if (!$siparis) {
return;
}
// Ayni siparisde tekrar tetiklenmeyi onle
$pixel_gonderildi = get_post_meta($siparis_id, '_fb_pixel_purchase_sent', true);
if ($pixel_gonderildi) {
return;
}
$toplam = $siparis->get_total();
$para_birimi = $siparis->get_currency();
$siparis_no = $siparis->get_order_number();
$urun_sayisi = $siparis->get_item_count();
$urun_idleri = array();
foreach ($siparis->get_items() as $item) {
$urun = $item->get_product();
$sku = $urun ? $urun->get_sku() : '';
$urun_idleri[] = $sku ? $sku : $item->get_product_id();
}
$idler_json = json_encode($urun_idleri);
// Meta'ya gonderildi olarak isaretla
update_post_meta($siparis_id, '_fb_pixel_purchase_sent', true);
echo "
<script>
fbq('track', 'Purchase', {
value: {$toplam},
currency: '{$para_birimi}',
content_ids: {$idler_json},
content_type: 'product',
num_items: {$urun_sayisi},
order_id: '{$siparis_no}'
});
</script>
";
}
add_action('woocommerce_thankyou', 'fb_pixel_satin_alma');
_fb_pixel_purchase_sent meta değerini kaydetmek çok önemli. Kullanıcı teşekkür sayfasını yenilediğinde ya da sayfaya tekrar girdiğinde aynı siparişi iki kez saymamış olursunuz. Bu olmadan raporlarınız şişer ve bütçeniz yanlış optimizasyon yapar.
Kullanıcı Rolüne Göre Pixel Filtreleme
Gerçek dünyada sık karşılaşılan bir durum: kendi sitenizi test ederken, ürünleri incelerken ya da sipariş verirken Pixel’in tetiklenmesini istemezsiniz. Admin ve editör rolündeki kullanıcıları filtrelemek hem raporlarınızı temiz tutar hem de kendi reklam bütçenizi israf etmemenizi sağlar.
<?php
// Rol ve ortam bazli Pixel kontrolu
function fb_pixel_aktif_mi() {
// Gelistirme ortaminda calistirma
if (defined('WP_DEBUG') && WP_DEBUG === true) {
// Gelistirme ortaminda test icin bu satiri yoruma alin
// return false;
}
// Admin paneli kontrolu
if (is_admin()) {
return false;
}
// Kullanici rolu kontrolu
if (is_user_logged_in()) {
$kullanici = wp_get_current_user();
$izinli_olmayan_roller = array('administrator', 'editor', 'shop_manager');
foreach ($izinli_olmayan_roller as $rol) {
if (in_array($rol, $kullanici->roles)) {
return false;
}
}
}
return true;
}
// Gelismis Pixel yukleyici - rol filtrelemeli
function fb_pixel_gelismis_yukle() {
if (!fb_pixel_aktif_mi()) {
return;
}
$pixel_id = esc_js(FB_PIXEL_ID);
echo "
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '{$pixel_id}');
fbq('track', 'PageView');
</script>
<noscript>
<img height='1' width='1' style='display:none'
src='https://www.facebook.com/tr?id={$pixel_id}&ev=PageView&noscript=1'/>
</noscript>
";
}
add_action('wp_head', 'fb_pixel_gelismis_yukle', 1);
GDPR ve Çerez Onayı Entegrasyonu
Türkiye’den AB’ye satış yapıyorsanız ya da GDPR kapsamındaki ziyaretçileriniz varsa, Pixel’i çerez onayı olmadan çalıştırmak yasal risk yaratır. Cookiebot, CookieYes gibi araçlarla veya custom bir consent mekanizmasıyla entegrasyon sağlayabilirsiniz.
<?php
// GDPR uyumlu Pixel yukleme - Cookie consent kontrolu
function fb_pixel_gdpr_uyumlu() {
if (!fb_pixel_aktif_mi()) {
return;
}
$pixel_id = esc_js(FB_PIXEL_ID);
// CookieYes onay kontrolu (cookieyes-analytics cookie'si)
// Cookiebot kullananlar icin: CookieConsent=marketing
echo "
<script>
// Cerez onayini kontrol et
function fbPixelCerezKontrol() {
var cookieStr = document.cookie;
// CookieYes entegrasyonu
if (cookieStr.indexOf('cookieyes-analytics=yes') !== -1 ||
cookieStr.indexOf('cookieyes-analytics=no') === -1) {
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('consent', 'grant');
fbq('init', '{$pixel_id}');
fbq('track', 'PageView');
} else {
// Consent verilmeden limitli moda al
window.fbq = window.fbq || function() {};
fbq('consent', 'revoke');
fbq('init', '{$pixel_id}');
}
}
// DOM hazir olunca calistir
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', fbPixelCerezKontrol);
} else {
fbPixelCerezKontrol();
}
</script>
";
}
add_action('wp_head', 'fb_pixel_gdpr_uyumlu', 1);
Hata Ayıklama ve Test
Pixel’in doğru çalışıp çalışmadığını kontrol etmek için Meta’nın Pixel Helper Chrome eklentisini kullanabilirsiniz. Ama kod tarafında da bir debug modu eklemek işleri kolaylaştırır.
<?php
// Pixel debug modu - sadece admin kullanicilari icin
function fb_pixel_debug_modu() {
// Sadece URL'de ?fb_debug=1 varsa ve admin girisliyse calis
if (!isset($_GET['fb_debug']) || $_GET['fb_debug'] !== '1') {
return;
}
if (!current_user_can('administrator')) {
return;
}
$pixel_id = FB_PIXEL_ID;
$sayfa_turu = '';
if (is_front_page()) { $sayfa_turu = 'Ana Sayfa'; }
elseif (is_product()) { $sayfa_turu = 'Urun Sayfasi'; }
elseif (is_cart()) { $sayfa_turu = 'Sepet'; }
elseif (is_checkout()) { $sayfa_turu = 'Odeme'; }
elseif (is_order_received_page()) { $sayfa_turu = 'Tesekkur'; }
else { $sayfa_turu = 'Diger'; }
echo "
<script>
console.group('FB Pixel Debug');
console.log('Pixel ID: {$pixel_id}');
console.log('Sayfa Turu: {$sayfa_turu}');
console.log('Pixel Aktif: " . (FB_PIXEL_AKTIF ? 'Evet' : 'Hayir') . "');
console.groupEnd();
</script>
";
}
add_action('wp_footer', 'fb_pixel_debug_modu');
Bu debug fonksiyonunu test ederken ?fb_debug=1 query parametresini URL’e ekleyip tarayıcı konsoluna bakabilirsiniz. Canlı ortamda admin olmayan kullanıcılar bu mesajları görmez.
Tüm Kodları Düzenli Bir Dosyada Toplamak
Büyüyen projelerde bu fonksiyonları direkt functions.php’ye yazmak yerine ayrı bir dosyaya taşımak daha temiz bir yapı sağlar.
<?php
// functions.php icine sadece su satiri ekleyin:
// Bu dosyayi wp-content/themes/tema-adiniz/inc/fb-pixel.php olarak olusturun
if (file_exists(get_template_directory() . '/inc/fb-pixel.php')) {
require_once get_template_directory() . '/inc/fb-pixel.php';
}
// Child theme kullaniyorsaniz:
// get_stylesheet_directory() kullanin
// if (file_exists(get_stylesheet_directory() . '/inc/fb-pixel.php')) {
// require_once get_stylesheet_directory() . '/inc/fb-pixel.php';
// }
Bu yapı sayesinde Pixel ile ilgili tüm kodlar inc/fb-pixel.php dosyasında toplanır. functions.php şişmez, kod takibi kolaylaşır ve ekip çalışmasında dosya çakışmaları azalır.
Sık Karşılaşılan Sorunlar ve Çözümleri
Pixel tetiklenmiyor: wp_head hook’unun temanızda çalışıp çalışmadığını kontrol edin. Bazı sayfa builder temaları wp_head() fonksiyonunu header.php’ye eklememiş olabilir.
Duplicate eventlar görüyorum: Hem functions.php’de hem de aktif bir plugin üzerinden Pixel yüklenmiş olabilir. Pixel Helper ile hangi kaynaktan geldiğini tespit edin. Meta Pixel, WooCommerce ya da MonsterInsights gibi pluginlerin kendi Pixel entegrasyonu varsa birini devre dışı bırakın.
Purchase eventi iki kez sayılıyor: Yukarıdaki update_post_meta çözümünü mutlaka kullanın. Ayrıca Browser’ın back-forward cache özelliği bazen teşekkür sayfasını cache’den yeniden yüklediğinde tetiklenme olabilir. Buna karşı sipariş meta kontrolü yeterlidir.
WooCommerce’de $product null geliyor: wp_footer yerine woocommerce_after_single_product hook’unu deneyin. Bu hook product loop içinde çalışır ve $product her zaman hazırdır.
KVKK/GDPR şikayeti aldım: Consent modu olmadan Pixel çalıştırıyorsanız ve AB veya Türkiye’deki kullanıcılarınız varsa bir çerez yönetim aracı entegrasyonu zorunludur. Yukarıdaki GDPR uyumlu versiyon iyi bir başlangıç noktasıdır.
Sonuç
Facebook Pixel’i WordPress’e functions.php üzerinden eklemek ilk bakışta fazla uzun bir yol gibi görünebilir. Bir plugin indir, Pixel ID’yi yapıştır, bitir. Ama o plugin bir gün güncellemesini durduracak, temanızla çakışacak ya da gereksiz JavaScript yükleyecek. functions.php yöntemi sizin kontrolünüzde, hafif ve şeffaf.
Burada ele aldığımız yapıyı kullandığınızda elinizde şunlar olacak: merkezi yönetilen tek bir Pixel ID, rol bazlı filtreleme ile kirletilmemiş veriler, WooCommerce hunisinin her noktasında doğru eventlar ve GDPR uyumlu bir çerçeve. Bunları bir kez kurduğunuzda Meta’nın optimizasyon algoritması için sağlam bir veri temeli atmış olursunuz.
Son bir not: Meta’nın sunucu taraflı Conversions API çözümünü de araştırmanızı öneririm. Pixel tarayıcı tabanlı çalıştığından ad blocker ve iOS izin kısıtlamalarından etkilenir. Conversions API bu veri kayıplarını telafi eder ve ikisi birlikte kullanıldığında çok daha güvenilir raporlama sağlar.
