Tema Oluşturma
jekcms teması, PHP ve CSS dosyalarından oluşan bir klasördür. Derleme adımı yok, çatı yok, üretici yok. Yönlendirici şablonunuzu require eder; şablon ne yazdırıyorsa sayfa odur.

Başlamadan önce bilmeniz gereken bir sınır var. Temalar ekranı, bilinen tema kısa adlarından oluşan sabit bir kayıt defterinden çizilir. /themes/ altına yeni bir klasör koymak panelin haberi olmasını sağlamaz. ZIP yükleme de yok, arayüzden kısa ad kaydetme yolu da yok. Yani kendi yazdığınız tema Görünüm → Temalar ekranında görünmez, etkinleştirilemez. Bir kuruluma yeni tema ancak imzalı güncelleme kanalından iner.
Bu yüzden burada okuyacağınız şey bir kurulum tarifi değil. Tema katmanının nasıl çalıştığını anlatıyor: gelen temaları okumak, geliştirme kurulumunda bir kopyayı düzenlemek ve ürünle birlikte dağıtılacak bir tema yazmak için. Bugün öğleden sonra bir müşteri sitesine tema kurmanızı sağlamaz.
Anatomi
themes/benim-temam/
theme.json manifest ve özelleştirici şeması
functions.php her istekte otomatik yüklenir
activate.php isteğe bağlı; tema etkinleştirilince bir kez çalışır
screenshot.png kart görseli
templates/
header.php footer.php
index.php single.php page.php archive.php search.php
errors/404.php
partials/
post-card.php pagination.php sidebar.php comments.php
sections/
hero.php latest.php
assets/
css/style.css
Gerçekten zorunlu olan tek dosya templates/index.php. Etkinleştirme denetiminin ayrıştırdığı dosya da odur. Gerisi kural değil, yerleşmiş düzen: yönlendirici ve yerleşim motoru bu adlara göre arar.
Manifest
{
"name": "Ocean",
"slug": "ocean",
"version": "1.0.0",
"author": "Adınız",
"description": "Sade bir kıyı teması.",
"screenshot": "screenshot.png",
"supports": { "card_options": true, "share_styles": true }
}
Sistemin kullandığı kısa ad her zaman klasör adıdır; dosyadaki slug anahtarı belgeleme amaçlıdır, hiç okunmaz. Gerçekten iş yapan anahtarlar için theme.json referansına bakın.
Yönlendirici şablonu nasıl seçiyor
Şablonlar templates/ altında durur. Yönlendirici onları aktif temadan adıyla çağırır: ana sayfa için index.php, yazı için single.php, sayfa için page.php, kategori/etiket/yazar/tarih arşivleri için archive.php, arama sonuçları için search.php. Hata sayfaları önce templates/{kod}.php, sonra templates/errors/{kod}.php olarak aranır; yani 404.php iki yerden birinde olabilir.
header.php ile footer.php yönlendiriciden çözülmez. Onları şablonlar kendileri dahil eder. Pakete giren her şablon bu yüzden aynı şekilde başlar ve biter:
<?php
require_once dirname(__DIR__) . '/functions.php';
include __DIR__ . '/header.php';
// …
include __DIR__ . '/footer.php';
Kapsamda ne var
Yönlendirici çok az şey yayımlar ve bunu yerel değişkenlerle değil $GLOBALS üzerinden yapar. Yazı ya da sayfada $GLOBALS['post'], yazarın adı, kısa adı ve avatarıyla birleştirilmiş tam satırı taşır. Arşivde $GLOBALS['archive_type'] ve $GLOBALS['archive_slug'] hangi arşivde olduğunuzu söyler; tarih arşivlerinde yanlarına archive_year ve archive_month gelir.
Ana sayfada hiçbir şey enjekte edilmez. templates/index.php ihtiyacı olan veriyi kendisi sorgular. Sizi bekleyen bir $GLOBALS['posts'] yok; her tema kendi listesini kendi kurar. Arşiv şablonları bu yüzden kendi SELECT cümleleriyle başlar.
<?php
require_once dirname(__DIR__) . '/functions.php';
$post = $GLOBALS['post'] ?? null;
if (!$post) { http_response_code(404); /* … */ return; }
include __DIR__ . '/header.php';
?>
<article class="post">
<h1><?= e($post['title']) ?></h1>
<div class="post-content"><?= render_content($post['content']) ?></div>
</article>
<?php include __DIR__ . '/footer.php'; ?>
Kaçış için e() kullanın; projenin htmlspecialchars kısaltması odur.
Asıl mesele: head
Temanın header.php dosyası, ürünün sayfaya bağlandığı yerdir. Gelen temalar sırasıyla şunları çağırır: <title> için get_meta_title(), dizinleme yönergeleri için output_robots_meta(), output_canonical_tag(), özelleştiricide seçilen yazı tipleri için output_theme_custom_fonts(), stil dosyası için theme_asset(), üretilen CSS değişkenleri için output_theme_customization_css(), ardından output_og_tags(), output_schema(), output_favicon_tags() ve output_seo_head().
output_theme_customization_css() çağrısını atlarsanız özelleştiricinin tamamı sayfaya ulaşmaz - her renk, yazı tipi, genişlik ve stüdyo ayarı o tek çağrıdan basılır. output_robots_meta() çağrısını atlarsanız yazı bazlı dizinleme kuralları sessizce çalışmaz olur.
İçerik, $post['content'] yazdırılarak değil temanın kendi render_content() fonksiyonuyla çizilir: kısa kodların çözüldüğü, yazı içi kutuların enjekte edildiği ve tembel yüklemenin uygulandığı yer orasıdır.
functions.php
Aktif temanın functions.php dosyası her istekte otomatik yüklenir; şablonlar da onu kendileri require eder, böylece olağandışı bir yoldan dahil edilen şablon bile ona sahip olur. O noktada üç sabit tanımlıdır: THEME_PATH, THEME_URL ve THEME_VERSION.
Her tema kendi küçük yardımcı setini bu dosyada tanımlar, miras almaz: theme_asset() (başına assets/ ekler ve sonuna filemtime tabanlı önbellek kırıcı koyar), theme_config() ve theme_setting() (theme.json içindeki durağan settings bloğunu okur), theme_supports(), render_content(), render_pagination() ve get_body_classes(). Bir temayı kopyalıyorsanız functions.php dosyasını da kopyalayın; bunlar çekirdek fonksiyonu değildir.
Parçalar ve bölümler
partials/ tekrar kullandığınız parçaları tutar: yazı kartı, sayfalama, kenar çubuğu, yorum bloğu. Doğrudan dahil edin; parça çağıranın kapsamını devralır, yani foreach içindeki $post ayrıca aktarılmadan post-card.php içinde görünür.
sections/ farklıdır. Oradaki dosyalar, özelleştiricinin sırasını değiştirip kapatmaya izin verdiği ana sayfa bloklarıdır; sabit sırayla dahil edilmek yerine yerleşim motoru tarafından çizilirler. Temanın index.php dosyası motordan sayfayı çizmesini ister ve yalnız motor yoksa varsayılan sıraya düşer.
Burada bir kural diğerlerinden önemli, çünkü bu kurala uymayan tema, bulunması neredeyse imkânsız bir hata üretir: dahil edilen dosya, çağıranın kapsamında koşar. $post, $posts, $categories, $tags ya da $counts gibi ortak bir ada atama yapan bir parça, çağıran şablonun değişkenini sessizce siler. Parçanın ürettiği her değişkene önek verin.
Kancalar
do_action('wp_head') ve do_action('wp_footer') gerçektir ve çalışır - çekirdek, bütünlük filigranı ve analitik izleyicileri için wp_footer üzerine dinleyici kaydeder. İkisi de isteğe bağlıdır ve gelen temaların çoğu onları çağırmaz; üçü çağırır. Temanız üçüncü taraf kod parçalarına ev sahipliği yapacaksa ikisini de çağırın.
apply_filters() ise bir taslaktır (stub): girdisini olduğu gibi geri döndürür. Üstüne bir şey kurmayın.
Sonraki adım
Temanız çizmeye başladıktan sonra ona bir özelleştirici şeması verin. Böylece renkler, yazı tipleri ve düzen dosyaya dokunmadan değiştirilebilir. Mekanizmayı Tema Özelleştirme anlatıyor; her anahtarın listesi theme.json şemasında.