🎨 Jak stworzyć własną skórkę w WordPress krok po kroku
Tworzenie własnych motywów WordPress to umiejętność, która daje Ci pełną kontrolę nad wyglądem i funkcjonalnością Twojej strony. W tym kompleksowym przewodniku przeprowadzimy Cię przez cały proces tworzenia profesjonalnego motywu WordPress od podstaw - od struktury plików, przez style CSS, aż po zaawansowane funkcje. Niezależnie od tego, czy jesteś początkującym programistą czy doświadczonym webdeveloperem, ten poradnik pomoże Ci stworzyć unikalny motyw dopasowany do Twoich potrzeb.
⚡ Ekspresowe Podsumowanie:
- Struktura motywu: Prawidłowa organizacja plików to podstawa dobrego motywu WordPress.
- Pliki szablonów: Zrozumienie hierarchii szablonów WordPress jest kluczowe dla tworzenia własnych motywów.
- Style i funkcje: Pliki style.css i functions.php to serce Twojego motywu.
- Responsywność i zgodność: Dobry motyw musi działać na wszystkich urządzeniach i być zgodny z najnowszymi standardami.
🗺️ Spis Treści - Twoja Mapa Drogowa
📋 Przygotowanie do tworzenia motywu WordPress
Przed przystąpieniem do kodowania, potrzebna jest odpowiednia konfiguracja środowiska i zrozumienie fundamentalnych koncepcji związanych z tworzeniem motywów WordPress.
Niezbędne narzędzia i umiejętności
Aby skutecznie tworzyć motywy WordPress, potrzebujesz:
- Lokalnego środowiska deweloperskiego (np. XAMPP, MAMP, Local by Flywheel)
- Edytora kodu (np. Visual Studio Code, Sublime Text, PhpStorm)
- Wiedzy z zakresu:
- HTML
- CSS
- PHP (przynajmniej podstawy)
- JavaScript (opcjonalnie, ale przydatne)
- Zasad działania WordPress
✨ Pro Tip: Zainstaluj rozszerzenia do swojego edytora kodu, które wspierają składnię WordPress, PHP i automatyczne formatowanie. Zaoszczędzisz mnóstwo czasu!
Instalacja środowiska deweloperskiego
Oto kroki, aby skonfigurować lokalne środowisko deweloperskie:
- Zainstaluj pakiet lokalnego serwera (XAMPP, MAMP lub Local by Flywheel)
- Skonfiguruj instancję WordPress:
- Utwórz bazę danych MySQL
- Pobierz najnowszą wersję WordPress ze strony wordpress.org
- Skonfiguruj WordPress wskazując na utworzoną bazę danych
- Przygotuj strukturę katalogów:
- Przejdź do katalogu
wp-content/themes/
- Utwórz nowy katalog dla swojego motywu (np.
moj-motyw
)
- Przejdź do katalogu
Podstawowe koncepcje motywów WordPress
Przed rozpoczęciem kodowania, ważne jest zrozumienie kilku kluczowych koncepcji:
- Hierarchia szablonów - System WordPress określa, który plik szablonu zostanie użyty do wyświetlenia każdej strony
- Pętla WordPress - Podstawowy mechanizm wyświetlania zawartości
- Hooki i filtry - Pozwalają na modyfikację zachowania WordPress bez zmiany kodu źródłowego
- Funkcje motywu - Specjalne funkcje pozwalające na dodawanie funkcjonalności do motywu
🏗️ Struktura podstawowego motywu WordPress
Każdy motyw WordPress musi zawierać określone pliki i przestrzegać pewnych konwencji, aby działać poprawnie.
Minimalne wymagane pliki
Absolutne minimum do funkcjonowania motywu WordPress to dwa pliki:
- style.css - zawiera metadane motywu i style CSS
- index.php - główny szablon, używany jako ostateczne rozwiązanie, gdy nie ma innych, bardziej specyficznych szablonów
Jednak dla funkcjonalnego motywu zazwyczaj potrzebne są dodatkowe pliki:
- functions.php - zawiera funkcje specyficzne dla motywu
- header.php - górna część strony, zawierająca elementy takie jak nagłówek, menu, itp.
- footer.php - dolna część strony, zazwyczaj zawierająca stopkę
- sidebar.php - szablon paska bocznego
- single.php - szablon dla pojedynczych postów
- page.php - szablon dla stron statycznych
- archive.php - szablon dla stron archiwum
- 404.php - szablon dla błędu 404
Tworzenie struktury katalogów
Dobrze zorganizowana struktura katalogów to podstawa utrzymywalnego motywu:
moj-motyw/
├── css/ # Pliki CSS
├── js/ # Pliki JavaScript
├── images/ # Obrazy używane w motywie
├── inc/ # Pliki z funkcjami PHP
├── template-parts/ # Wielokrotnie używane fragmenty szablonów
├── languages/ # Pliki tłumaczeń
├── style.css # Główny plik CSS z metadanymi motywu
├── functions.php # Główny plik funkcji
├── index.php # Główny szablon
├── header.php
├── footer.php
├── sidebar.php
├── single.php
├── page.php
├── archive.php
└── 404.php
✨ Pro Tip: Trzymaj się zasady DRY (Don't Repeat Yourself) - umieszczaj powtarzające się fragmenty kodu w katalogu template-parts/
i dołączaj je za pomocą funkcji get_template_part()
.
Konfiguracja pliku style.css
Plik style.css
musi zawierać blok komentarzy z metadanymi motywu:
/*
Theme Name: Mój Motyw
Theme URI: https://przyklad.pl/moj-motyw/
Author: Twoje Imię
Author URI: https://przyklad.pl/
Description: Krótki opis motywu, który pojawi się w panelu administracyjnym.
Version: 1.0.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: moj-motyw
Tags: responsive, custom-menu, custom-logo, featured-images
*/
/* Tutaj zaczynają się właściwe style CSS */
Te metadane są niezbędne, aby WordPress rozpoznał Twój motyw.
🧩 Tworzenie podstawowych szablonów
Po skonfigurowaniu struktury motywu, czas na tworzenie podstawowych szablonów, które będą wyświetlać zawartość strony.
Tworzenie pliku index.php
Plik index.php
jest najważniejszym szablonem w motywie WordPress. Służy jako "ostatnia deska ratunku", gdy WordPress nie może znaleźć bardziej specyficznego szablonu dla danej strony.
Oto prosty przykład pliku index.php
:
<?php get_header(); ?>
<main id="primary" class="site-main">
<?php
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
</header>
<div class="entry-content">
<?php the_content(); ?>
</div>
</article>
<?php
endwhile;
the_posts_navigation();
else :
?>
<article class="no-results">
<header class="entry-header">
<h1 class="entry-title">Nie znaleziono treści</h1>
</header>
<div class="entry-content">
<p>Niestety, nie znaleziono treści spełniających podane kryteria.</p>
</div>
</article>
<?php
endif;
?>
</main>
<?php
get_sidebar();
get_footer();
Tworzenie plików header.php i footer.php
Pliki header.php
i footer.php
zawierają elementy, które powtarzają się na każdej stronie.
header.php:
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="profile" href="https://gmpg.org/xfn/11">
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<div id="page" class="site">
<header id="masthead" class="site-header">
<div class="site-branding">
<?php
if ( has_custom_logo() ) :
the_custom_logo();
else :
?>
<h1 class="site-title"><a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a></h1>
<?php
$description = get_bloginfo( 'description', 'display' );
if ( $description ) :
?>
<p class="site-description"><?php echo $description; ?></p>
<?php endif; ?>
<?php endif; ?>
</div><!-- .site-branding -->
<nav id="site-navigation" class="main-navigation">
<?php
wp_nav_menu(
array(
'theme_location' => 'menu-1',
'menu_id' => 'primary-menu',
)
);
?>
</nav><!-- #site-navigation -->
</header><!-- #masthead -->
footer.php:
<footer id="colophon" class="site-footer">
<div class="site-info">
<?php
printf(
esc_html__( '© %1$s %2$s', 'moj-motyw' ),
date( 'Y' ),
get_bloginfo( 'name' )
);
?>
</div><!-- .site-info -->
</footer><!-- #colophon -->
</div><!-- #page -->
<?php wp_footer(); ?>
</body>
</html>
Uwaga: Funkcje
wp_head()
iwp_footer()
są absolutnie niezbędne - wielu wtyczek i funkcji WordPress polega na tych hookach do dodawania skryptów, stylów i innych elementów.
Tworzenie szablonów dla różnych typów treści
WordPress używa różnych szablonów dla różnych typów treści. Oto najpopularniejsze z nich:
single.php - dla pojedynczych postów
<?php get_header(); ?>
<main id="primary" class="site-main">
<?php
while ( have_posts() ) :
the_post();
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
<div class="entry-meta">
<?php
printf(
esc_html__( 'Opublikowano %s', 'moj-motyw' ),
'<time datetime="' . esc_attr( get_the_date( 'c' ) ) . '">' . esc_html( get_the_date() ) . '</time>'
);
?>
</div><!-- .entry-meta -->
</header><!-- .entry-header -->
<?php if ( has_post_thumbnail() ) : ?>
<div class="post-thumbnail">
<?php the_post_thumbnail(); ?>
</div><!-- .post-thumbnail -->
<?php endif; ?>
<div class="entry-content">
<?php the_content(); ?>
</div><!-- .entry-content -->
<footer class="entry-footer">
<?php
// Wyświetl kategorie, tagi, itp.
$categories = get_the_category_list( esc_html__( ', ', 'moj-motyw' ) );
if ( $categories ) {
printf( '<span class="cat-links">' . esc_html__( 'Kategorie: %1$s', 'moj-motyw' ) . '</span>', $categories );
}
$tags = get_the_tag_list( '', esc_html_x( ', ', 'list item separator', 'moj-motyw' ) );
if ( $tags ) {
printf( '<span class="tags-links">' . esc_html__( 'Tagi: %1$s', 'moj-motyw' ) . '</span>', $tags );
}
?>
</footer><!-- .entry-footer -->
</article><!-- #post-<?php the_ID(); ?> -->
<?php
// Jeśli komentarze są włączone i jest co najmniej 1 komentarz, ładuj szablon komentarzy.
if ( comments_open() || get_comments_number() ) :
comments_template();
endif;
endwhile; // Koniec pętli.
?>
</main><!-- #main -->
<?php
get_sidebar();
get_footer();
page.php - dla stron statycznych
<?php get_header(); ?>
<main id="primary" class="site-main">
<?php
while ( have_posts() ) :
the_post();
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
</header><!-- .entry-header -->
<?php if ( has_post_thumbnail() ) : ?>
<div class="post-thumbnail">
<?php the_post_thumbnail(); ?>
</div><!-- .post-thumbnail -->
<?php endif; ?>
<div class="entry-content">
<?php the_content(); ?>
</div><!-- .entry-content -->
</article><!-- #post-<?php the_ID(); ?> -->
<?php
// Jeśli komentarze są włączone i jest co najmniej 1 komentarz, ładuj szablon komentarzy.
if ( comments_open() || get_comments_number() ) :
comments_template();
endif;
endwhile; // Koniec pętli.
?>
</main><!-- #main -->
<?php
get_sidebar();
get_footer();
✨ Pro Tip: Wiele części kodu powtarza się w różnych szablonach. Rozważ wyodrębnienie ich do katalogu template-parts/
i dołączanie za pomocą get_template_part()
.
🛠️ Konfiguracja functions.php
Plik functions.php
jest sercem funkcjonalności motywu WordPress. To miejsce, gdzie definiujesz specyficzne dla motywu funkcje, hooki i filtry.
Podstawowa struktura functions.php
<?php
/**
* Funkcje i definicje dla mojego motywu
*/
if ( ! defined( 'MOJ_MOTYW_VERSION' ) ) {
// Pamiętaj, aby zaktualizować tę wartość przy każdej większej zmianie w motywie
define( 'MOJ_MOTYW_VERSION', '1.0.0' );
}
/**
* Konfiguracja motywu i rejestracja wsparcia dla różnych funkcji WordPress.
*/
function moj_motyw_setup() {
/*
* Włączenie wsparcia dla tłumaczeń.
*/
load_theme_textdomain( 'moj-motyw', get_template_directory() . '/languages' );
/*
* Domyślne wsparcie dla funkcji WordPress
*/
add_theme_support( 'automatic-feed-links' );
add_theme_support( 'title-tag' );
add_theme_support( 'post-thumbnails' );
add_theme_support( 'html5', array(
'search-form',
'comment-form',
'comment-list',
'gallery',
'caption',
'style',
'script',
) );
add_theme_support( 'customize-selective-refresh-widgets' );
add_theme_support( 'custom-logo', array(
'height' => 250,
'width' => 250,
'flex-width' => true,
'flex-height' => true,
) );
/*
* Rejestracja menu
*/
register_nav_menus(
array(
'menu-1' => esc_html__( 'Menu główne', 'moj-motyw' ),
'footer-menu' => esc_html__( 'Menu w stopce', 'moj-motyw' ),
)
);
}
add_action( 'after_setup_theme', 'moj_motyw_setup' );
/**
* Rejestracja obszarów widgetów.
*/
function moj_motyw_widgets_init() {
register_sidebar(
array(
'name' => esc_html__( 'Pasek boczny', 'moj-motyw' ),
'id' => 'sidebar-1',
'description' => esc_html__( 'Dodaj widgety tutaj.', 'moj-motyw' ),
'before_widget' => '<section id="%1$s" class="widget %2$s">',
'after_widget' => '</section>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
)
);
}
add_action( 'widgets_init', 'moj_motyw_widgets_init' );
/**
* Dołączanie stylów i skryptów.
*/
function moj_motyw_scripts() {
wp_enqueue_style( 'moj-motyw-style', get_stylesheet_uri(), array(), MOJ_MOTYW_VERSION );
wp_enqueue_script( 'moj-motyw-navigation', get_template_directory_uri() . '/js/navigation.js', array(), MOJ_MOTYW_VERSION, true );
if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
wp_enqueue_script( 'comment-reply' );
}
}
add_action( 'wp_enqueue_scripts', 'moj_motyw_scripts' );
/**
* Implementacja Custom Header.
*/
require get_template_directory() . '/inc/custom-header.php';
/**
* Funkcje pomocnicze dla szablonów.
*/
require get_template_directory() . '/inc/template-functions.php';
/**
* Funkcje dla szablonów typu.
*/
require get_template_directory() . '/inc/template-tags.php';
Dodawanie wsparcia dla funkcji WordPress
Twój motyw powinien obsługiwać standardowe funkcje WordPress:
function moj_motyw_setup() {
// Dodaj wsparcie dla różnych funkcji WordPress
add_theme_support( 'automatic-feed-links' );
add_theme_support( 'title-tag' );
add_theme_support( 'post-thumbnails' );
add_theme_support( 'html5', array(
'search-form',
'comment-form',
'comment-list',
'gallery',
'caption',
) );
add_theme_support( 'customize-selective-refresh-widgets' );
add_theme_support( 'custom-logo' );
add_theme_support( 'custom-header' );
add_theme_support( 'custom-background' );
add_theme_support( 'responsive-embeds' );
add_theme_support( 'align-wide' );
add_theme_support( 'editor-styles' );
}
Rejestracja menu i obszarów widgetów
Rejestracja menu nawigacyjnych:
register_nav_menus(
array(
'primary' => esc_html__( 'Menu główne', 'moj-motyw' ),
'footer' => esc_html__( 'Menu w stopce', 'moj-motyw' ),
)
);
Rejestracja obszarów widgetów:
function moj_motyw_widgets_init() {
register_sidebar(
array(
'name' => esc_html__( 'Pasek boczny', 'moj-motyw' ),
'id' => 'sidebar-1',
'description' => esc_html__( 'Dodaj widgety tutaj.', 'moj-motyw' ),
'before_widget' => '<section id="%1$s" class="widget %2$s">',
'after_widget' => '</section>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
)
);
register_sidebar(
array(
'name' => esc_html__( 'Stopka', 'moj-motyw' ),
'id' => 'footer-1',
'description' => esc_html__( 'Widgety w stopce.', 'moj-motyw' ),
'before_widget' => '<div id="%1$s" class="widget %2$s">',
'after_widget' => '</div>',
'before_title' => '<h3 class="widget-title">',
'after_title' => '</h3>',
)
);
}
add_action( 'widgets_init', 'moj_motyw_widgets_init' );
✨ Pro Tip: Dziel plik functions.php
na mniejsze, tematyczne części i dołączaj je za pomocą require
. Dzięki temu łatwiej będzie utrzymać kod.
💄 Stylizacja i wygląd motywu
Style CSS to to, co nadaje Twojemu motywu unikalny wygląd i sprawia, że wyróżnia się spośród innych.
Organizacja plików CSS
Dobrą praktyką jest podział CSS na mniejsze, tematyczne pliki:
css/
├── base.css # Resetowanie stylów i podstawowe style
├── typography.css # Style typograficzne
├── layout.css # Układ strony
├── navigation.css # Style menu
├── forms.css # Style formularzy
├── comments.css # Style komentarzy
└── responsive.css # Media queries dla responsywności
W głównym pliku style.css
można następnie dołączyć te pliki lub, lepiej, załadować je przez functions.php
:
function moj_motyw_styles() {
wp_enqueue_style( 'moj-motyw-base', get_template_directory_uri() . '/css/base.css', array(), MOJ_MOTYW_VERSION );
wp_enqueue_style( 'moj-motyw-typography', get_template_directory_uri() . '/css/typography.css', array(), MOJ_MOTYW_VERSION );
wp_enqueue_style( 'moj-motyw-layout', get_template_directory_uri() . '/css/layout.css', array(), MOJ_MOTYW_VERSION );
wp_enqueue_style( 'moj-motyw-navigation', get_template_directory_uri() . '/css/navigation.css', array(), MOJ_MOTYW_VERSION );
wp_enqueue_style( 'moj-motyw-forms', get_template_directory_uri() . '/css/forms.css', array(), MOJ_MOTYW_VERSION );
wp_enqueue_style( 'moj-motyw-comments', get_template_directory_uri() . '/css/comments.css', array(), MOJ_MOTYW_VERSION );
wp_enqueue_style( 'moj-motyw-responsive', get_template_directory_uri() . '/css/responsive.css', array(), MOJ_MOTYW_VERSION );
}
add_action( 'wp_enqueue_scripts', 'moj_motyw_styles' );
Tworzenie responsywnego layoutu
Współczesne motywy WordPress muszą być responsywne, czyli dobrze wyglądać na wszystkich urządzeniach.
Oto przykładowy fragment CSS dla responsywnego layoutu:
/* Bazowy layout dla komputerów */
.site {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.site-content {
display: flex;
flex-wrap: wrap;
}
.site-main {
flex: 0 0 70%;
max-width: 70%;
padding-right: 30px;
}
.site-sidebar {
flex: 0 0 30%;
max-width: 30%;
}
/* Media queries dla tabletów */
@media (max-width: 768px) {
.site-main,
.site-sidebar {
flex: 0 0 100%;
max-width: 100%;
padding-right: 0;
}
.site-sidebar {
margin-top: 40px;
}
}
/* Media queries dla telefonów */
@media (max-width: 576px) {
.site {
padding: 0 10px;
}
}
Używanie preprocesorów CSS
Preprocessory CSS, takie jak Sass lub Less, mogą znacznie ułatwić pracę z CSS.
Jeśli chcesz użyć Sass, musisz skonfigurować środowisko do kompilacji:
- Zainstaluj Node.js i npm
- Utwórz plik
package.json
w katalogu motywu - Zainstaluj potrzebne paczki:
npm install sass autoprefixer postcss postcss-cli --save-dev
- Utwórz skrypt w
package.json
do kompilacji Sass:
"scripts": {
"compile:sass": "sass sass/main.scss css/style.css",
"watch:sass": "sass --watch sass/main.scss:css/style.css"
}
- Uruchom kompilację:
npm run compile:sass
lub w trybie watch:npm run watch:sass
🔄 Zaawansowane funkcje WordPress
Współczesne motywy WordPress powinny obsługiwać zaawansowane funkcje, które sprawiają, że strony są bardziej funkcjonalne i przyjazne dla użytkowników.
Obsługa Customizer API
Customizer API pozwala użytkownikom na modyfikowanie wyglądu strony z podglądem na żywo.
function moj_motyw_customize_register( $wp_customize ) {
// Dodaj sekcję
$wp_customize->add_section( 'moj_motyw_colors', array(
'title' => __( 'Kolory motywu', 'moj-motyw' ),
'priority' => 30,
) );
// Dodaj ustawienie
$wp_customize->add_setting( 'primary_color', array(
'default' => '#0073aa',
'sanitize_callback' => 'sanitize_hex_color',
) );
// Dodaj kontrolkę
$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'primary_color', array(
'label' => __( 'Kolor główny', 'moj-motyw' ),
'section' => 'moj_motyw_colors',
'settings' => 'primary_color',
) ) );
}
add_action( 'customize_register', 'moj_motyw_customize_register' );
// Dodaj dynamiczne style CSS do strony
function moj_motyw_customize_css() {
?>
<style type="text/css">
a {
color: <?php echo get_theme_mod( 'primary_color', '#0073aa' ); ?>;
}
.button, .btn, button {
background-color: <?php echo get_theme_mod( 'primary_color', '#0073aa' ); ?>;
}
</style>
<?php
}
add_action( 'wp_head', 'moj_motyw_customize_css' );
Dodawanie wsparcia dla Gutenberga
Blokowy edytor Gutenberg jest teraz standardem w WordPress, więc warto dodać dla niego wsparcie:
// Dodaj wsparcie dla szerokości bloku Gutenberg
add_theme_support( 'align-wide' );
// Dodaj wsparcie dla kolorów Gutenberg
add_theme_support( 'editor-color-palette', array(
array(
'name' => __( 'Główny kolor', 'moj-motyw' ),
'slug' => 'primary',
'color' => '#0073aa',
),
array(
'name' => __( 'Kolor dodatkowy', 'moj-motyw' ),
'slug' => 'secondary',
'color' => '#23282d',
),
) );
// Dodaj wsparcie dla rozmiaru czcionki w Gutenbergu
add_theme_support( 'editor-font-sizes', array(
array(
'name' => __( 'Mały', 'moj-motyw' ),
'slug' => 'small',
'size' => 12,
),
array(
'name' => __( 'Normalny', 'moj-motyw' ),
'slug' => 'normal',
'size' => 16,
),
array(
'name' => __( 'Duży', 'moj-motyw' ),
'slug' => 'large',
'size' => 24,
),
) );
// Dodaj style edytora Gutenberg
add_theme_support( 'editor-styles' );
add_editor_style( 'css/editor-style.css' );
Implementacja niestandardowych typów wpisów i taksonomii
Dla bardziej zaawansowanych stron możesz potrzebować niestandardowych typów wpisów i taksonomii:
// Rejestracja niestandardowego typu wpisu "Projekty"
function moj_motyw_register_post_types() {
$labels = array(
'name' => _x( 'Projekty', 'post type general name', 'moj-motyw' ),
'singular_name' => _x( 'Projekt', 'post type singular name', 'moj-motyw' ),
'menu_name' => _x( 'Projekty', 'admin menu', 'moj-motyw' ),
'name_admin_bar' => _x( 'Projekt', 'add new on admin bar', 'moj-motyw' ),
'add_new' => _x( 'Dodaj nowy', 'projekt', 'moj-motyw' ),
'add_new_item' => __( 'Dodaj nowy projekt', 'moj-motyw' ),
'new_item' => __( 'Nowy projekt', 'moj-motyw' ),
'edit_item' => __( 'Edytuj projekt', 'moj-motyw' ),
'view_item' => __( 'Zobacz projekt', 'moj-motyw' ),
'all_items' => __( 'Wszystkie projekty', 'moj-motyw' ),
'search_items' => __( 'Szukaj projektów', 'moj-motyw' ),
'parent_item_colon' => __( 'Nadrzędny projekt:', 'moj-motyw' ),
'not_found' => __( 'Nie znaleziono projektów.', 'moj-motyw' ),
'not_found_in_trash' => __( 'Nie znaleziono projektów w koszu.', 'moj-motyw' )
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'projekty' ),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ),
'show_in_rest' => true,
);
register_post_type( 'projekt', $args );
}
add_action( 'init', 'moj_motyw_register_post_types' );
// Rejestracja niestandardowej taksonomii "Kategorie projektów"
function moj_motyw_register_taxonomies() {
$labels = array(
'name' => _x( 'Kategorie projektów', 'taxonomy general name', 'moj-motyw' ),
'singular_name' => _x( 'Kategoria projektu', 'taxonomy singular name', 'moj-motyw' ),
'search_items' => __( 'Szukaj kategorii projektów', 'moj-motyw' ),
'all_items' => __( 'Wszystkie kategorie projektów', 'moj-motyw' ),
'parent_item' => __( 'Nadrzędna kategoria projektu', 'moj-motyw' ),
'parent_item_colon' => __( 'Nadrzędna kategoria projektu:', 'moj-motyw' ),
'edit_item' => __( 'Edytuj kategorię projektu', 'moj-motyw' ),
'update_item' => __( 'Aktualizuj kategorię projektu', 'moj-motyw' ),
'add_new_item' => __( 'Dodaj nową kategorię projektu', 'moj-motyw' ),
'new_item_name' => __( 'Nazwa nowej kategorii projektu', 'moj-motyw' ),
'menu_name' => __( 'Kategorie projektów', 'moj-motyw' ),
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'kategoria-projektu' ),
'show_in_rest' => true,
);
register_taxonomy( 'kategoria-projektu', array( 'projekt' ), $args );
}
add_action( 'init', 'moj_motyw_register_taxonomies' );
👶 Tworzenie motywu potomnego (Child Theme)
Motyw potomny to idealny sposób na modyfikowanie istniejącego motywu bez ingerencji w jego kod źródłowy.
Kiedy warto użyć motywu potomnego?
Motyw potomny jest przydatny, gdy:
- Chcesz dostosować istniejący motyw, ale nie chcesz tracić aktualizacji
- Planujesz niewielkie zmiany w wyglądzie lub funkcjonalności
- Uczysz się tworzenia motywów WordPress i chcesz zacząć od modyfikacji istniejącego
Struktura motywu potomnego
Minimalna struktura motywu potomnego to:
nazwa-motywu-child/
├── style.css # Metadane motywu i style CSS
└── functions.php # Funkcje specyficzne dla motywu potomnego
Konfiguracja style.css w motywie potomnym
/*
Theme Name: Mój Motyw Child
Theme URI: https://przyklad.pl/moj-motyw-child/
Description: Motyw potomny dla Mój Motyw
Author: Twoje Imię
Author URI: https://przyklad.pl/
Template: moj-motyw # Nazwa katalogu motywu nadrzędnego
Version: 1.0.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: moj-motyw-child
*/
/* Tutaj dodaj niestandardowe style CSS */
Konfiguracja functions.php w motywie potomnym
<?php
/**
* Funkcje motywu potomnego
*/
// Ładowanie stylów motywu nadrzędnego i potomnego
function moj_motyw_child_enqueue_styles() {
$parent_style = 'moj-motyw-style'; // Identyfikator stylu motywu nadrzędnego
wp_enqueue_style( $parent_style, get_template_directory_uri() . '/style.css' );
wp_enqueue_style( 'moj-motyw-child-style',
get_stylesheet_uri(),
array( $parent_style ),
wp_get_theme()->get('Version')
);
}
add_action( 'wp_enqueue_scripts', 'moj_motyw_child_enqueue_styles' );
// Tutaj możesz dodać dodatkowe funkcje lub nadpisać funkcje motywu nadrzędnego
✨ Pro Tip: W motywie potomnym możesz nadpisać dowolny plik szablonu z motywu nadrzędnego, tworząc plik o tej samej nazwie w motywie potomnym. WordPress automatycznie użyje wersji z motywu potomnego.
📦 Przygotowanie motywu do dystrybucji
Jeśli planujesz udostępnić swój motyw innym lub opublikować go w katalogu motywów WordPress, musisz odpowiednio go przygotować.
Lista kontrolna przed dystrybucją
Oto kluczowe rzeczy do sprawdzenia przed udostępnieniem motywu:
-
Zgodność z standardami WordPress:
- Używaj prefixów specyficznych dla motywu dla funkcji i zmiennych
- Stosuj kodowanie znaków UTF-8 bez BOM
- Używaj znormalizowanych końcówek linii (LF)
-
Bezpieczeństwo:
- Waliduj, sanityzuj i escapuj wszystkie dane wejściowe/wyjściowe
- Używaj nonce dla formularzy
- Sprawdzaj uprawnienia użytkowników przed wykonaniem działań
-
Dostępność:
- Zapewnij odpowiedni kontrast kolorów
- Używaj semantycznego HTML
- Dodaj atrybuty ARIA gdzie to konieczne
-
Internacjonalizacja (i18n):
- Wszystkie ciągi tekstowe powinny być przetłumaczalne
- Użyj funkcji
__()
,_e()
,esc_html__()
,esc_html_e()
itd. - Dodaj domenę tekstową do wszystkich funkcji tłumaczeniowych
-
Dokumentacja:
- Dodaj komentarze do kodu
- Utwórz plik README.md
- Dodaj dokumentację dla użytkowników końcowych
Tworzenie plików tłumaczeń
Aby motyw był gotowy do tłumaczenia:
- Użyj narzędzia takiego jak Poedit lub WP-CLI do wygenerowania pliku POT
- Utwórz katalog
languages
w swoim motywie - Umieść tam plik POT i ewentualne tłumaczenia (pliki PO i MO)
Przykład użycia WP-CLI do wygenerowania pliku POT:
wp i18n make-pot . languages/moj-motyw.pot --domain=moj-motyw
Walidacja motywu
Przed udostępnieniem motywu warto zwalidować go za pomocą narzędzi:
- Theme Check Plugin - wtyczka, która sprawdza zgodność motywu z wymaganiami katalogu motywów WordPress
- W3C Validator - sprawdza poprawność kodu HTML
- CSS Validator - sprawdza poprawność CSS
🏁 Podsumowanie - Gotowy na Sukces?
Tworzenie własnego motywu WordPress może wydawać się złożonym zadaniem, ale krok po kroku możesz stworzyć profesjonalny i funkcjonalny motyw, który będzie idealnie odpowiadał Twoim potrzebom. W tym przewodniku omówiliśmy:
- Przygotowanie środowiska deweloperskiego - niezbędne narzędzia i konfigurację
- Strukturę motywu WordPress - organizację plików i katalogów
- Tworzenie podstawowych szablonów - dla różnych typów treści
- Konfigurację functions.php - dodawanie funkcjonalności do motywu
- Stylizację i responsywność - tworzenie atrakcyjnego i funkcjonalnego wyglądu
- Zaawansowane funkcje WordPress - Customizer API, Gutenberg, niestandardowe typy wpisów
- Tworzenie motywu potomnego - dla modyfikacji istniejących motywów
- Przygotowanie motywu do dystrybucji - najlepsze praktyki i finalne sprawdzenie
Pamiętaj, że tworzenie motywu to proces, który wymaga czasu i praktyki. Nie bój się eksperymentować i ucz się na błędach. Z każdym kolejnym projektem Twoje umiejętności będą się rozwijać, a proces stawać się bardziej intuicyjny.
🚀 Potrzebujesz profesjonalnego hostingu dla swojej strony WordPress?
Sprawdź ofertę hostingu WordPress w IQHost
Z hostingiem WordPress w IQHost zyskujesz nie tylko szybkie serwery zoptymalizowane pod WordPress, ale także automatyczne kopie zapasowe, darmowe certyfikaty SSL i profesjonalne wsparcie techniczne 24/7!
Czy ten artykuł był pomocny?
Twoja strona WordPress działa wolno?
Sprawdź nasz hosting WordPress z ultraszybkimi dyskami NVMe i konfiguracją serwera zoptymalizowaną pod kątem wydajności. Doświadcz różnicy już dziś!
Sprawdź ofertę hostingu