Praca z szablonami w WordPressie to coś, co nie jest rzadkością. Wszystko jest swego rodzaju szablonem – od szablonu strony głównej, szablonu pojedynczej strony, szablonu 404 – aż do szablonów niestandardowych.
Czasami jednak możesz chcieć zastosować klasę do bodyelementu opartą na szablonie, który jest używany, aby móc stylizować ten konkretny szablon nieco inaczej niż reszta witryny.
Chociaż możesz to zrobić na wiele różnych sposobów, wszyscy mamy na to swoje metody, więc pomyślałem, że podzielę się swoimi.
Klasa ciała oparta na szablonie
Przed przejściem do kodu dodawania klasy treści opartej na szablonie należy zauważyć, że zakładam, że szablon ma nazwę w następującym formacie: template-{name-of-template}.php.
Załóżmy, że pracujesz nad szablonem do wyświetlania informacji o wadze, którą schudłeś w ciągu miesiąca i chcesz to zrobić, używając do tego szablonu. Szablon może mieć nazwę template-weight-loss.php.
Oto rzecz: zastosowanie nazwy klasy do pojedynczej strony korzystającej z tego szablonu nie jest wielkim problemem. Ale jeśli masz wiele stron, które używają tego szablonu (co, jeśli prowadzisz witrynę, w której wiele osób może korzystać z tego szablonu, ma to sens, prawda?), wtedy będziesz chciał się upewnić, że stosujesz nazwę klasy do każdej strony, która jako ten szablon.
Ale jak?
Można to zrobić na kilka sposobów, ale wymaga to co najmniej następujących czynności:
- Podłączanie do haka body_class zapewnia WordPress,
- Odczytanie nazwy szablonu,
- Zastosowanie go do nazwy klasy treści (jeśli strona korzysta z szablonu)
Na szczęście jest to łatwe, ponieważ przechwycenie przekazuje tablicę klas do przechwyconej funkcji, a metadane danego posta zawierają informację, czy używa on szablonu.
Powiedziawszy to, oto jak można to osiągnąć:
<?php
add_filter('body_class', 'acme_add_body_class');
/**
* If the current page has a template, apply it's name to the list of classes. This is
* necessary if there are multiple pages with the same template and you want to apply the
* name of the template to the class of the body.
*
* @param array $classes The current array of attributes to be applied to the
*/
function acme_add_body_class($classes)
{
if (!empty(get_post_meta(get_the_ID(), '_wp_page_template', true))) {
// Remove the `template-` prefix and get the name of the template without the file extension.
$templateName = basename(get_page_template_slug(get_the_ID()));
$templateName = str_ireplace('template-', '', basename(get_page_template_slug(get_the_ID()), '.php'));
$classes[] = $templateName;
}
return array_filter($classes);
}
Zauważ, że możesz użyć do tego zamknięcia zamiast nazwy funkcji i niezależnej funkcji, ale biorąc pod uwagę, że różne osoby czytające to używają różnych wersji PHP, najłatwiejszym sposobem zademonstrowania tego jest użycie tego powyżej.
Czemu to robić?
Ogólnie rzecz biorąc, jeśli Twoja strona ma taką samą nazwę jak szablon, który jest stosowany, to będzie miała nazwę klasy, która odpowiada nazwie strony.
To znaczy, załóżmy, że masz jedną stronę, a jej nazwa to Odchudzanie. Element bodybędzie miał weight lossklasę. Ale jeśli użyjesz drugiej, trzeciej, czwartej lub czegoś podobnego na stronie o innym tytule, nie będzie ona miała tej klasy.
Jeśli chcesz się upewnić, że bodyma nazwę klasy opartą na szablonie, powyższy kod zapewni, że to zadziała.