Tema Oluşturma

jekcms teması yapmak için build script'i, framework, boilerplate üreticisi yok. Sadece birkaç PHP ve CSS dosyasını doğru yere koymanız gerekiyor. Bu sayfa, çalışan bir temanın en sade halini adım adım gösteriyor.

En az hangi dosyalara ihtiyacınız var?

Temanızı bir klasöre şöyle yerleştirin:

themes/my-theme/
  theme.json
  templates/
    header.php
    footer.php
    index.php
    single.php
  assets/
    css/style.css

Bu klasörü /themes/ altına atarsınız. jekcms bir sonraki admin sayfa yüklenmesinde keşfeder. Nasıl keşfedip listelediğini Tema kurulumu sayfasında anlatıyoruz.

Adım 1 — theme.json

En küçük hali ile başlayın:

{
    "name": "My Theme",
    "slug": "my-theme",
    "version": "0.1.0",
    "author": "Your Name",
    "license": "free"
}

slug alanı klasör adıyla aynı olmak zorunda. İleride özelleştirici sekmeleri (customizer.tabs) eklemek isterseniz theme.json şeması tam listeyi gösteriyor.

Bunlar her sayfanın üstünü ve altını sarıyor. Sade başlayalım.

templates/header.php:

<!doctype html>
<html lang="<?= htmlspecialchars(site_option('language', 'en')) ?>">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title><?= htmlspecialchars(render_page_title()) ?></title>
    <?php output_robots_meta(); ?>
    <?php output_theme_customization_css(); ?>
    <link rel="stylesheet" href="<?= theme_asset('css/style.css') ?>">
    <?php do_action('wp_head'); ?>
</head>
<body>
    <header class="site-header">
        <a href="/"><?= htmlspecialchars(site_option('site_name')) ?></a>
    </header>
    <main class="site-main">

templates/footer.php:

    </main>
    <footer class="site-footer">
        <p>&copy; <?= date('Y') ?> <?= htmlspecialchars(site_option('site_name')) ?></p>
    </footer>
    <?php do_action('wp_footer'); ?>
</body>
</html>

Kaçırılmaması gereken hook'lar

Her temaya şunları mutlaka eklemelisiniz:

  • do_action('wp_head') — eklentiler, SEO modülleri, analitik kodları buraya bağlanır. Atarsanız entegrasyonlar çalışmaz.
  • do_action('wp_footer') — geç yüklenen script'ler ve çerez bannerları buraya bağlanır.
  • output_robots_meta() — site ayarlarına göre <meta name="robots"> çıktısını verir. SEO için lazım.
  • output_theme_customization_css() — özelleştiriciden gelen :root değişkenlerini yayınlar. Renkler bununla çalışır.

Adım 3 — index.php (liste sayfası)

Ana sayfa, kategori, etiket, arama sonuçları için kullanılır:

<?php include __DIR__ . '/header.php'; ?>

<h1><?= htmlspecialchars(render_archive_title()) ?></h1>

<div class="post-list">
    <?php foreach ($GLOBALS['posts'] as $post): ?>
        <?php include __DIR__ . '/partials/post-card.php'; ?>
    <?php endforeach; ?>
</div>

<?php render_pagination(); ?>

<?php include __DIR__ . '/footer.php'; ?>

$GLOBALS['posts'], o anki sorguya göre yazı listesi dizisidir — jekcms sizin şablonunuzu dahil etmeden önce doldurur.

Adım 4 — single.php (yazı detay sayfası)

<?php include __DIR__ . '/header.php'; ?>

<article class="post">
    <h1><?= htmlspecialchars($GLOBALS['post']['title']) ?></h1>
    <p class="post-meta">
        By <?= htmlspecialchars($GLOBALS['post']['author_name']) ?>
        on <?= date('M j, Y', strtotime($GLOBALS['post']['published_at'])) ?>
    </p>
    <div class="post-content">
        <?php render_content(); ?>
    </div>
</article>

<?php include __DIR__ . '/footer.php'; ?>

render_content() mı yoksa doğrudan $post['content'] mi?

Her zaman render_content() kullanın. Bu fonksiyon şunları sizin için hallediyor: shortcode'ları çözüyor, eklentilerin bağlandığı the_content filtre zincirini çalıştırıyor, tembel yüklenen medyayı işliyor, okuma süresi ve ilgili yazı enjeksiyonlarını yapıyor. $post['content']'i doğrudan yazdırırsanız bunların hepsini atlarsınız.

Adım 5 — partial'lar

Birden fazla yerde kullandığınız parçalar için (yazı kartı, gezinti menüsü, yorum bloğu) partials/ altında ayrı dosyalar tutun:

templates/
  partials/
    post-card.php
    nav-primary.php
    comments.php

Dahil ederken:

<?php include __DIR__ . '/partials/post-card.php'; ?>

Partial, onu çağıran dosyanın değişkenlerini miras alır. Yani foreach döngüsü içinde $post değişkenini açıkça iletmeseniz bile post-card.php onu görebilir.

Şablonda hangi değişkenler hazır?

| Değişken | Nerede çalışır | İçinde ne var | |---|---|---| | $GLOBALS['post'] | single.php ve partial'lar | Aktif yazının tüm alanları: id, title, slug, content, excerpt, author_id, author_name, published_at, featured_image | | $GLOBALS['posts'] | index.php ve arşiv şablonları | Mevcut sayfanın yazılarından oluşan dizi | | $GLOBALS['pagination'] | Arşiv şablonları | current_page, total_pages, per_page | | $GLOBALS['query_type'] | Tüm şablonlar | single / archive / category / tag / search / 404 |

Bundan sonrası

Temanız bir şey render etmeye başladıktan sonra site yöneticilerine dosya düzenlemeden renk ve font değiştirebilecekleri seçenekler sunmak isteyebilirsiniz. Onun için Tema özelleştirme ve theme.json şeması sayfalarına bakın.

Yeniliklerden ilk sen haberdar ol

Yeni özellikler, sürüm notları ve CMS rehberleri — ayda birkaç e-posta, spam yok.