sd shadow-docs
GitHub
shadow-docs / WordPress / Tēmas uzstādīšana

Tēmas uzstādīšana un resursi

Katra WordPress tēma sākas ar trim lietām: pasaki WordPress, kādas funkcijas tēma atbalsta, ielādē CSS/JS pareizajā brīdī, un — ja nepieciešams — reģistrē savas lapas veidnes. Zemāk ir reāls piemērs no tēmas Atvērt Savu Gaismu.

1. Tēmas atbalsta pieteikšana ar after_setup_theme

Hook after_setup_theme izpildās pēc tam, kad tēma ir ielādēta, bet pirms lielākās daļas citu hooku. Tas ir pareizais brīdis, kur pieteikt funkcionalitāti (add_theme_support) un reģistrēt navigācijas izvēlnes.

function asg_theme_setup() {
	// Pieteiktās funkcijas
	add_theme_support( 'title-tag' );              // WordPress pats renderē <title>
	add_theme_support( 'post-thumbnails' );         // Attēlu (thumbnail) atbalsts
	add_theme_support( 'custom-logo' );             // Logo caur Customizer
	add_theme_support( 'html5', array(
		'search-form',
		'comment-form',
		'comment-list',
		'gallery',
		'caption',
	) );
	add_theme_support( 'customize-selective-refresh-widgets' );
	add_theme_support( 'responsive-embeds' );
	add_theme_support( 'align-wide' );

	// Navigācijas izvēlnes — parādīsies Izskats → Izvēlnes
	register_nav_menus( array(
		'primary' => __( 'Primārā izvēlne', 'atvert-savu-gaismu' ),
		'footer'  => __( 'Kājene', 'atvert-savu-gaismu' ),
	) );

	// Tulkojumu fails no /languages
	load_theme_textdomain( 'atvert-savu-gaismu', get_template_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'asg_theme_setup' );
Kāpēc after_setup_theme, nevis tieši theme galvenē?
Ja add_theme_support() izpildās pārāk vēlu (piem. init), daži WordPress core mehānismi (piem. post thumbnails reģistrācija) to var vienkārši ignorēt. after_setup_theme ir uzticamākā vieta.

2. Stilu un skriptu ielāde ar wp_enqueue_scripts

Nekad nevajag rakstīt <link> vai <script> tieši header.php failā — WordPress paredz wp_enqueue_style() / wp_enqueue_script(), kas pareizi pārvalda versijas, atkarības un secību.

function asg_scripts() {
	// Ārējie fonti un ikonas
	wp_enqueue_style(
		'google-fonts',
		'https://fonts.googleapis.com/css2?family=Racing+Sans+One&display=swap',
		array(),
		null
	);
	wp_enqueue_style( 'font-awesome', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css', array(), '6.5.1' );

	// Tēmas pašas stilu datnes — versija no theme header, lai pārlūks
	// zina, kad kešs jāatjauno pēc katras izlaiduma
	wp_enqueue_style( 'asg-style', get_stylesheet_uri(), array(), wp_get_theme()->get( 'Version' ) );
	wp_enqueue_style( 'asg-custom', get_template_directory_uri() . '/assets/css/styles.css', array(), wp_get_theme()->get( 'Version' ) );

	// jQuery kā atkarība — WordPress to jau reģistrē ('jquery' handle)
	wp_enqueue_script(
		'asg-scripts',
		get_template_directory_uri() . '/assets/js/scripts.js',
		array( 'jquery' ),
		wp_get_theme()->get( 'Version' ),
		true // ielādēt footer, nevis head
	);

	// Nodod PHP datus uz JS pusi (URL, nonce) — sk. AJAX lapu
	wp_localize_script( 'asg-scripts', 'asgData', array(
		'ajaxUrl'  => admin_url( 'admin-ajax.php' ),
		'nonce'    => wp_create_nonce( 'asg_nonce' ),
		'themeUri' => get_template_directory_uri(),
	) );
}
add_action( 'wp_enqueue_scripts', 'asg_scripts' );
Padoms — kešbastošana ar filemtime()
Tēmas versijas numurs (wp_get_theme()->get('Version')) mainās reti — labi ilgtermiņa kešam, bet slikti, kad testē izmaiņas lokāli. Šai tēmai karuseļa CSS izmanto filemtime() tā vietā — versijas numurs mainās katru reizi, kad fails tiek saglabāts:
wp_enqueue_style(
	'asg-carousel',
	get_template_directory_uri() . '/assets/css/carousel.css',
	array(),
	filemtime( get_template_directory() . '/assets/css/carousel.css' )
);

3. Custom page templates reģistrācija

WordPress parasti atrod veidnes ar komentāru Template Name: faila augšā, bet apakšmapēs (page-templates/) tas ne vienmēr notiek automātiski visās vidēs. Filtrs theme_page_templates liek tām parādīties Lapas redaktora "Veidne" izvēlnē droši:

function asg_add_page_templates( $templates ) {
	$custom_templates = array(
		'page-templates/page-template-par-mums.php' => __( 'Par Mums Template', 'atvert-savu-gaismu' ),
		'page-templates/page-template-maratoni.php' => __( 'Maratoni Template', 'atvert-savu-gaismu' ),
	);
	return array_merge( $templates, $custom_templates );
}
add_filter( 'theme_page_templates', 'asg_add_page_templates' );
Uzmanies — atslēgas ceļš ir relatīvs pret tēmas mapi
Atslēga 'page-templates/page-template-par-mums.php' ir ceļš no tēmas saknes, ne no functions.php atrašanās vietas. Ja fails atrodas citur, veidne redaktorā parādīsies, bet izvēloties to izmest baltu ekrānu (fails netiks atrasts).

Pilns, palaižams piemērs

Zemāk esošais fails ir pašpietiekams — ielīmē to jaunas tēmas functions.php failā, un tas strādās (pieņemot, ka assets/css/styles.css un assets/js/scripts.js eksistē tēmas mapē):

<?php
if ( ! defined( 'ABSPATH' ) ) exit;

function asg_theme_setup() {
	add_theme_support( 'title-tag' );
	add_theme_support( 'post-thumbnails' );
	add_theme_support( 'custom-logo' );
	register_nav_menus( array(
		'primary' => __( 'Primārā izvēlne', 'my-theme' ),
	) );
}
add_action( 'after_setup_theme', 'asg_theme_setup' );

function asg_scripts() {
	wp_enqueue_style( 'my-style', get_stylesheet_uri(), array(), '1.0.0' );
	wp_enqueue_script(
		'my-scripts',
		get_template_directory_uri() . '/assets/js/scripts.js',
		array( 'jquery' ),
		'1.0.0',
		true
	);
	wp_localize_script( 'my-scripts', 'myData', array(
		'ajaxUrl' => admin_url( 'admin-ajax.php' ),
		'nonce'   => wp_create_nonce( 'my_nonce' ),
	) );
}
add_action( 'wp_enqueue_scripts', 'asg_scripts' );