Pokażę ci konkretnie, jak rejestruję shortcodes bezpośrednio w motywie, dostarczam je bezpiecznie i renderuję we właściwych miejscach - w ten sposób buduję szablon. motyw wordpress shortcode z przejrzystą strukturą, czystym kodem i szybkim czasem ładowania. Zapewniam praktyczne przykłady, wyjaśniam do_shortcode w szablonie, omawiam atrybuty, escaping i buforowanie oraz dodaję najlepsze praktyki dla długoterminowych, łatwych w utrzymaniu motywów.
Punkty centralne
- Rejestracja poprzez funkcje add_shortcode i clear callback
- Integracja w edytorze, widżetach i szablonach z do_shortcode
- Bezpieczeństwo poprzez escaping, atrybuty i walidację
- Konserwacja z motywem potomnym, dokumentacją i kontrolą wersji
- Wydajność z buforowaniem, ekonomicznymi zapytaniami i unieważnianiem pamięci podręcznej
Shortcodes w motywie: rejestracja i struktura
Umieszczam rejestrację w motywie w sekcji functions.php lub w małym pluginie, jeśli chcę oddzielić funkcjonalność od layoutu. Każda funkcja zwrotna zwraca ciąg znaków i nie używa echa, w przeciwnym razie dane wyjściowe trafiają w nieoczekiwane miejsca. Wybieram unikalne prefiksy dla nazewnictwa, aby uniknąć konfliktów z wtyczkami. W ten sposób utrzymuję czytelność kodu i tworzę przejrzystą kolejność, na przykład /inc/shortcodes.php z docelowym require_once w functions.php. Na początek wystarczy prosty shortcode powitalny, który później krok po kroku rozbudowuję.
<?php
// /wp-content/themes/my-theme/functions.php
require_once get_template_directory() . '/inc/shortcodes.php';
<?php
// /wp-content/themes/my-theme/inc/shortcodes.php
function my_greeting_shortcode() {
return 'Witaj na mojej stronie!
}
add_shortcode('greeting', 'my_greeting_shortcode');
Użyj shortcodes w szablonie: do_shortcode
Wywołuję shortcodes w szablonie za pomocą do_shortcode gdy integruję zawartość z nagłówkami, stopkami lub specjalnymi szablonami. Dzięki temu edytor jest przejrzysty, a powtarzające się moduły znajdują się w centralnej lokalizacji. Wywołania szablonów dokumentuję w kodzie krótkim komentarzem, aby inni od razu wiedzieli, który shortcode jest tutaj uruchamiany. W przypadku parametrów dynamicznych tworzę ciąg shortcode w PHP i bezpiecznie przekazuję wartości. Ta metoda działa w każdym pliku szablonu, takim jak header.php, footer.php lub page-templates.
<?php
// W pliku szablonu
echo do_shortcode('[powitanie]');
echo do_shortcode('[colorbox color="green"]Ładny tekst[/colorbox]');
Atrybuty, zawartość i bezpieczeństwo
Ustawiam atrybuty za pomocą shortcode_atts i chronić wartości za pomocą esc_html, esc_attr i esc_url. Zapobiega to XSS i zapewnia prawidłowy HTML we wszystkich danych wyjściowych. Opcjonalnie traktuję zawartość zawartą w shortcode za pomocą wp_kses, jeśli chcę zezwolić tylko na określone tagi. W przypadku kolorów akceptuję tylko wartości z białej listy lub sprawdzam za pomocą wyrażenia regularnego, aby żadne skrypty się nie prześlizgnęły. Dzięki tym regułom shortcodes pozostają niezawodne i zapewniają przewidywalne wyniki.
<?php
function my_colorbox_shortcode($atts, $content = null) {
$atts = shortcode_atts([
'color' => 'blue',
], $atts, 'colorbox');
$color = preg_match('/^#?[0-9a-fA-F]{3,6}$/', $atts['color']) ? $atts['color'] : 'blue';
$inner = wp_kses($content, ['strong' => [], 'em' => [], 'a' => ['href' => []]]);
$style = 'background:' . esc_attr($color) . ';padding:10px';
return '<div style="' . $style . '">' . $inner . '</div>';
}
add_shortcode('colorbox', 'my_colorbox_shortcode');
Praktyczne przykłady: bieżący rok, przycisk i daty
Używam małych pomocniczych shortcodes dla powtarzających się treści, takich jak bieżąca Rokprzyciski lub listy z niestandardowych typów postów. Roczny shortcode oszczędza mi prac konserwacyjnych w stopce lub w blokach tekstowych. Wyposażam przyciski w tekst, adres URL i kolor, aby redaktorzy mogli pracować bez zmiany kodu. W przypadku danych wyjściowych z CPT ograniczam zapytanie i buforuje wyniki, aby strona pozostała szybka. Oto trzy krótkie fragmenty jako podstawa.
<?php
// Jahr
add_shortcode('current-year', function() {
return date('Y');
});
// Button
add_shortcode('button', function($atts) {
$atts = shortcode_atts([
'text' => 'kliknij teraz',
'url' => '#',
'color' => '#2d89ef',
], $atts, 'button');
$text = esc_html($atts['text']);
$url = esc_url($atts['url']);
$color = esc_attr($atts['color']);
return '<a href="/pl/' . $url . '/" style="background:' . $color . ';padding:8px 18px;color:#fff;border-radius:4px;text-decoration:none">' . $text . '</a>';
});
Motyw czy wtyczka? Wsparcie decyzji i migracja
Dołączam shortcodes w Temat jeśli wpływają na układ, a we wtyczce, jeśli chcę nadal używać ich niezależnie od motywu. W ten sposób nie tracę funkcji przy zmianie motywów i utrzymuję przejrzystą architekturę. Na potrzeby dokumentacji tworzę przegląd wszystkich skrótów z parametrami, aby redaktorzy mogli szybko znaleźć poprawną składnię. Podczas późniejszej przeprowadzki eksportuję pliki shortcode i ostrożnie zastępuję wymagane ścieżki. Poniższa tabela pomaga w podjęciu decyzji.
| Użycie | Temat | Plugin |
|---|---|---|
| Powiązanie z układem | Wysoki (np. Hero-Box) | Niski |
| Ryzyko migracji | Wyżej ze zmianą motywu | Niskizostaje zachowany |
| Konserwacja/aktualizacje | Wraz z wydaniem motywu | Własne wydanie, bardziej elastyczne |
| Grupa docelowa | Cechy układu | Zawartość/Funkcje |
Używanie skrótów w edytorze i edytorze bloków
Dodaję shortcodes w klasycznym edytorze bezpośrednio jako Tekst i użyj bloku shortcode w edytorze bloków. Takie rozdzielenie zapewnia przejrzystość treści i zmniejsza liczbę błędów podczas kopiowania. W przypadku edytorów dokumentuję przykłady bezpośrednio w zapleczu, na przykład jako przykładowy blok lub notatkę w szablonie. Zwracam uwagę na różnice między edytorami w odstępach i stylach inline, ponieważ bloki czasami dodają dodatkowe opakowania. Jeśli zastanawiasz się nad wyborem edytora, w porównaniu znajdziesz Edytor bloków vs classic pomocne wskazówki.
Wydajność: buforowanie i czyste zapytania
Utrzymuję szybkość shortcodes poprzez buforowanie części wymagających dużej mocy obliczeniowej i ograniczanie dostępu do danych, co zmniejsza Czas załadunku lowers. W przypadku powtarzających się problemów używam Transients lub WP Object Cache ze znaczącym kluczem. Ograniczam zapytania za pomocą posts_per_page, ustawiam tylko wymagane pola i unikam kosztownych operacji COUNT. Dodaję szerokość / wysokość i leniwe ładowanie do danych wyjściowych obrazu, aby strona była widoczna szybciej. W przypadku dynamicznych komponentów usuwam pamięć podręczną, gdy tylko zmieni się zawartość.
<?php
add_shortcode('latest-offers', function($atts) {
$key = 'sc_latest_offers_v1';
$html = wp_cache_get($key);
if ($html !== false) {
return $html;
}
$q = new WP_Query([
'post_type' => 'angebot',
'posts_per_page' => 5,
'no_found_rows' => true,
'fields' => 'all',
]);
ob_start();
if ($q->have_posts()) {
echo '<ul class="offers">';
while ($q->have_posts()) { $q->the_post();
echo '<li>' . esc_html(get_the_title()) . '</li>';
}
echo '</ul>';
wp_reset_postdata();
}
$html = ob_get_clean();
wp_cache_set($key, $html, '', 600);
return $html;
});
Szybkie znajdowanie i usuwanie źródeł błędów
Aktywuję Debugowanie-mode i sprawdzić, czy shortcode jest poprawnie zarejestrowany. Często biały ekran lub nieprzetworzony tekst wskazuje, że funkcja nie ładuje się lub używa echo zamiast return. Wpisy w dzienniku ujawniają nieoczekiwane typy danych, nieprawidłowe atrybuty lub brakujące ucieczki. W szablonach testuję krok po kroku: najpierw tekst statyczny, potem shortcode, potem parametry. Jeśli chcesz postępować systematycznie, skorzystaj z przewodnika po Tryb debugowania WordPress.
Bezpieczna aktualizacja z motywem potomnym
Tworzę własne shortcodes w Motyw dla dzieci jeśli nie mogę lub nie chcę zmieniać niczego w motywie nadrzędnym. W ten sposób dostosowania są zachowywane podczas aktualizacji motywu i mogę kontrolować sekwencję ładowania. Ważne: zarejestruj poprawnie motyw podrzędny, zachowaj functions.php i dołączaj tylko określone pliki. W przypadku projektów strukturalnych oddzielam shortcodes w /inc i dokumentuję je za pomocą komentarzy inline. Kompaktowy przewodnik jest dostarczany przez Instrukcje dotyczące motywu podrzędnego.
Stylizacja, semantyka i dostępność
Dbam o czystość HTML i znaczniki semantyczne, aby czytniki ekranu poprawnie rozpoznawały zawartość. Przyciski wyświetlam jako znacznik z role="button" tylko wtedy, gdy są one naprawdę linkami, w przeciwnym razie wybieram prawdziwe przyciski. Utrzymuję wysokie kontrasty kolorów i ustawiam style fokusu, aby użytkownicy klawiatury mogli wyraźnie zobaczyć, gdzie się znajdują. Ograniczam style inline i przenoszę projekt do pliku CSS z wyraźnymi klasami. Dzięki temu shortcodes są elastyczne i jednocześnie dostępne.
Integracja API i bezpieczna integracja danych zewnętrznych
Pobieram dane zewnętrzne poprzez wp_remote_get i buforować je, aby strona nie zawieszała się podczas limitów czasu API. Sprawdzam odpowiedzi pod kątem kodów statusu, analizuję JSON w kontrolowany sposób i zezwalam tylko na pola, które są naprawdę wymagane. W przypadku niepowodzenia wyświetlam odchudzone wyjście awaryjne lub ukrywam blok. W przypadku treści użytkownika usuwam niebezpieczne tagi i dokładnie weryfikuję linki. Dzięki temu shortcodes są stabilne, nawet jeśli usługi zewnętrzne ulegają wahaniom.
Ładuj zasoby tylko wtedy, gdy są używane
Ładuję CSS/JS dla shortcodes tylko wtedy, gdy faktycznie pojawiają się na stronie. Oszczędza to żądania i utrzymuje ścieżkę krytyczną CSS na niskim poziomie. Rejestruję style i skrypty centralnie i zapisuję je w wywołaniu zwrotnym lub specjalnie, gdy tylko rozpoznam shortcode w treści. Ważne: nigdy nie pisz twardego kodu w nagłówku bez zastanowienia, ale pracuj za pośrednictwem interfejsów API enqueue.
<?php // functions.php – rejestracja zasobów add_action('wp_enqueue_scripts', function() { wp_register_style('my-shortcodes', get_template_directory_uri() . '/assets/shortcodes.css', [], '1.0');
wp_register_script('my-shortcodes', get_template_directory_uri() . '/assets/shortcodes.js', [], '1.0', true); });
// Ładuj tylko, jeśli występuje w treści add_action('wp', function() { if (is_singular() && has_shortcode(get_post_field('post_content', get_queried_object_id()), 'button')) { wp_enqueue_style('my-shortcodes');
wp_enqueue_script('my-shortcodes'); } }); // Alternatywnie wywołać bezpośrednio w wywołaniu zwrotnym skrótu: function my_assets_example_shortcode($atts, $content = null) { wp_enqueue_style('my-shortcodes'); return '<div class="my-box">' . wp_kses_post($content) . '</div>';
}
add_shortcode('my-box', 'my_assets_example_shortcode');
Shortcodes vs. bezpośrednie wywołania funkcji w szablonie
Dokonuję świadomego rozróżnienia: w przypadku stałych modułów szablonów wolę wywoływać funkcję bezpośrednio zamiast analizować shortcode. Oszczędza to koszty ogólne, zwiększa czytelność i pozwala uniknąć zaskakujących efektów filtrowania. Shortcody są przeznaczone dla treści redakcyjnych; szablony korzystają z jasnych wywołań funkcji z jasnymi parametrami.
<?php
// Zamiast:
echo do_shortcode('[greeting]');
// Lepiej w szablonie:
echo my_greeting_shortcode();
Zagnieżdżone skróty i formatowanie
Biorę pod uwagę zagnieżdżone shortcodes i automatyczne wstawianie tagów p i br. Jeśli shortcodes zawierają inną zawartość, nadal renderuję wewnętrzną zawartość za pomocą do_shortcode, ale zezwalam tylko na dozwolone znaczniki. Usuwam nieestetyczne znaczniki p wokół shortcodes za pomocą shortcode_unautop, jeśli w przeciwnym razie znaczniki zostałyby rozdarte.
<?php function my_wrap_shortcode($atts, $content = null) { $inner = do_shortcode($content); // zezwalaj na zagnieżdżone skróty return '<div class="wrap">' . wp_kses_post($inner) . '</div>';
}
add_shortcode('wrap', 'my_wrap_shortcode');
// Opcjonalna pomoc dotycząca formatowania
add_filter('the_content', 'shortcode_unautop');
Internacjonalizacja i lokalizacja
Utrzymuję shortcodes z obsługą języków: tłumaczę ciągi tekstowe za pomocą domeny tekstowej motywu i używam date_i18n dla dat. W ten sposób moduły działają w środowiskach wielojęzycznych i pozostają spójne podczas przełączania języków. Lokalizuję domyślne teksty bezpośrednio w wywołaniach zwrotnych shortcode i unikam ich w zależności od kontekstu.
<?php
// Motyw przygotowany do tłumaczenia
add_action('after_setup_theme', function() {
load_theme_textdomain('my-theme', get_template_directory() . '/languages');
});
// Zlokalizowane powitanie
function my_greeting_shortcode() {
return esc_html__('Witaj na mojej stronie!', 'my-theme');
}
// Zlokalizowany rok
add_shortcode('current-year', function() {
return esc_html(date_i18n('Y'));
});
Unieważnianie pamięci podręcznej, warianty i klucze
Planuję cache w taki sposób, aby warianty były czysto oddzielone, a zawartość stawała się nieaktualna natychmiast po wprowadzeniu zmian. Atrybuty takie jak limit lub taksonomia są zawarte w kluczu. Zapisując odpowiednie typy postów, specjalnie usuwam odpowiednie klucze. W konfiguracjach o dużym natężeniu ruchu polegam na trwałym backendzie pamięci podręcznej obiektów i grupuję klucze według funkcji, aby móc je zbiorczo opróżnić.
<?php
add_shortcode('latest-offers', function($atts) {
$atts = shortcode_atts(['limit' => 5], $atts, 'latest-offers');
$limit = max(1, (int) $atts['limit']);
$key = 'sc_latest_offers_v1_' . $limit;
if (($html = wp_cache_get($key, 'mytheme')) !== false) {
return $html;
}
$q = new WP_Query([
'post_type' => 'angebot',
'posts_per_page' => $limit,
'no_found_rows' => true,
]);
ob_start();
if ($q->have_posts()) {
echo '<ul class="offers">';
while ($q->have_posts()) { $q->the_post();
echo '<li>' . esc_html(get_the_title()) . '</li>';
}
echo '</ul>';
wp_reset_postdata();
}
$html = ob_get_clean();
wp_cache_set($key, $html, 'mytheme', 600);
return $html;
});
// Cache invalidieren, wenn Angebote geändert werden
add_action('save_post_angebot', function() {
foreach ([1,5,10] as $limit) {
wp_cache_delete('sc_latest_offers_v1_' . $limit, 'mytheme');
}
});
Pogłębione bezpieczeństwo: sanityzator, dozwolone atrybuty i rel/target
Rozszerzam shortcodes o rozsądne, ale bezpieczne opcje. W przypadku linków ograniczam cel do _self/_blank i ustawiam rel="noopener noreferrer" dla nowych kart. Sprawdzam kolory za pomocą sanitize_hex_color. Treści traktuję kontekstowo, dla zamkniętych treści wybieram wp_kses_post lub bardziej restrykcyjną allowlist.
<?php
add_shortcode('button', function($atts, $content = null) {
$atts = shortcode_atts([
'text' => '',
'url' => '#',
'color' => '#2d89ef',
'target' => '_self',
], $atts, 'button');
$text = $atts['text'] !== '' ? $atts['text'] : ($content ?: esc_html__('Kliknij teraz', 'my-theme'));
$text = esc_html($text);
$url = esc_url($atts['url']);
$color = sanitise_hex_color($atts['color']) ?: '#2d89ef';
$target = in_array($atts['target'], ['_self','_blank'], true) ? $atts['target'] : '_self';
$rel = $target == '_blank' ? 'noopener noreferrer' : '';
$style = 'background:' . $colour . ';padding:8px 18px;color:#fff;border-radius:4px;text-decoration:none';
return '<a class="sc-button" href="/pl/' . $url . '/" style="' . esc_attr($style) . '" target="' . esc_attr($target) . '" rel="' . esc_attr($rel) . '">' . $text . '</a>';
});
Kontekst edytora, widżetu i kanału
Biorę pod uwagę kontekst, w którym działa shortcode. Wyraźnie zezwalam na shortcodes w klasycznych widżetach tekstowych i używam bloku shortcode w edytorze widżetów blokowych. W kanałach lub w wyszukiwaniu dezaktywuję szczególnie złożone shortcodes i zwracam puste. Ponadto ładuję zasoby na pojedynczych stronach tylko wtedy, gdy shortcode pojawia się w treści.
<?php
// Klasyczne widżety: aktywuj skróty
add_filter('widget_text', 'do_shortcode');
// Unikaj drogich danych wyjściowych w kanałach
add_shortcode('latest-offers-feed-safe', function($atts) {
if (is_feed()) {
return '';
}
// ... regularne wyjście
});
Deprecjacja, migracja do bloków i kompatybilność
Planuję przyszłość moich skrótów: Kiedy tag jest zastępowany, przekierowuję go na nowy na jakiś czas i ogłaszam zmianę w dzienniku zmian. Jeśli polegasz na edytorze bloków, możesz zarejestrować bloki po stronie serwera za pomocą render_callback i użyć wewnętrznie tej samej funkcji PHP co shortcode. W ten sposób obie ścieżki współistnieją czysto, dopóki shortcode nie wygaśnie.
'', 'url' => '#'], $atts, 'old-button');
$text = $map['text'] ?: $content;
return do_shortcode('[button text="" . esc_attr($text) . '" url="' . esc_url($map['url']) . '"]');
});
// Później: usuń całkowicie
// remove_shortcode('old-button');
Testy i zapewnienie jakości
Weryfikuję krytyczne shortcodes za pomocą testów jednostkowych, aby refaktoryzacja nie przyniosła żadnych niespodzianek. W testach sprawdzam, czy obowiązkowe atrybuty są zweryfikowane, wartości domyślne są ustawione, a dane wyjściowe są poprawnie escapowane. W przypadku wyjścia HTML wybieram solidne asercje (zawiera zamiast dokładnego dopasowania), aby małe zmiany formatowania nie zepsuły wszystkich testów. Testuję również przypadki brzegowe, takie jak pusta zawartość, nieprawidłowe kolory i bardzo długie teksty.
assertStringContainsString('Hi', $out);
$this->assertStringContainsString('href="#"', $out);
}
public function test_button_blocked_invalid_color() {
$out = do_shortcode('[button color="javascript:alert(1)"]');
$this->assertStringNotContainsString('javascript:', $out);
}
}
Na koniec: Mój kompaktowy przegląd praktyczny
Rejestruję skróty w przejrzysty sposób, dostarczam je bezpiecznie i przechowuję je z Buforowanie szybko. Do użytku redakcyjnego dokumentuję przykłady i zapewniam spójne parametry, aby każdy mógł z nich korzystać bez obaw. Moduły związane z układem trafiają do motywu, a funkcje związane z treścią do wtyczki, dzięki czemu witryna pozostaje elastyczna w dłuższej perspektywie. Dzięki motywowi potomnemu, dziennikom debugowania i czystej semantyce, rozwój i konserwacja pozostają zrelaksowane. Rezultatem jest motyw wordpress shortcode, który renderuje się niezawodnie, jest łatwy w utrzymaniu i daje zespołom ds. treści prawdziwą swobodę.


