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.

Temalar ekranı; listeyi kayıtlı tema kümesinden çizer
Kayıt defterinde olmayan bir klasör, theme.json'ı kusursuz olsa da burada görünmez.

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.

Yeniliklerden ilk sen haberdar ol

Yeni özellikler, sürüm notları ve CMS rehberleri. Ayda birkaç e-posta gönderiyoruz.