- Plan i przygotowanie środowiska
- Wybór podejścia: klasyczny mini motyw czy blokowy
- Narzędzia i konfiguracja lokalna
- Struktura robocza i założenia
- Struktura plików mini motywu i pliki obowiązkowe
- style.css – metadane i pierwszy styl
- index.php – minimalny widok wpisów
- header.php i footer.php – części wspólne
- functions.php – wsparcie, menu, miniatury
- Wariant blokowy – templates i parts
- Pozostałe detale: screenshot i hierarchia
- Style i skrypty: ładowanie, dostępność i szybkość
- Poprawne kolejki i zależności
- Krytyczne CSS, kolejność i warunki
- Dostępność: fokus, kontrast, skip linki
- Optymalizacja i wydajność
- Nazwa i porządek klas CSS
- Szablony i pętla WP – od listy po pojedynczy wpis
- Pętla: fundament wyświetlania treści
- page.php – statyczne strony
- archive.php, search.php, 404.php
- sidebar.php i widgety
- Komentarze i formularz
- Funkcje dodatkowe, jakość i integracje
- Rejestracja menu, logo, rozmiary obrazów
- Tłumaczenia i i18n
- Bezpieczeństwo, sanityzacja i escapowanie
- Customizer i panel motywu vs theme.json
- Kompatybilność z edytorem blokowym
- hooki – wstrzeliwanie się w cykl życia WP
- Testy, zgodność i narzędzia jakości
- Porządek w treściach i SEO
- Wariant blokowy: templates i parts w praktyce
- Dystrybucja, aktualizacje, licencja
- Przykładowe uzupełnienia w functions.php
- Checklist wdrożeniowy
Jeśli chcesz zrozumieć, jak działa serce WordPress, zbudowanie własnego mini motywu to najlepsza droga. Taki projekt pozwala przejąć kontrolę nad front-endem, szybko wdrożyć proste strony oraz nauczyć się praktyk, które potem rozwiniesz w pełnoprawny produkt. W tym poradniku krok po kroku skonfigurujesz strukturę plików, dodasz obsługę stylów i skryptów, przygotujesz pętlę wpisów oraz wprowadzisz drobne udogodnienia dla SEO, a11y i pracy z edytorem blokowym.
Plan i przygotowanie środowiska
Wybór podejścia: klasyczny mini motyw czy blokowy
Zanim stworzysz pierwszy plik, zdecyduj, czy zaczynasz od klasycznego układu (pliki PHP + pętla) czy od lekkiego motywu blokowego z katalogami templates i parts. Klasyczny wariant jest świetny edukacyjnie: masz pełną kontrolę nad pętlą i strukturą DOM. Wersja blokowa szybciej integruje się z nowym edytorem Gutenberg i mocniej korzysta z konfiguracji w pliku theme.json. W tym przewodniku pokażę oba tory, tak abyś mógł wybrać to, co najlepiej pasuje do Twojego projektu.
Narzędzia i konfiguracja lokalna
Zainstaluj lokalny serwer (np. Local, MAMP, XAMPP, Laragon) i świeżą instancję WP. Przydatne narzędzia:
- WP-CLI do instalacji i scaffoldingu,
- edytor z podpowiedziami PHP/JS/CSS,
- wtyczki: Query Monitor, Debug Bar do diagnostyki.
W pliku wp-config.php włącz tryb debugowania: define(’WP_DEBUG’, true); Ustal unikalny prefiks bazy i upewnij się, że środowisko działa z najnowszą wersją PHP obsługiwaną przez Twój hosting.
Struktura robocza i założenia
Załóż katalog wp-content/themes/mini-start. W nim utworzysz minimalny zestaw: style.css, index.php, header.php, footer.php oraz functions.php. Naszym celem jest prosty, szybki i bezpieczny mini motyw, który można w kilka minut dostosować do nowego zlecenia lub prototypu.
Struktura plików mini motywu i pliki obowiązkowe
style.css – metadane i pierwszy styl
Plik style.css zawiera nagłówek z metadanymi, które rozpoznaje WP. Dodaj:
/*
Theme Name: Mini Start
Theme URI: https://example.com/mini-start
Author: Ty
Author URI: https://example.com
Description: Minimalny motyw edukacyjny
Version: 0.1.0
License: GPL-2.0-or-later
Text Domain: mini-start
*/
Na początku dodaj drobny reset i zmienne kolorów, by zachować spójność wizualną:
:root { –space: 1rem; –brand: #2740ff; –text: #222; }
* { box-sizing: border-box; }
body { margin: 0; color: var(–text); font-family: system-ui, sans-serif; line-height: 1.6; }
a { color: var(–brand); text-decoration: none; }
a:focus { outline: 2px solid var(–brand); outline-offset: 2px; }
index.php – minimalny widok wpisów
Utwórz index.php – to plik awaryjny, używany gdy nie istnieją bardziej szczegółowe pliki hierarchii szablonów. W wersji klasycznej:
<?php get_header(); ?>
<main id=”content” class=”site-main”>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<article id=”post-<?php the_ID(); ?>”>
<h2><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></h2>
<div class=”entry”><?php the_excerpt(); ?></div>
</article>
<?php endwhile; the_posts_pagination(); else : ?>
<p>Brak treści.</p>
<?php endif; ?>
</main>
<?php get_footer(); ?>
header.php i footer.php – części wspólne
header.php powinien zawierać otwarcie dokumentu i nawigację:
<!— header.php —>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset=”<?php bloginfo(’charset’); ?>”>
<meta name=”viewport” content=”width=device-width, initial-scale=1″>
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<a class=”skip-link” href=”#content”>Przejdź do treści</a>
<header class=”site-header”>
<h1 class=”site-title”><a href=”<?php echo esc_url( home_url(’/’) ); ?>”><?php bloginfo(’name’); ?></a></h1>
<nav class=”site-nav”><?php wp_nav_menu([’theme_location’ => 'primary’]); ?></nav>
</header>
footer.php zamyka strukturę i ładuje stopkę:
<footer class=”site-footer”>
<p>© <?php echo date(’Y’); ?> <?php bloginfo(’name’); ?></p>
</footer>
<?php wp_footer(); ?>
</body>
</html>
functions.php – wsparcie, menu, miniatury
W pliku functions.php włącz wsparcie dla elementów motywu i dodaj rejestrację menu oraz stylów/skryptów:
<?php
add_action(’after_setup_theme’, function () {
add_theme_support(’title-tag’);
add_theme_support(’post-thumbnails’);
add_theme_support(’html5′, [’search-form’,’comment-list’,’gallery’,’caption’]);
register_nav_menus([’primary’ => 'Menu główne’]);
});
add_action(’wp_enqueue_scripts’, function () {
wp_enqueue_style(’mini-start’, get_stylesheet_uri(), [], wp_get_theme()->get(’Version’));
});
Dodamy też miejsce na skrypty później, pilnując poprawnego enqueue i kolejkowania zależności.
Wariant blokowy – templates i parts
Dla wersji blokowej utwórz katalogi: templates (np. index.html, single.html) oraz parts (header.html, footer.html). Zamiast header.php/footer.php używasz plików HTML z blokami. Centralną rolę odgrywa plik theme.json, który konfiguruje style globalne, palety kolorów, typografię i spacing bez potrzeby pisania dużej ilości CSS.
Pozostałe detale: screenshot i hierarchia
Dodaj screenshot.png (1200×900) – to miniatura, którą widać w panelu WP. Zapamiętaj hierarchię plików: single.php nadpisuje widok pojedynczego wpisu, page.php – stron, archive.php – archiwów itd. To klucz do świadomego projektowania każdego szablonu.
Style i skrypty: ładowanie, dostępność i szybkość
Poprawne kolejki i zależności
Skrypty i style zawsze ładuj przez wp_enqueue_style i wp_enqueue_script w akcji wp_enqueue_scripts. Dzięki temu masz kontrolę nad wersjonowaniem, zależnościami i umiejscowieniem w stopce. Przykład dodania JS w stopce:
add_action(’wp_enqueue_scripts’, function () {
wp_enqueue_style(’mini-start’, get_stylesheet_uri(), [], wp_get_theme()->get(’Version’));
wp_enqueue_script(’mini-start-js’, get_template_directory_uri() . '/assets/app.js’, [], wp_get_theme()->get(’Version’), true);
});
Jeśli używasz bibliotek (np. Swiper), podaj je jako zależności w tablicy, aby uniknąć konfliktów. Wersjonowanie oparte na numerze motywu ułatwia bustowanie cache w przeglądarce.
Krytyczne CSS, kolejność i warunki
Możesz wstawić krótki fragment krytycznego CSS inline, a resztę ładować asynchronicznie. W razie potrzeby dodawaj style lub skrypty warunkowo (np. tylko na stronie wpisu). Przykład:
if ( is_single() ) {
wp_enqueue_style(’mini-article’, get_template_directory_uri().’/assets/article.css’, [’mini-start’], '1.0′);
}
Dostępność: fokus, kontrast, skip linki
Dbaj o wyraźny fokus, odpowiedni kontrast kolorów i semantykę nagłówków. Skip link już dodaliśmy. Formularz wyszukiwania generuj przez get_search_form(), a label dla pola wyszukiwania opisuj tekstem widocznym dla czytników ekranowych (np. klasą screen-reader-text).
Optymalizacja i wydajność
Używaj lazy-load dla obrazów (domyślnie w WP), generuj miniatury w rozmiarach dopasowanych do layoutu, a skrypty wsadzaj do stopki. Rozważ preload dla kluczowych czcionek w head. W ustawieniach motywu możesz włączyć obsługę wybranych formatów obrazów i rozmiarów, aby ograniczyć transfer. Minimalizuj własne CSS/JS i testuj czasy TTFB oraz LCP.
Nazwa i porządek klas CSS
Trzymaj prosty system klas (np. util-*, comp-*, layout-*). Mały motyw nie potrzebuje rozbudowanych konwencji, ale spójność ułatwia rozwój. Pamiętaj o wariantach dark/light jeśli zakładasz zmianę motywu kolorystycznego – możesz skorzystać z prefers-color-scheme w CSS lub wariantów w theme.json.
Szablony i pętla WP – od listy po pojedynczy wpis
Pętla: fundament wyświetlania treści
Podstawowa pętla obsługuje listę wpisów. W single.php zamień the_excerpt() na the_content(), dodaj metadane i nawigację po wpisach:
<?php get_header(); ?>
<main id=”content”>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<article>
<h1><?php the_title(); ?></h1>
<div class=”meta”>Autor: <?php the_author(); ?> • <?php the_time(get_option(’date_format’)); ?></div>
<div class=”entry”><?php the_content(); ?></div>
<div class=”post-nav”><?php the_post_navigation(); ?></div>
</article>
<?php endwhile; else : ?>
<p>Brak treści.</p>
<?php endif; ?>
</main>
<?php get_footer(); ?>
page.php – statyczne strony
Stwórz page.php podobny do single, lecz bez metadanych blogowych. Dodaj możliwość stylów full width (klasa .page-full), a w CSS przygotuj prosty grid lub maksymalną szerokość treści, aby kontrolować czytelność.
archive.php, search.php, 404.php
archive.php prezentuje kategorie, tagi i autorskie taksonomie. search.php pokazuje wyniki wyszukiwania wraz z formularzem. 404.php powinien oferować link do strony głównej, popularne wpisy i wyszukiwanie. Zachowaj jednorodny komponent karty wpisu (thumbnail, tytuł, data, krótki opis) – to ułatwia utrzymanie motywu.
sidebar.php i widgety
Jeśli chcesz obsłużyć paski boczne, zarejestruj obszar w functions.php:
add_action(’widgets_init’, function () {
register_sidebar([
'name’ => 'Pasek boczny’,
'id’ => 'sidebar-1′,
'before_widget’ => '<section class=”widget”>’,
'after_widget’ => '</section>’,
'before_title’ => '<h3>’,
'after_title’ => '</h3>’,
]);
});
Wstaw pasek przez get_sidebar(). Uważaj, aby w układzie mobilnym pasek nie przytłaczał treści – najczęściej powinien spaść pod listing.
Komentarze i formularz
W single.php możesz dodać comments_template() pod treścią. Ustal spójny wygląd listy komentarzy i formularza. Użyj wbudowanego callbacka do generowania elementów listy lub napisz własny, pamiętając o escapingu i czytelności na urządzeniach mobilnych.
Funkcje dodatkowe, jakość i integracje
Rejestracja menu, logo, rozmiary obrazów
Dodaj w after_setup_theme wsparcie dla logo: add_theme_support(’custom-logo’, [’height’ => 80, 'width’ => 200, 'flex-height’ => true, 'flex-width’ => true]); Zarejestruj dodatkowe menu (footer) oraz rozmiary obrazów: add_image_size(’card’, 640, 360, true). Używaj the_post_thumbnail(’card’) w listingu, by serwować możliwie małe pliki.
Tłumaczenia i i18n
Przygotuj motyw do tłumaczeń: load_theme_textdomain(’mini-start’, get_template_directory().’/languages’); Zamiast twardych napisów stosuj funkcje __(), _e(), _x() z domeną mini-start. Pliki .po/.mo utworzysz w narzędziach typu Poedit lub wp i18n z WP-CLI.
Bezpieczeństwo, sanityzacja i escapowanie
Każdy dynamiczny output przepuszczaj przez esc_html(), esc_url(), esc_attr(). Linki buduj przez add_query_arg i wp_nonce_url, jeśli wykonują akcje w panelu. Dane z Customizera lub opcji oczyszczaj przez sanitize_text_field czy sanitize_hex_color, w zależności od typu. Nawet mini motyw powinien trzymać rygor bezpieczeństwa.
Customizer i panel motywu vs theme.json
W podejściu klasycznym drobne ustawienia (kolory akcentu, szerokość treści) dodasz w Customizerze przez customize_register. W motywie blokowym większość globalnych stylów i opcji ustawisz w theme.json – np. typografię, spacing, layouty kontenera, dozwolone palety, a nawet blokady modyfikacji. Dzięki temu panujesz nad spójnością bez rozszerzania CSS.
Kompatybilność z edytorem blokowym
Dodaj add_theme_support(’editor-styles’) i plik editor-style.css, aby treść w edytorze wyglądała podobnie jak na froncie. Ogranicz dostępne kolory i rozmiary tekstu tak, by redaktorzy nie rozbijali systemu designu. Dodaj obsługę stylów bloków (wp-block-styles) oraz sprawdź, czy komponenty jak group/columns zachowują założone odstępy.
hooki – wstrzeliwanie się w cykl życia WP
Pracuj z akcjami i filtrami: after_setup_theme do funkcji motywu, wp_enqueue_scripts do kolejek zasobów, body_class do dopisania klas kontekstowych, the_content do modyfikacji treści (np. CTA na końcu wpisu). Zwracaj uwagę na priorytety wywołań i staraj się, by funkcje były krótkie i opisowe.
Testy, zgodność i narzędzia jakości
Zainstaluj Theme Check i sprawdź raport. Uruchom PHPCS z regułami WordPress Coding Standards. W przeglądarce przetestuj a11y (zakładka Lighthouse), sprawdź kontrasty, kolejność fokusu i obsługę klawiaturą. Upewnij się, że layout nie łamie się na wąskich ekranach i że grafiki mają alt lub są oznaczone jako dekoracyjne, jeśli nie niosą treści.
Porządek w treściach i SEO
Zachowaj poprawną hierarchię nagłówków (jedno H1 na stronę, kolejne poziomy logiczne). Dodaj breadcrumbs (np. prostą funkcję lub wtyczkę) oraz rel=prev/next nawigacji po wpisach. Dbaj o lekkie HTML, małe obrazy i semantykę – to daje czytelność i korzyści dla wyszukiwarek bez agresywnych trików.
Wariant blokowy: templates i parts w praktyce
Utwórz templates/index.html:
<!– wp:template-part {„slug”:”header”} /–>
<!– wp:group {„tagName”:”main”,”layout”:{„type”:”constrained”}} –>
<!– wp:query {„query”:{„perPage”:10}} –>
<!– wp:post-template –>
<!– wp:heading {„level”:2} –><a href=”<!– wp:post-permalink /–>”><!– wp:post-title /–></a><!– /wp:heading –>
<!– wp:post-excerpt /–>
<!– /wp:post-template –>
<!– /wp:query –>
<!– /wp:group –>
<!– wp:template-part {„slug”:”footer”} /–>
Utwórz parts/header.html i parts/footer.html z odpowiednimi blokami nawigacji i stopki. Styl i zachowanie definiuj w theme.json – np. palette, layout.contentSize, layout.wideSize. To najszybszy sposób na mini motyw bazujący na blokach.
Dystrybucja, aktualizacje, licencja
Jeśli planujesz udostępnić motyw, zachowaj licencję GPL, porządny readme i numerację semantyczną. Aktualizacje opisuj w changelogu. Pamiętaj, że repozytorium WP wymaga spełnienia wytycznych (m.in. sanityzacja danych, brak reklam i zamkniętych zależności). Nawet jeśli to projekt prywatny, trzymaj przejrzystą strukturę i historię w Git.
Przykładowe uzupełnienia w functions.php
Wsparcie dla obrazów i wyłączenie emoji dla lepszych czasów ładowania:
add_action(’after_setup_theme’, function () {
add_image_size(’hero’, 1280, 720, true);
});
add_action(’init’, function () {
remove_action(’wp_head’, 'print_emoji_detection_script’, 7);
remove_action(’wp_print_styles’, 'print_emoji_styles’);
});
Checklist wdrożeniowy
- Nagłówek w style.css uzupełniony, screenshot dodany.
- Header, footer i index gotowe, pojedynczy wpis i strona działają.
- Kolejki CSS/JS przez poprawny enqueue, brak duplikatów.
- Menu zarejestrowane, miniatury włączone, rozmiary dopasowane.
- Dostępność: fokus, skip link, kontrasty, semantyka.
- Optymalizacja obrazów i skryptów, testy Lighthouse.
- Tłumaczenia z domeną mini-start, esc_* na wyjściu.
- Integracja z edytorem Gutenberg lub konfiguracja w theme.json.
- Prosta struktura klas CSS, spójne karty wpisów.
- Repozytorium Git i notatki wdrożeniowe.
Praca z mini motywem to praktyczny kurs architektury WP: od pierwszej linii kodu przez hooki po wytyczne jakości. Gdy opanujesz fundamenty, każdy kolejny projekt złożysz szybciej, a Twoje motywy będą lżejsze, bezpieczniejsze i łatwiejsze w utrzymaniu.