← Blog'a Dön
Özel WordPress Tema Yapımı: Sıfırdan Tema Geliştirme 2026
Web Tasarım 36 dk okuma Yayın: Güncelleme:

Özel WordPress Tema Yapımı: Sıfırdan Tema Geliştirme 2026

Özel WordPress tema yapımı nedir, nasıl yapılır? Hazır temadan neden farklıdır? Dosya yapısından PHP şablonlarına, hooks sisteminden child theme'e kadar özel WordPress tema geliştirmenin eksiksiz teknik rehberi.

Özel WordPress tema yapımı; bir işletmenin ya da projenin ihtiyaçlarına tam olarak yanıt veren, gereksiz hiçbir kod içermeyen, yüksek performanslı ve tamamen özgün bir WordPress temasının sıfırdan geliştirilmesi sürecidir.

Hazır tema alıp özelleştirmekten temelden farklıdır. Özel tema geliştirmek; daha temiz kod, daha hızlı yükleme, daha yüksek güvenlik ve uzun vadede çok daha düşük bakım maliyeti anlamına gelir.

Bu rehberde özel WordPress tema yapımının ne olduğunu, neden gerekli olduğunu ve nasıl yapıldığını teknik detaylarıyla; dosya yapısından hook sistemine, SEO entegrasyonundan performans optimizasyonuna, sık yapılan hatalardan gerçekçi bir proje senaryosuna kadar ele alıyoruz.


Özel WordPress Tema Nedir?

WordPress teması; bir sitenin görünümünü ve belirli işlevlerini yöneten şablon dosyaları koleksiyonudur. PHP, HTML, CSS ve JavaScript’ten oluşan bu dosyalar WordPress’in içerik yönetim sistemiyle birlikte çalışarak kullanıcıya sunulan sayfaları üretir.

Hazır tema: Başkası tarafından genel ihtiyaçlar düşünülerek yazılmış, binlerce sitenin kullandığı, satın alındıktan sonra özelleştirilen temadır.

Özel tema: Yalnızca sizin siteniz için, yalnızca ihtiyaç duyduğunuz işlevleri içerecek biçimde sıfırdan yazılan temadır.

Aralarındaki fark tıpkı hazır takım elbise ile terzi dikimi arasındaki fark gibidir: biri birçok beden için tasarlanmış, diğeri yalnızca sizin ölçünüze göre biçilmiş.


Özel Tema Neden Hazır Temadan Üstündür?

1. Performans Farkı

Hazır temalar olabildiğince fazla kişiye hitap etmek için tasarlanır. Bu yüzden çoğu projede kullanılmayacak yüzlerce CSS satırı, JavaScript dosyası ve PHP fonksiyonu taşırlar.

Özel temada yalnızca projenin ihtiyaç duyduğu kod yer alır. Sonuç: daha az HTTP isteği, daha küçük dosya boyutu, daha hızlı TTFB (Time to First Byte) ve Core Web Vitals metriklerinde doğal üstünlük.

Gerçek bir karşılaştırma: Popüler bir hazır tema ortalama 800KB-2MB CSS + JS yükler. İyi yazılmış özel bir tema aynı görsel sonucu 80-200KB ile üretebilir. Bu 10 katlık fark, sayfa hızını ve Google sıralamasını doğrudan etkiler.

2. Güvenlik Avantajı

Hazır temalar üçüncü taraf geliştiriciler tarafından yazıldığından güvenlik açıkları kamuya açık kaynaklarda yayımlanır. Binlerce sitede kullanılan popüler bir temada açık tespit eden bir saldırgan aynı anda binlerce siteyi hedef alabilir.

Özel temada güvenlik açığı kamusal değildir. Kod yalnızca size aittir ve saldırı yüzeyi minimum düzeydedir.

3. Tema Güncellemesi Bağımlılığı Yok

Hazır temalarda geliştiricinin yayımladığı her güncelleme özelleştirmelerinizi bozabilir. Child theme kullanmak bu riski azaltsa da tamamen ortadan kaldırmaz. Özellikle ana temayı doğrudan düzenleyen projeler her güncellemede özelleştirme kaybıyla karşı karşıya kalır.

Özel temada güncelleme tamamen sizin kontrolünüzdedir.

4. Tekil Tasarım Kimliği

Hazır tema kullanan her site aynı tasarım temelini paylaşır. Aynı temayı kullanan iki rakibiniz varsa ister istemez benzer görünürsünüz. Özel tema, markanızın dijital kimliğinin birebir yansımasıdır — başka hiçbir sitede aynısı yoktur.

5. Uzun Vadede Düşük Maliyet

Özel tema ilk etapta daha yüksek geliştirme maliyeti gerektirir. Ancak hazır tema lisansı, premium eklentiler, tema uyum sorunları ve sürekli güncelleme bakımı toplandığında uzun vadede özel tema genellikle daha ekonomik çözüm olarak öne çıkar.


WordPress Tema Dosya Yapısı

Bir WordPress teması en temel haliyle şu dosyalardan oluşur:

my-theme/
├── style.css          → Tema bilgileri (başlık) ve CSS
├── functions.php      → Tema fonksiyonları, hook'lar, feature register
├── index.php          → Ana şablon (fallback)
├── header.php         → <head> ve <header> bölümü
├── footer.php         → <footer> bölümü
├── sidebar.php        → Kenar çubuğu
├── single.php         → Tekil yazı şablonu
├── page.php           → Statik sayfa şablonu
├── archive.php        → Kategori/etiket arşiv şablonu
├── search.php         → Arama sonuçları şablonu
├── 404.php            → Hata sayfası
├── comments.php       → Yorum şablonu
└── screenshot.png     → Tema önizleme görseli (1200×900 px)

Daha büyük ve organize projelerde bu yapı genişler:

my-theme/
├── assets/
│   ├── css/
│   │   ├── main.css
│   │   └── variables.css
│   ├── js/
│   │   ├── main.js
│   │   └── navigation.js
│   └── images/
├── inc/
│   ├── customizer.php
│   ├── template-tags.php
│   └── enqueue.php
├── template-parts/
│   ├── content/
│   │   ├── content.php
│   │   ├── content-page.php
│   │   └── content-none.php
│   └── header/
│       ├── site-header.php
│       └── mobile-menu.php
├── page-templates/
│   ├── template-fullwidth.php
│   └── template-landing.php
└── languages/
    └── my-theme.pot

style.css: Tema Kimlik Dosyası

Her WordPress temasının style.css dosyasının en üstünde tema bilgilerini içeren bir yorum bloğu bulunması zorunludur:

/*
Theme Name: My Custom Theme
Theme URI: https://www.site.com
Author: Onur Öztürk
Author URI: https://www.onuroztr.com
Description: Özel olarak geliştirilmiş kurumsal web sitesi teması.
Version: 1.0.0
Requires at least: 6.4
Tested up to: 6.7
Requires PHP: 8.1
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: my-custom-theme
*/

Bu blok olmadan WordPress temayı tanımaz. Theme Name tek zorunlu alandır; diğerleri önerilir.


functions.php: Temanın Beyni

functions.php WordPress’in functions.php dosyasına en çok benzeyen yer burasıdır: bir eklenti gibi çalışır, tema etkinleştirildiğinde otomatik yüklenir ve WordPress hook sistemine bağlanır.

CSS ve JS Enqueue Etme

function mytheme_enqueue_assets() {
    // Ana CSS
    wp_enqueue_style(
        'mytheme-main',
        get_stylesheet_uri(),
        [],
        wp_get_theme()->get('Version')
    );

    // Ana JS (footer'da, defer ile)
    wp_enqueue_script(
        'mytheme-main',
        get_template_directory_uri() . '/assets/js/main.js',
        [],
        wp_get_theme()->get('Version'),
        [
            'strategy'  => 'defer',
            'in_footer' => true,
        ]
    );
}
add_action( 'wp_enqueue_scripts', 'mytheme_enqueue_assets' );

Not: wp_enqueue_scripts hook’unu kullanmadan <link> veya <script> etiketlerini doğrudan header.php’ye eklemek yanlış pratiktir. Enqueue sistemi çakışmaları önler ve bağımlılık yönetimini mümkün kılar.

Tema Özelliklerini Kaydetme

function mytheme_setup() {
    // Çeviri desteği
    load_theme_textdomain( 'my-custom-theme', get_template_directory() . '/languages' );

    // Otomatik feed bağlantısı
    add_theme_support( 'automatic-feed-links' );

    // Sayfa başlığı yönetimini WordPress'e bırak
    add_theme_support( 'title-tag' );

    // Öne çıkan görseller
    add_theme_support( 'post-thumbnails' );

    // HTML5 çıktı
    add_theme_support( 'html5', [
        'search-form',
        'comment-form',
        'comment-list',
        'gallery',
        'caption',
        'style',
        'script',
    ] );

    // Özel logo
    add_theme_support( 'custom-logo', [
        'height'      => 60,
        'width'       => 200,
        'flex-height' => true,
        'flex-width'  => true,
    ] );

    // Navigasyon menülerini kaydet
    register_nav_menus( [
        'primary'   => __( 'Ana Menü', 'my-custom-theme' ),
        'footer'    => __( 'Alt Menü', 'my-custom-theme' ),
    ] );

    // Görsel boyutu ekle
    add_image_size( 'mytheme-hero', 1440, 680, true );
    add_image_size( 'mytheme-card', 640, 400, true );
}
add_action( 'after_setup_theme', 'mytheme_setup' );

WordPress Şablon Hiyerarşisi

WordPress’in şablon hiyerarşisi, hangi içerik için hangi PHP dosyasının kullanılacağını belirler. Bunu anlamak özel tema geliştirmenin temel taşıdır.

Tekil yazı isteği (example.com/yazı-adi/)
  → single-{post-type}.php   (örn. single-portfolio.php)
  → single.php
  → singular.php
  → index.php

Statik sayfa isteği (example.com/hakkimizda/)
  → page-{slug}.php          (örn. page-hakkimizda.php)
  → page-{id}.php            (örn. page-42.php)
  → page.php
  → singular.php
  → index.php

Kategori arşivi
  → category-{slug}.php
  → category-{id}.php
  → category.php
  → archive.php
  → index.php

WordPress bu listeyi yukarıdan aşağıya kontrol eder ve ilk bulduğu dosyayı kullanır. Bu sistem sayesinde belirli sayfalar veya yazı tipleri için özelleştirilmiş şablonlar oluşturmak mümkündür.


Template Parts: Tekrar Kullanılabilir Bileşenler

get_template_part() fonksiyonu şablon dosyalarını parçalara ayırarak tekrar kullanımı mümkün kılar — modern framework’lerin component mantığının WordPress karşılığıdır.

// single.php içinde
get_template_part( 'template-parts/content/content', get_post_type() );

// Bu çağrı şu dosyayı arar:
// template-parts/content/content-post.php   (yazı türüne göre)
// template-parts/content/content.php        (bulunamazsa fallback)

Template parts’ın doğru kullanımı şablon dosyalarının okunabilirliğini ciddi ölçüde artırır ve DRY (Don’t Repeat Yourself) prensibine uyumu sağlar.


WordPress Hook Sistemi: Actions ve Filters

Hook sistemi WordPress’in en güçlü özelliklerinden biridir. Çekirdek kodu değiştirmeden işlevsellik eklemenize veya mevcut çıktıları değiştirmenize olanak tanır.

Action Hooks

Action hook’ları belirli bir olayda kod çalıştırmak için kullanılır:

// wp_head action'ına ekleme
function mytheme_add_preconnect() {
    echo '<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>';
}
add_action( 'wp_head', 'mytheme_add_preconnect' );

// wp_footer action'ına ekleme
function mytheme_analytics_code() {
    if ( ! is_user_logged_in() ) {
        echo '<!-- Analytics kodu -->';
    }
}
add_action( 'wp_footer', 'mytheme_analytics_code' );

Filter Hooks

Filter hook’ları mevcut bir değeri değiştirmek için kullanılır:

// Excerpt uzunluğunu özelleştirme
function mytheme_excerpt_length( $length ) {
    return 25; // Kelime sayısı
}
add_filter( 'excerpt_length', 'mytheme_excerpt_length' );

// Excerpt sonundaki "..." ifadesini değiştirme
function mytheme_excerpt_more( $more ) {
    return '&hellip; <a href="' . get_permalink() . '">' . __( 'Devamını Oku', 'my-custom-theme' ) . '</a>';
}
add_filter( 'excerpt_more', 'mytheme_excerpt_more' );

// Kütüphanenin varsayılan <p> etiketlerini kaldırma (yalnızca belirli durumlarda)
remove_filter( 'the_content', 'wpautop' );

Özel Yazı Tipleri (Custom Post Types) ve Temalar

Portföy, ekip üyeleri, ürünler, referanslar gibi özel içerik türleri için Custom Post Types (CPT) kullanılır. CPT’ler genellikle eklenti aracılığıyla oluşturulsa da tema içinde de tanımlanabilir:

function mytheme_register_portfolio_cpt() {
    $labels = [
        'name'               => __( 'Portfolyo', 'my-custom-theme' ),
        'singular_name'      => __( 'Portfolyo Öğesi', 'my-custom-theme' ),
        'add_new_item'       => __( 'Yeni Portfolyo Öğesi Ekle', 'my-custom-theme' ),
        'edit_item'          => __( 'Portfolyo Öğesini Düzenle', 'my-custom-theme' ),
    ];

    $args = [
        'labels'             => $labels,
        'public'             => true,
        'has_archive'        => true,
        'supports'           => [ 'title', 'editor', 'thumbnail', 'excerpt' ],
        'menu_icon'          => 'dashicons-portfolio',
        'rewrite'            => [ 'slug' => 'portfolyo' ],
        'show_in_rest'       => true, // Gutenberg ve REST API desteği
    ];

    register_post_type( 'portfolio', $args );
}
add_action( 'init', 'mytheme_register_portfolio_cpt' );

Bu CPT için şablon hiyerarşisi:

  • single-portfolio.php — Tekil portfolyo sayfası
  • archive-portfolio.php — Portfolyo listesi/arşivi

Child Theme: Hazır Tema Özelleştirmede Doğru Yol

Sıfırdan özel tema yerine mevcut bir temayı (parent theme) özelleştirmeyi tercih ediyorsanız her zaman Child Theme kullanılmalıdır.

Child Theme Oluşturma

my-child-theme/
├── style.css
└── functions.php

style.css:

/*
Theme Name: My Child Theme
Template: parent-theme-folder-name
Version: 1.0.0
*/

functions.php:

<?php
function mychild_enqueue_styles() {
    $parent_style = 'parent-theme-style';

    wp_enqueue_style(
        $parent_style,
        get_template_directory_uri() . '/style.css'
    );

    wp_enqueue_style(
        'child-theme-style',
        get_stylesheet_uri(),
        [ $parent_style ],
        wp_get_theme()->get('Version')
    );
}
add_action( 'wp_enqueue_scripts', 'mychild_enqueue_styles' );

Child theme; parent theme’in güncellemelerinden bağımsız olarak özelleştirmelerinizi korur. Parent theme güncellense de child theme dosyaları etkilenmez.


Full Site Editing (FSE) ve Block Themes

WordPress 5.9 ile birlikte gelen Full Site Editing (FSE), tema geliştirme paradigmasını köklü biçimde değiştiriyor. Geleneksel PHP şablon dosyaları yerine HTML + Block Markup tabanlı şablonlar kullanılıyor.

Klasik Tema vs Block Tema

ÖzellikKlasik TemaBlock Tema (FSE)
Şablon diliPHP + HTMLHTML + Block Markup
ÖzelleştirmePHP, CSSSite Editor (görsel)
Öğrenme eğrisiPHP bilgisi şartDaha erişilebilir
EsneklikÇok yüksekGelişiyor
Geriye uyumlulukGenişGutenberg gerektiriyor
PerformansKontrol edilebilirTema bağımlı

Block Tema Dosya Yapısı

my-block-theme/
├── style.css
├── theme.json          → Global tasarım ayarları
├── functions.php
├── templates/
│   ├── index.html
│   ├── single.html
│   ├── page.html
│   └── 404.html
└── parts/
    ├── header.html
    └── footer.html

theme.json: Tasarım Sistemi Tanımı

{
    "$schema": "https://schemas.wp.org/trunk/theme.json",
    "version": 3,
    "settings": {
        "color": {
            "palette": [
                { "slug": "primary",   "color": "#D4F73C", "name": "Birincil" },
                { "slug": "secondary", "color": "#0A0A0A", "name": "İkincil" },
                { "slug": "muted",     "color": "#888888", "name": "Soluk"    }
            ]
        },
        "typography": {
            "fontFamilies": [
                {
                    "fontFamily": "'Inter', sans-serif",
                    "slug": "inter",
                    "name": "Inter"
                }
            ],
            "fontSizes": [
                { "slug": "sm",  "size": "0.875rem", "name": "Küçük"  },
                { "slug": "md",  "size": "1rem",     "name": "Normal" },
                { "slug": "lg",  "size": "1.25rem",  "name": "Büyük"  },
                { "slug": "xl",  "size": "2rem",     "name": "Başlık" }
            ]
        },
        "spacing": {
            "spacingScale": {
                "operator": "*",
                "increment": 1.5,
                "steps": 7,
                "mediumStep": 1.5,
                "unit": "rem"
            }
        }
    },
    "styles": {
        "color": {
            "background": "var(--wp--preset--color--secondary)",
            "text": "#ffffff"
        },
        "typography": {
            "fontFamily": "var(--wp--preset--font-family--inter)",
            "fontSize": "var(--wp--preset--font-size--md)",
            "lineHeight": "1.75"
        }
    }
}

Özel WordPress Tema Geliştirmede SEO En İyi Pratikleri

Özel tema geliştirirken SEO altyapısını temaya entegre etmek, sonradan eklenti düzeltmelerine başvurmaktan çok daha etkilidir.

Doğru Başlık Yönetimi

// functions.php'de title-tag desteğini aktif edin
add_theme_support( 'title-tag' );

// Böylece <title> etiketini asla header.php'ye manuel yazmayın
// WordPress ve SEO eklentileri bunu otomatik yönetir

Heading Hiyerarşisi

// index.php veya archive.php — H1 yalnızca bir kez kullanılmalı
<h1 class="site-title">
    <?php bloginfo( 'name' ); ?>
</h1>

// Yazı listelerinde başlıklar H2 olmalı
<h2 class="entry-title">
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h2>

// Tekil sayfada (single.php veya page.php) H1 yazı başlığına verilmeli
<h1 class="entry-title"><?php the_title(); ?></h1>

Canonical URL Desteği

// header.php — wp_head() her şeyi yönetir, asla atlamayın
<?php wp_head(); ?>

wp_head() canonical URL’yi, hreflang’i, Open Graph meta etiketlerini ve SEO eklentilerinin çıktılarını bu kanca aracılığıyla yönetir.

Yapısal Veri (Schema Markup)

// single.php içinde Article schema
function mytheme_article_schema() {
    if ( ! is_singular( 'post' ) ) return;

    $schema = [
        '@context'         => 'https://schema.org',
        '@type'            => 'Article',
        'headline'         => get_the_title(),
        'datePublished'    => get_the_date( 'c' ),
        'dateModified'     => get_the_modified_date( 'c' ),
        'author'           => [
            '@type' => 'Person',
            'name'  => get_the_author(),
        ],
        'publisher'        => [
            '@type' => 'Organization',
            'name'  => get_bloginfo( 'name' ),
        ],
    ];

    echo '<script type="application/ld+json">' . wp_json_encode( $schema ) . '</script>';
}
add_action( 'wp_head', 'mytheme_article_schema' );

Görsel Alt Etiketleri

// Öne çıkan görselde alt etiket yönetimi
the_post_thumbnail( 'mytheme-hero', [
    'alt'     => trim( strip_tags( get_the_title() ) ),
    'loading' => 'eager',   // LCP görseli için lazy loading kapatılmalı
    'fetchpriority' => 'high',
] );

// Diğer görsellerde lazy loading
the_post_thumbnail( 'mytheme-card', [
    'alt'     => trim( strip_tags( get_the_title() ) ),
    'loading' => 'lazy',
] );

Performans Optimizasyonu: Özel Temada Hız

Özel tema geliştirmenin temel avantajlarından biri performans üzerindeki tam kontroldür.

Gereksiz WordPress Çıktılarını Kaldırma

function mytheme_cleanup_head() {
    // Yazar arşiv linkleri kaldır (güvenlik için de önerilir)
    remove_action( 'wp_head', 'wp_generator' );

    // Windows Live Writer manifestini kaldır
    remove_action( 'wp_head', 'wlwmanifest_link' );

    // RSD bağlantısını kaldır
    remove_action( 'wp_head', 'rsd_link' );

    // Kısa bağlantı kaldır
    remove_action( 'wp_head', 'wp_shortlink_wp_head' );

    // Eski WordPress sürümleri için feed bağlantılarını kaldır (isteğe bağlı)
    // remove_action( 'wp_head', 'feed_links', 2 );
    // remove_action( 'wp_head', 'feed_links_extra', 3 );
}
add_action( 'init', 'mytheme_cleanup_head' );

CSS’i Kritik ve Kritik Olmayan Olarak Ayırma

function mytheme_critical_css() {
    // Kritik CSS inline olarak head'e eklenir
    echo '<style>';
    include get_template_directory() . '/assets/css/critical.css';
    echo '</style>';
}
add_action( 'wp_head', 'mytheme_critical_css', 1 );

function mytheme_deferred_css() {
    // Kritik olmayan CSS sayfa sonunda yüklenir
    echo '<link rel="stylesheet" href="' . get_template_directory_uri() . '/assets/css/non-critical.css" media="print" onload="this.media=\'all\'">';
}
add_action( 'wp_footer', 'mytheme_deferred_css' );

Font Yükleme Optimizasyonu

function mytheme_preconnect_fonts() {
    echo '<link rel="preconnect" href="https://fonts.googleapis.com">';
    echo '<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>';
}
add_action( 'wp_head', 'mytheme_preconnect_fonts', 1 );

Web fontları için alternatif ve daha performanslı yaklaşım: fontları wp-content/themes/mytheme/assets/fonts/ altına indirip @font-face ile sunmak. Bu CDN bağlantısını ortadan kaldırır ve CLS riskini azaltır.


Özel Tema Geliştirme Süreci

Aşama 1: Gereksinim Analizi

  • Hangi sayfa şablonları gerekiyor?
  • Özel içerik türleri (CPT) olacak mı?
  • Çok dilli mi olacak?
  • Sayfa oluşturucu kullanılacak mı?
  • Performans hedefleri neler?
  • Bakım ve güncelleme kim tarafından yapılacak?

Aşama 2: Tasarım → Tema Yapısına Dönüştürme

Figma veya Adobe XD tasarımı incelenerek hangi bileşenlerin template-parts olacağı, hangi sayfa şablonlarının yazılması gerektiği ve hangi özel alanların (Custom Fields) kullanılacağı belirlenir.

Aşama 3: Geliştirme Ortamı Kurulumu

# Local WP, DevKinsta veya MAMP ile yerel ortam
# Composer ile PHP bağımlılıkları (isteğe bağlı)
composer require johnbillion/extended-cpts

# Node.js ve npm ile CSS/JS derleme
npm install
npm run dev  # Geliştirme
npm run build  # Prodüksiyon

Aşama 4: Tema Geliştirme

Geliştirme sırası genellikle şöyle ilerler:

  1. style.css başlık bloğu + functions.php iskeleti
  2. header.php ve footer.php
  3. index.php ana şablon
  4. page.php statik sayfa şablonu
  5. single.php yazı şablonu
  6. archive.php arşiv şablonu
  7. 404.php hata sayfası
  8. Özel sayfa şablonları (page-templates/)
  9. CPT şablonları (gerekirse)
  10. sidebar.php ve widget alanları (gerekirse)

Aşama 5: Test

  • W3C Markup Validator ile HTML doğrulama
  • PageSpeed Insights Core Web Vitals testleri
  • Accessibility (erişilebilirlik) testleri — WAVE aracı
  • Farklı tarayıcılarda görünüm
  • Mobil cihaz testleri
  • Yavaş bağlantı simülasyonu (Chrome DevTools Network throttling)

Özel Tema Geliştirme Maliyeti ve Süreci

Özel WordPress tema geliştirme maliyeti projenin karmaşıklığına, sayfa şablonu sayısına ve özel işlevlerin kapsamına göre değişir:

Proje TipiSayfa Şablonu SayısıTahmini SüreUygun Paket
Basit Kurumsal5-8 şablon3-5 haftaKurumsal: 20.000 TL + KDV
Orta Ölçekli10-15 şablon + CPT5-8 haftaKapsama göre Kurumsal veya Özel Yazılım (30.000 TL + KDV)
Karmaşık / E-ticaret20+ şablon + özel işlevler8-14 haftaKapsama göre Özel Yazılım / Premium veya projeye özel teklif
Kurumsal / API entegrasyonluProje bazlı14+ haftaPremium: 50.000 TL + KDV veya projeye özel teklif

Paket fiyatları tek seferlik ve KDV hariçtir. Güncel liste Hizmet Paketleri sayfasındadır; projenizi iletişim sayfasından anlatabilirsiniz. Bu paket fiyatları yalnızca geliştirme ücretini kapsar. Hosting, domain, SSL, SEO eklentisi lisansları ve bakım ayrı kalemlerdir.


Erişilebilirlik (Accessibility) ve Uluslararasılaştırma

Özel tema geliştirmenin genellikle atlanan ama uzun vadede kritik iki boyutu erişilebilirlik ve çoklu dil desteğidir.

Erişilebilir Tema Geliştirme

Erişilebilirlik yalnızca etik bir tercih değil, bazı sektörlerde (kamu, sağlık, eğitim) yasal bir gerekliliktir. Özel tema geliştirirken şu noktalara dikkat edilmelidir:

  • Klavye ile tam gezinme: menü, form ve buton öğeleri tab tuşuyla erişilebilir ve odaklanma (focus) durumu görsel olarak belirgin olmalıdır.
  • Anlamlı HTML5 landmark etiketleri (<nav>, <main>, <aside>, <footer>) kullanılmalıdır.
  • Görsellerde açıklayıcı alt metinleri zorunlu tutulmalı, dekoratif görsellerde alt="" kullanılmalıdır.
  • Renk kontrastı WCAG AA standardını (4.5:1) karşılamalıdır.
  • Form alanlarında label etiketleri for özniteliğiyle ilgili input’a bağlanmalıdır.

Çoklu Dil Desteği (i18n)

WordPress’in çeviri altyapısı, tema metinlerinin __() ve _e() fonksiyonlarıyla sarmalanmasını gerektirir:

// Çeviriye açık metin
<h2><?php esc_html_e( 'Bize Ulaşın', 'my-custom-theme' ); ?></h2>

// Değişken içeren çeviri
printf(
    /* translators: %s: yazar adı */
    esc_html__( 'Yazar: %s', 'my-custom-theme' ),
    esc_html( get_the_author() )
);

Bu yaklaşım benimsenirse tema, WPML veya Polylang gibi çoklu dil eklentileriyle sorunsuz çalışır; sonradan “çeviriye hazır hale getirme” gibi maliyetli bir revizyon gerekmez.


Bakım, Güncelleme ve Sürüm Yönetimi

Özel tema teslim edildikten sonra süreç bitmez; aksine, sitenin ömrü boyunca sürecek bir bakım ilişkisi başlar.

Sürüm Kontrolü (Git)

Her özel tema projesi Git ile versiyonlanmalıdır. Bu, geriye dönük değişiklik takibini, birden fazla geliştiricinin güvenle çalışmasını ve gerektiğinde önceki bir sürüme dönmeyi mümkün kılar. Basit bir dallanma stratejisi (ör. main, develop, özellik dalları) küçük projelerde bile disiplinli bir geliştirme süreci sağlar.

WordPress Çekirdek Güncellemeleriyle Uyum

WordPress çekirdeği her büyük sürümde yeni fonksiyonlar, kaldırılan (deprecated) fonksiyonlar ve güvenlik iyileştirmeleri getirir. Özel temanın her çekirdek güncellemesinden sonra bir hazırlık (staging) ortamında test edilmesi, canlı sitede sürpriz hatalarla karşılaşmayı önler.

Bakım Kontrol Listesi

  • WordPress çekirdek güncellemesi öncesi staging ortamında test yapıldı mı?
  • PHP sürümü güncel ve desteklenen bir sürüm mü (ör. PHP 8.1+)?
  • Tema dosyaları düzenli olarak Git’e commit ediliyor mu?
  • Güvenlik taraması (ör. Wordfence, Sucuri) düzenli çalıştırılıyor mu?
  • Yedekleme (backup) sistemi otomatik ve düzenli mi?
  • Core Web Vitals metrikleri periyodik olarak izleniyor mu (PageSpeed Insights, Search Console)?
  • Kullanılmayan eklentiler ve test kodları temizlendi mi?

Sık Yapılan Hatalar

  1. Enqueue sistemini atlayıp CSS/JS’i doğrudan header.php’ye yazmak. Bu yaklaşım eklenti çakışmalarına, versiyon önbellekleme sorunlarına ve bağımlılık yönetiminin çalışmamasına yol açar. wp_enqueue_style ve wp_enqueue_script her zaman kullanılmalıdır.
  2. Şablon hiyerarşisini görmezden gelip her şeyi index.php içine yığmak. Bu, tema büyüdükçe bakımı imkansız hale getiren dev, okunaksız bir dosya üretir. Doğru şablon dosyalarını (single.php, page.php, archive.php) kullanmak, kodun mantıklı biçimde bölünmesini sağlar.
  3. Child theme kullanmadan mevcut bir hazır temayı doğrudan düzenlemek. Bir sonraki tema güncellemesinde tüm özelleştirmeler kaybolur. Hazır tema özelleştirilecekse mutlaka child theme oluşturulmalıdır.
  4. SEO’yu sonradan eklenti ile “yamamaya” çalışmak. Title etiketi, heading hiyerarşisi, canonical URL ve schema markup en başından temaya entegre edilmezse, sonradan eklenti ile düzeltmek çoğu zaman çakışmalara ve çift işaretlemeye (ör. iki kez schema çıktısı) yol açar.
  5. Görsel optimizasyonunu ihmal etmek. loading="lazy" özniteliğini LCP (Largest Contentful Paint) görseline de uygulamak, sayfa hızını ciddi biçimde düşürür. Ekranın ilk görünen alanındaki görsellerde lazy loading kapatılmalı, fetchpriority="high" kullanılmalıdır.
  6. theme.json veya functions.php içinde renk ve tipografi değerlerini dağınık biçimde tekrar tekrar tanımlamak. Merkezi bir tasarım sistemi (theme.json veya CSS custom properties) kurulmadığında, tasarım güncellemeleri onlarca dosyada tek tek yapılmak zorunda kalır.
  7. Erişilebilirliği son ana bırakmak. Klavye navigasyonu, kontrast oranları ve landmark etiketleri, geliştirme sürecinin sonunda eklenmeye çalışıldığında genellikle eksik veya yamalı biçimde uygulanır. Bu unsurların baştan itibaren tasarıma dahil edilmesi çok daha sağlam sonuç verir.
  8. Test ortamı olmadan doğrudan canlı sitede geliştirme yapmak. Staging ortamı kurulmadan yapılan değişiklikler, canlı sitede beklenmedik hatalara ve kullanıcı deneyimi kesintilerine yol açabilir.

Vaka Kurgusu: Kurumsal Bir Danışmanlık Firmasının Tema Yenileme Süreci

Kurgusal bir örnek üzerinden özel tema geliştirmenin pratikte nasıl işlediğini görelim. 15 kişilik bir yönetim danışmanlığı firması, hazır bir premium temayla kurulmuş mevcut sitesinden memnun değil: sayfa yükleme süreleri yüksek, mobilde tasarım bozuluyor ve her tema güncellemesinde özelleştirmeler kayboluyor.

Uygulama: Proje, gereksinim analiziyle başlıyor: firmanın ihtiyaç duyduğu şablonlar (ana sayfa, hizmet sayfaları, ekip sayfası, referanslar, blog, iletişim) netleştiriliyor. Tasarım Figma’da hazırlandıktan sonra, her bileşen template-parts klasöründe ayrı dosyalar olarak planlanıyor. Geliştirme sürecinde functions.php içinde yalnızca ihtiyaç duyulan tema desteği (title-tag, post-thumbnails, custom-logo, nav menüleri) kaydediliyor; kullanılmayan hiçbir hazır tema özelliği taşınmıyor. Referanslar için özel bir yazı tipi (CPT) tanımlanıyor ve her referansa Organization ve Review schema ekleniyor. Kritik CSS head’e inline ediliyor, kritik olmayan CSS ise sayfa sonunda yükleniyor.

Sonuç penceresi (ilk 3 ay): Yeni tema yayına alındıktan sonraki ilk haftada PageSpeed Insights skorları mobilde belirgin biçimde yükseliyor; toplam CSS+JS boyutu önceki temaya kıyasla küçük bir kesire iniyor. İkinci ayda Search Console’da Core Web Vitals raporunda “İyi” statüsündeki URL oranı artıyor. Üçüncü ayda firma, sitenin mobil kullanıcı deneyiminden gelen şikayetlerin sona erdiğini ve organik trafikte kademeli bir artış gözlemlediğini bildiriyor. Firma ayrıca, artık her WordPress çekirdek güncellemesinde özelleştirmelerini kaybetme kaygısı taşımadığını belirtiyor çünkü tema tamamen kendilerine ait. (Vaka temsilidir.)


İlgili Kaynaklar

Özel tema geliştirme sürecinin devamında sıklıkla ihtiyaç duyulan konular için şu rehberlerimize göz atabilirsiniz: mevcut bir WordPress sitesinde hız sorunları yaşıyorsanız WordPress hız problemlerine kesin çözümler yazımız adım adım bir teşhis ve çözüm süreci sunar. Sitenizin arama motorlarında doğru taranması için WordPress XML sitemap oluşturma rehberimize, blog SEO ayarlarınızı optimize etmek için WordPress blog SEO ayarları yazımıza başvurabilirsiniz. Sıfırdan bir WordPress sitesi kurma sürecini bütünsel olarak incelemek isterseniz WordPress site yapımı yazımız faydalı olacaktır.


Sonuç: Özel Tema Yatırımının Uzun Vadeli Değeri

Özel WordPress tema yapımı; kısa vadede hazır temadan daha yüksek maliyet gerektirir. Ancak hız, güvenlik, tasarım özgünlüğü, SEO performansı ve uzun vadeli bakım kolaylığı açısından bu yatırım katbekat geri döner.

Özellikle ciddi SEO hedefleri olan, marka kimliğini dijitalde güçlü yansıtmak isteyen ve uzun vadede sahip olduğu varlığın değerini korumak isteyen işletmeler için özel WordPress tema geliştirme; olası en iyi teknik yatırımlardan biridir.

Projeniz için özel tema analizi ve fiyat teklifi almak üzere ücretsiz görüşme talep edebilirsiniz. WordPress web tasarım hizmetimiz kapsamında özel tema geliştirme sürecini uçtan uca yürütüyoruz.


Sık Sorulan Sorular

Özel WordPress tema geliştirme ne kadar sürer?
Proje karmaşıklığına bağlı olarak değişir. Basit kurumsal bir site için 3-5 hafta, orta ölçekli özel yazı tipleri içeren bir proje için 5-8 hafta, karmaşık e-ticaret veya API entegrasyonlu bir proje için 8-14 haftadan fazla sürebilir. Süreyi etkileyen en büyük değişken, şablon sayısı ve özel işlevlerin (custom post type, entegrasyon, çoklu dil) kapsamıdır.
Mevcut hazır temamı özel temaya dönüştürmek mümkün mü?
Teknik olarak mümkündür ancak genellikle tavsiye edilmez. Hazır temanın kod tabanını baz alarak özelleştirmek, sıfırdan yazmaktan çoğu zaman daha karmaşık ve zaman alıcıdır çünkü gereksiz kod tabanını ayıklamak, sıfırdan temiz kod yazmaktan daha fazla efor gerektirebilir. Sitenin tasarımı ve yapısı büyük ölçüde korunacaksa, mevcut görselleri ve içerik yapısını referans alarak sıfırdan bir tema yazmak daha sağlam bir sonuç verir.
Özel tema Full Site Editing (block tema) ile mi yoksa klasik PHP şablonlarıyla mı geliştirilmeli?
Bu, projenin ihtiyaçlarına bağlıdır. Block tema, editörlerin görsel arayüzden geniş özelleştirme yapmasını istediğiniz, PHP bilgisi olmayan bir ekibin içerik ve tasarım güncellemesi yapacağı projelerde avantajlıdır. Klasik PHP şablonları ise karmaşık özel işlevler, sıkı performans kontrolü ve tam esneklik gerektiren kurumsal projelerde hâlâ daha güçlü bir seçenektir. Pek çok proje, iki yaklaşımı hibrit biçimde birleştirir.
Özel tema SEO performansını gerçekten etkiler mi?
Evet, doğrudan etkiler. Daha küçük dosya boyutu ve daha az HTTP isteği, Core Web Vitals metriklerini (LCP, CLS, INP) iyileştirir; bu metrikler Google’ın sıralama sinyalleri arasında yer alır. Ayrıca doğru heading hiyerarşisi, temiz semantik HTML ve temaya entegre edilmiş schema markup, arama motorlarının sayfa içeriğini daha doğru anlamlandırmasını sağlar. Hazır bir temanın üzerine SEO eklentisiyle yapılan düzeltmeler, temaya baştan entegre edilmiş bir yapının sağladığı düzeyde temiz sonuç vermez.
Özel tema geliştirmek için hangi teknik bilgi gereklidir?
PHP, WordPress’in hook sistemi (actions ve filters), HTML5, CSS ve temel JavaScript bilgisi gereklidir. Block tema geliştirmede ayrıca theme.json yapılandırması ve Block Markup bilgisi de önemlidir. Bu nedenle özel tema geliştirme, genellikle WordPress’e özel deneyimi olan bir geliştirici veya ajans tarafından yürütülür; genel web geliştirme bilgisi tek başına yeterli olmayabilir.
Özel temanın bakımını kim üstlenmeli?
İdeal olarak, temayı geliştiren ekip veya bu konuda deneyimli bir WordPress geliştiricisi bakımı üstlenmelidir. Bakım; WordPress çekirdek güncellemeleriyle uyumluluk testi, güvenlik taramaları, performans izleme ve gerektiğinde küçük düzeltmeleri kapsar. Bakım sözleşmesi olmadan bırakılan özel temalar, zamanla PHP sürüm uyumsuzlukları veya güvenlik açıkları nedeniyle sorun yaşayabilir.
Yapay zeka araçları özel tema geliştirme sürecinde kullanılabilir mi?
Evet, belirli aşamalarda faydalı olabilir. Yapay zeka destekli kod tamamlama araçları, tekrarlayan şablon kodlarının (ör. benzer template-parts dosyaları) hızlıca taslaklanmasında, fonksiyon dokümantasyonu yazımında ve kod incelemesinde zaman kazandırabilir. Ancak temanın mimarisi, performans kararları ve güvenlik denetimi mutlaka deneyimli bir geliştirici tarafından gözden geçirilmelidir; üretilen kodun WordPress’in güncel en iyi pratiklerine (ör. enqueue sistemi, escaping fonksiyonları) uygunluğu otomatik olarak garanti edilmez.
Özel tema ile sayfa oluşturucu (page builder) birlikte kullanılabilir mi?
Teknik olarak mümkündür ancak dikkatli tasarlanmalıdır. Elementor veya benzer bir sayfa oluşturucu, belirli sayfalarda (ör. kampanya sayfaları) editörlere esneklik sağlamak için özel temayla birlikte kullanılabilir. Ancak sitenin çekirdek sayfalarını (ana sayfa, hizmet sayfaları) tamamen sayfa oluşturucuya bırakmak, özel temanın performans avantajının büyük kısmını ortadan kaldırabilir çünkü sayfa oluşturucular genellikle ek CSS/JS yükü getirir.
Onur Öztürk, SEO uzmanı
// yazar

Onur ÖZTÜRK

SEO Uzmanı & Dijital Pazarlama Danışmanı

15 yılı aşkın deneyimle sağlık turizmi, e-ticaret ve kurumsal markalar için SEO stratejisi geliştiriyorum. Google Partner ve Meta Business Partner olarak 150'den fazla işletmenin organik büyümesine katkı sağladım. SEO'nun yanında web tasarım, reklam yönetimi ve logo tasarımı hizmetlerini de ekibimle birlikte yürütüyorum.

// google arama

Bu içerikleri Google'da daha sık görün

onuroztr.com'u tercih edilen kaynak olarak ekleyin; yazılarımız arama sonuçlarında ve yapay zeka özetlerinde size daha sık gösterilsin.

WhatsApp'tan yazın Genellikle 1 saat içinde dönüyorum
WhatsApp Toplantı Planlayın