WordPress Interactivity API ile Dinamik Blok Nasıl?
WordPress 6.5 ile çekirdeğe eklenen WordPress Interactivity API, Gutenberg bloklarına front-end tarafında reaktif, deklaratif ve paylaşılabilir bir etkileşim katmanı kazandırır. Daha önce jQuery veya React + build zinciri ile yazdığınız sayaçlar, açılır paneller, sekme geçişleri, “sepete ekle” gibi küçük etkileşimler artık standart bir Bu rehber; Interactivity API’nin kurulumunu, WordPress Interactivity API, blokların HTML çıktısına Önemli olmasının üç nedeni var. Birincisi birlikte çalışabilirlik: Search, Query, Navigation, File blokları zaten bu API’yi kullanır; siz de aynı dilde yazarsanız eklentiler arası state paylaşımı ( Deprecation uyarısı: `data-wp-watch–id` ve `data-wp-init–id` iki tireli sözdizimi WordPress 7.1’de çalışmayı durduracak. Yerine üç tireli `data-wp-watch—id` ve `data-wp-init—id` kullanın. Bu rehberdeki tüm örnekler üç tireli sürümü kullanır. API, WordPress 6.5 ve üzerinde çekirdeğe dahildir. 6.4 ve altındaki kurulumlar için Gutenberg 17.5 ve üzeri eklentisinin kurulu ve aktif olması gerekir (pitfall: eklenti aktif değilse Aşağıdaki akış, sıfırdan çalışan bir “aç-kapa panelli soru-cevap” bloğunun tamamını gösterir. Kod, Adım 1 — Eklenti başlığı: Adım 2 — Adım 3 — Adım 4 — Üretim ortamında Çok dilli projelerde API'nin en sık yapılan üç hatası; eksik Async işlemler için API'nin performans maliyeti düşüktür; Preact'in sanal DOM'u sadece değişen düğümleri günceller, geri kalan HTML'e dokunmaz. Ancak büyük listelerde Güvenlik açısından, API ile çalışırken dört kurala uymak, bakım maliyetini düşürür: (1) state'i olabildiğince local tutun, Bir başka iyi uygulama, blokları stateless tasarlamaktır: Kullanıcı sayfayı yenilediğinde veya geri geldiğinde state'in doğru görünmesi için sunucu tarafında Gerçek bir projede üç katmanlı bir yapı sıkça görülür: (1) Sunucu tarafında Bir başka senaryo, admin panelindeki etkileşimli meta box'lardır. Bu örnek, Interactivity API ile Preact veya React arasında ne fark var? Interactivity API, Preact üzerine kurulu hafif bir runtime'dır; React bileşen ağacı yazmaz, sadece WordPress 6.4'te Interactivity API çalışır mı? Hayır. 6.4'te Her zaman Hayır. Yalnızca Evet. Client-side navigasyon SEO'ya zarar verir mi? Hayır, çünkü Sonuç: Bu standart, blok geliştirmede jQuery dönemini kapatan, modern ve çekirdek destekli bir yaklaşımdır. Dahili linkler: Harici kaynaklar:data-wp-on--click direktifiyle, build adımı olmadan, PHP tarafında server-side render (SSR) desteğiyle çalışır. API, WordPress’in kendi “Search”, “Query”, “Navigation” ve “File” bloklarında da kullanıldığı için çekirdek geliştiricilerin tercih ettiği varsayılan etkileşim standardı hâline gelmiştir.
block.json ve view.js üzerinden yapılandırmasını, data-wp-* direktifi listesini, store mantığını (state, actions, callbacks, derived state), server-side wp_interactivity_state() ile PHP’den ilk değer atamasını ve @wordpress/interactivity-router ile client-side navigasyonu gerçek kod örnekleriyle ele alır. Amaç; “JavaScript bilen ama Preact bilmeyen” bir WordPress geliştiricisinin ilk etkileşimli bloğunu 30 dakikada ayağa kaldırması ve bunu sunucu tarafında da doğru şekilde render edebilmesini sağlamaktır.WordPress 6.5’in yeni etkileşim standardı ve neden önemlidir?

data-wp-* öznitelikleri (direktifler) ekleyerek DOM’u reaktif hâle getiren standart bir mekanizmadır. Motor, bu direktifleri tarayıcıda okur, bir “store” üzerindeki state, context ve actions değerlerine bağlar; state değiştiğinde ilgili DOM düğümleri otomatik güncellenir. Preact tabanlı, bağımlılıkları küçük ve @wordpress/interactivity paketi WordPress 6.5+ ile çekirdeğe gömülüdür; ayrıca kurulum gerekmez.
actions.navigate gibi) ve SSR uyumu hazır gelir. İkincisi server-side render: wp_interactivity_state() ile PHP’den ilk değer atarsınız, sayfa kaynağında data-wp-context zaten doldurulmuş gelir; SEO ve ilk yükleme performansı korunur. Üçüncüsü kararlı bağımlılık zinciri: @wordpress/interactivity çekirdekle birlikte gelir, wp-scripts --experimental-modules ile script-module olarak paketlenir; harici bir runtime indirmenize gerek kalmaz.WordPress Interactivity API hangi durumlarda kullanılır?
state değiştirilir.store ile çalışır.data-wp-bind--hidden ile input görünürlüğü değiştirilir.data-wp-on--input ile input değeri state.query‘ye bağlanır, data-wp-each ile sonuç listesi reaktif olarak güncellenir.@wordpress/interactivity-router paketi ile sayfa geçişleri fetch + replace ile yapılır; tam sayfa yenileme olmaz.WordPress Interactivity API için temel kavramlar ve gereksinimler
Kavram
Sembol / Paket
Açıklama
Paket
`@wordpress/interactivity`
Çekirdekte gömülü; 6.5+ ile birlikte gelir. `npm install` ile proje bağımlılığı olarak da kullanılır.
Script Module
`viewScriptModule`
`block.json` üzerinden `view.js` blok tarafında yüklenir; `–experimental-modules` flag’i gerekir.
Namespace
`data-wp-interactive=”myPlugin”`
Store’u tanımlayan string; birden fazla blok aynı namespace’i paylaşabilir.
Direktif
`data-wp-*`
DOM’a eklenen öznitelikler: `wp-interactive`, `wp-context`, `wp-bind`, `wp-class`, `wp-style`, `wp-text`, `wp-on`, `wp-watch`, `wp-init`, `wp-each`, `wp-key`.
Global state
`store(‘ns’, { state: {…} })`
Sayfa düzeyinde paylaşılan veri; tüm interaktif bloklar tarafından okunur.
Local state
`data-wp-context='{…}’`
Bir DOM alt ağacına özel veri; `getContext()` ile erişilir.
Server state
`wp_interactivity_state()`
PHP tarafında `state` ilk değerini atayan fonksiyon; SSR için zorunlu.
Runtime
Preact tabanlı
`@wordpress/interactivity` paketi Preact sinyallerini kullanır; `useState` / `useEffect` gibi hook’lar `wp-run` içinde çalışır.
WordPress Interactivity API nasıl kurulur ve uygulanır?

data-wp-* direktifleri çalışmaz, HTML kaynağı olduğu gibi kalır). Yeni bir blok yazıyorsanız @wordpress/create-block-interactive-template şablonu iskeleti hazır getirir; elle kurulum için npm install @wordpress/interactivity --save komutu yeterlidir.wp-scripts tarafında script module desteği için package.json‘daki build script’lerine --experimental-modules flag’i eklenmelidir. Şablonla oluşturulan projelerde bu flag zaten ekli gelir; manuel projede unutulursa viewScriptModule çıktısı tarayıcı tarafından yüklenmez ve window.wp üzerinden @wordpress/interactivity erişilemez.WordPress Interactivity API adım adım uygulama rehberi
wp-content/plugins/interactivity-faq/interactivity-faq.php (ana dosya), src/block.json, src/render.php ve src/view.js altında durur.
```php
<?php
/**
* Plugin Name: Interactivity FAQ
* Version: 1.0.0
* Requires at least: 6.5
* Requires PHP: 7.4
*/
block.json (interaktif blok kaydı):
```json
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "interactivity-faq/faq",
"title": "FAQ",
"category": "widgets",
"icon": "list-view",
"supports": {
"interactivity": true
},
"textdomain": "interactivity-faq",
"render": "file:./render.php",
"viewScriptModule": "file:./view.js"
}
"supports": { "interactivity": true } satırı blok düzeyinde API desteğini açar; bu satır olmadan data-wp-* direktifleri çalışmaz.render.php (server-side render + ilk state):
```php
<?php
wp_interactivity_state( 'interactivityFaq', array(
'items' => array(
array( 'id' => 1, 'question' => 'Interactivity API nedir?', 'answer' => 'WordPress 6.5 ile gelen reaktif blok standardı.' ),
array( 'id' => 2, 'question' => 'Hangi sürümlerde çalışır?', 'answer' => 'WordPress 6.5+ veya Gutenberg 17.5+.' ),
),
) );
$context = array( 'openId' => 0 );
?>
<div
<?php echo wp_interactivity_data_wp_context( $context ); ?>
data-wp-interactive="interactivityFaq"
class="wp-block-interactivity-faq"
>
<template
data-wp-each="state.items"
data-wp-each-key="context.item.id"
>
<details
data-wp-bind--open="context.item.id === context.openId"
data-wp-on--toggle="actions.toggle"
>
<summary data-wp-text="context.item.question"></summary>
<p data-wp-text="context.item.answer"></p>
</details>
</template>
</div>
wp_interactivity_data_wp_context() fonksiyonu, data-wp-context özniteliğini güvenli bir şekilde (escape edilmiş JSON) basar; elle data-wp-context='' yazmak XSS riski taşır.view.js (store + action):
```js
import { store, getContext } from '@wordpress/interactivity';
store( 'interactivityFaq', {
actions: {
toggle: () => {
const context = getContext();
// <details> öğesinin açık olup olmadığını oku.
const isOpen = context.item.id === context.openId;
context.openId = isOpen ? 0 : context.item.id;
},
},
} );
getContext() içinde context.item her zaman geçerli olur çünkü data-wp-each template’i her öğeyi item bağlamına sarar.WordPress Interactivity API için gerekli ayarlar ve ön hazırlık
--experimental-modules flag’i ile derlenmiş view.js mutlaka viewScriptModule üzerinden yüklenmelidir. Eski wp-scripts sürümlerinde (17.5 öncesi) script module desteği yoktur; bu durumda blok yine de render edilir ama interaktif kısım çalışmaz, kaynak kodda data-wp-* öznitelikleri ölü kalır. Buna ek olarak, build çıktısı tarayıcıya ulaşmadan önce modül yükleyicisinin etkin olması gerekir; aksi hâlde viewScriptModule dosyası olarak değil, normal olarak yorumlanır ve direktifler tetiklenmez.wp_interactivity_state() içinde geçen dizeler __() ile sarılmalıdır; aksi takdirde state hem server hem client tarafında aynı dizeyi taşır ve çeviri motoru çalışmaz. Bir diğer ince nokta: data-wp-context içinde JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT bayrakları kullanılmaz; bu nedenle < veya > içeren dizelerden kaçınılmalı, içerik HTML olarak değil metin olarak işlenmelidir.WordPress Interactivity API kullanırken dikkat edilmesi gerekenler

supports.interactivity, yanlış namespace ve iki tireli wp-watch / wp-init kullanımı. Bunlar sırasıyla: direktiflerin hiç çalışmamasına, store'un boş dönmesine ve WordPress 7.1'de sessiz bozulmaya yol açar. Bir diğer yaygın hata, actions içinde event nesnesine doğrudan erişmektir; event.preventDefault() gibi senkron API'ler withSyncEvent() ile sarmalanmalıdır, aksi takdirde deprecation uyarısı ve ileride davranış değişikliği olur. Özetle, 7.1'e geçmeden önce bu üç noktayı gözden geçirmek ileride geriye dönük uyumluluk kırılmasını önler.async/await yerine generator fonksiyonu (function*) kullanılmalıdır. Preact sinyalleriyle çalışan bu yapı, scope'un uzun süren bir await'ten sonra doğru context'i bulmasını sağlar. Yanlış kullanım, iki farklı butona hızlıca tıklandığında ikinci tıklamanın context'inin birinciyi ezmeye başlamasına neden olur.WordPress Interactivity API ile sık yapılan hatalar
supports.interactivity eksik: Direktifler çalışmaz, hata vermez. Kontrol: cat block.json | grep -A1 supports.wp-watch/wp-init: WordPress 7.1'de sessiz bozulur. Üç tireye geçirin: data-wp-watch---log.async/await action içinde: Scope yanlış context'e bağlanır. Generator'a çevirin: actions.load: function*() { yield fetch(...); }.event.preventDefault() withSyncEvent() olmadan: Deprecation uyarısı + gelecekte bozulma. içinde data-wp-key: data-wp-each-key olmalı; data-wp-key her öğenin içine yazılırsa çalışmaz.window.wp üzerinden @wordpress/interactivity aramak: Script module olarak yüklenmediği için window.wp.interactivity undefined döner. Bunun yerine import { store } from '@wordpress/interactivity' kullanın.WordPress Interactivity API performans ve güvenlik kontrolleri
data-wp-each her öğe için yeni context provider yaratır; 1000+ öğeli listelerde bu bağlam yaratma maliyeti ölçülebilir hâle gelir. Bu durumda sunucu tarafında filtreleme veya sayfalama ile liste küçültülmelidir.data-wp-context içine HTML yerine düz metin konulmalıdır. API, data-wp-text ile içeriği textContent olarak yazar; HTML yorumlanmaz. HTML enjekte etmek için data-wp-bind--innerHTML kullanılabilir, ancak bu yalnızca güvenilir içerik için (yönetici tarafından üretilen) uygundur; kullanıcı girdisi bu yola girmemelidir.Reaktif blok geliştirmede uygulama kuralları ve kontrol listesi
data-wp-context ile sınırlandırın; global state sadece gerçekten sayfa genelinde paylaşılan veriler için kullanılır. (2) Her zaman withSyncEvent() veya generator kullanın; düz async/await ve çıplak event erişimi ileri sürümlerde kırılır. (3) Direktifleri ile yazın; elle for döngüsüyle data-wp-context çoğaltmak hem hata kaynağıdır hem SSR'da bozulur. (4) Üç tireli wp-watch---id sözdizimini tercih edin; geriye dönük uyumluluk 7.1'de sona eriyor.wp_interactivity_state() ile ilk değer atanmalıdır. Bu, hem SEO hem accessibility hem de yavaş bağlantılarda ilk içerik patlamasını doğru verir.WordPress Interactivity API gerçek proje senaryolarında nasıl kullanılır?
wp_interactivity_state('myPlugin', ['products' => $products]) ile ürün listesi ilk değerini atanır. (2) Aynı namespace'i paylaşan iki blok (ürün kartı + sepet sayacı) state.cart üzerinden iletişir; ürün kartındaki "ekle" butonu actions.addToCart'ı tetikler, sepet sayacı state.cart.length'i dinler ve güncellenir. (3) @wordpress/interactivity-router ile kategori sayfasında client-side navigasyon yapılır; her sayfa geçişinde tam yenileme yerine sadece data-wp-interactive ağacı güncellenir.wp_interactivity_state() admin tarafında da çalışır; bir "Şu anda kaç kullanıcı online" göstergesi 30 saniyede bir actions.refresh çağırır, sonucu state.onlineCount'a yazar. Bu pattern, Polylang ve Yoast gibi eklentilerin de benimsediği modern yaklaşımdır.
```js
import { store, getContext, withSyncEvent } from '@wordpress/interactivity';
store( 'onlineUsers', {
state: {
onlineCount: 0,
},
actions: {
refresh: withSyncEvent( function* () {
try {
const response = yield fetch( state.ajaxUrl, {
method: 'POST',
body: new URLSearchParams( { action: 'get_online_count', _ajax_nonce: state.nonce } ),
} );
const data = yield response.json();
state.onlineCount = data.count;
} catch ( e ) {
console.error( 'onlineCount alınamadı', e );
}
} ),
},
} );
withSyncEvent + generator + fetch + state güncellemesinin birlikte nasıl kullanılacağını gösterir; gerçek üretim kodunda state.ajaxUrl ve state.nonce wp_interactivity_state() ile PHP tarafından doldurulur.WordPress Interactivity API hakkında sık sorulan sorular
data-wp-* direktiflerini yorumlar. React bilgisi olanlar Preact'in useState / useEffect mantığını tanır, ancak blok düzeyinde çalışmak için bileşen yapısına gerek yoktur.data-wp-* direktifleri çalışmaz, sadece HTML özniteliği olarak kalır. WordPress 6.5+ veya Gutenberg 17.5+ eklentisinin kurulu olması zorunludur.data-wp-each ile mi, yoksa elle for döngüsüyle mi yazmalıyım?data-wp-each ile yazın. Elle döngüde her öğe için ayrı data-wp-context yazmak hem sunucu render'ında hem de reaktivitede tutarsızlık yaratır.withSyncEvent her yerde mi kullanılmalı?event.preventDefault(), event.stopPropagation() veya event.currentTarget gibi senkron erişim gerektiren durumlarda kullanılır. Aksi takdirde gereksiz deprecation uyarısı verir.wp_interactivity_state admin tarafında da çalışır mı?wp_interactivity_state() frontend ve admin ekranlarında aynı şekilde çalışır; meta box'larda veya widget ayarlarında etkileşimli bloklar bu yolla yazılabilir.wp_interactivity-router tam sayfa yenilemesi yapmaz; URL değişir, history API güncellenir, tarayıcı sekmesinin başlığı güncellenir. Googlebot bu akışı normal navigasyon olarak okur; ayrıca her hedef URL'in server-side render edilmiş hâli zaten tarayıcıya iletilir, dolayısıyla içerik ilk yüklemede tam olarak okunabilir.
block.json'da supports.interactivity: true, viewScriptModule ile yüklenen bir view.js ve render.php'de wp_interactivity_state() üçlüsü, etkileşimli bir bloğun omurgasıdır. Bu yapı kurulduktan sonra data-wp-on--click, data-wp-bind, data-wp-each gibi direktiflerle reaktif UI, actions.navigate ile client-side yönlendirme ve @wordpress/interactivity-router ile sayfa içi geçişler aynı dilde yazılabilir. WordPress Hata Çözümleri kategorisindeki benzer rehberlerle birlikte kullanıldığında, etkileşimli bir eklenti geliştirme süreci çok daha öngörülebilir hâle gelir.
Yazar Hakkında
Benzer Yazılar
Bir Cevap Yaz
E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir.