Где находится голова сайта? Правильно, в header.php!
В 99,99% всех шаблонов header.php будет первым, вызываемым при загрузке любых типов страниц. Обычно он начинается с специфического кода, называемого DOCTYPE и HTML атрибуты. Не будем здесь давать подробную информацию о том, что это и зачем нужно, а также какой формат выбирать.
Наиболее типичным является такой вид:
<title> <?php if (function_exists('is_tag') && is_tag()) {single_tag_title('Тег "'); echo '" - ';} elseif (is_archive()) {wp_title(''); echo ' Архив - ';} elseif (is_search()) {echo 'Результат поиска для "'.wp_specialchars($s).'" - ';} elseif (!(is_404()) && (is_single()) || (is_page())) {wp_title(''); echo ' - ';} elseif (is_404()) {echo 'Ничего не найдено - ';} if (is_home()) {bloginfo('name'); echo ' - '; bloginfo('description');} else {bloginfo('name');} if ($paged > 1) { echo ' - страница '. $paged;} ?> </title>
Что мы получаем
Заголовки у разных типов страниц
Для каждого типа страниц будет свой заголовок, в который динамически подставляется название записи или страницы, поисковый запрос и дописывается название сайта. И это без каких-либо плагинов.
К примеру, плагин All-in-One SEO делает все это, и его стоит использовать только если не хватает навыков для самостоятельной коррекции и настройки вышеприведенного кода.
Блок ссылок
Секция <head> также содержит ссылки на внешние CSS и JavaScript файлы. Т.к. прежде всего ваш шаблон требует обязательного наличия своего собственного style.css, нужно его вызвать
<link rel='stylesheet' href='<?php bloginfo("stylesheet_uri"); ?>' type='text/css' media='screen' />
где bloginfo("stylesheet_url") является точной ссылкой на файл стилей вашего шаблона.
Ничего не нужно прописывать руками, удобно. И кстати, функция bloginfo() содержит массу полезной информации, к которой мы еще вернемся.
С другой стороны, использование яваскрипт файлов в вашем шаблоне немного сложнее, особенно, если делать это правильно. Если вы хотите подключить jQuery библиотеку для какого-либо скрипта, то не нужно вставлять ссылку в хедер. Эта библиотека уже включена в вордпресс, т.к.она очень полезна и популярна, и, например, используется в админке WordPress.
Поэтому, чтобы ее подключить в шаблон, достаточно вставить в хедер или functions.php
<?php wp_enqueue_script('jquery'); ?>
Такой вызов имеет массу преимуществ.
- Это легко, т.к. не требует контроля над местоположением библиотеки и ее версией.
- Это информативно, т.к. вордпресс будет знать, что требуемый файл успешно загружен.
Если же вы скачаете свою копию jQuery и вставите на нее ссылку в шаблоне, вордпресс даже знать об этом не будет. А если затем активируете плагин, который будет использовать j Query, он загрузит свою копию, что приведет к бардаку и достаточно часто к конфликтам. Использование wp_enqueue позволит избежать дублирования и конфликтов.
Но, если вы написали свой собственный скрипт и на 101% уверены, что он уникален и неповторим, то нет необходимости включать его в вордпресс. Его как раз можно загружать и вызывать стандартным способом
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/js/myscriptjs"></script>
Как видите, в данном примере мы использовали другой параметр функции bloginfo('template_url'), чтобы получить точный урл адрес расположения шаблона, в подпапке которого находится наш скрипт.
Давайте теперь продемонстрируем, как можно подключать специфический CSS код для определенного архива. Для этого используем логику вордпресс для определения типа загружаемой страницы
<?php if (is_page_template('page-archives.php')) { ?>
<link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/css/archives.css" type="text/css" media="screen" />
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/js/archives.js"></script>
<?php } ?>
Это работает так — если мы находимся на специальной странице архива, описываемой файлом шаблона page-archives.php, то подключить два файла. На всех остальных страницах эти файлы загружаться не будут.
А вот пример кода для страницы с определенным id равным 5
<?php if (is_page("5")) { ?>
<link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/css/archives.css" type="text/css" media="screen" />
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/js/archives.js"></script>
<?php } ?>
По непонятной причине id записей, страниц и рубрик явно не отображается в вордпрессе. Чтобы получить эти значения, например, id страницы, нужно навести курсор над ссылкой Изменить в списке страниц, и в панельке браузера увидим урл, содержащий id этой страницы, в данном примере — это 198. Точно также можно узнать id рубрики, записи, тега и т.п..
Разберемся с wp_head()
Обязательная для всех шаблонов функция wp_head() просто сообщает вордпрессу «вот прямо тут находится секция <head>, дальше ты уже знаешь, что нужно делать»
Это своего рода метка, по которой сам вордпресс, а также плагины и различные функции добавляют нужный код в хедер.
Например, вы активировали функционал XML-RPC в настройках. Для его работы необходимо добавить определенные <link> элементы в <head>. В результате работы функции wp_head() они будут вставлены в код.
Точно также в хеад будет вставлен код функции wp_enqueue_script, которая проанализирует требуемые скрипты и подключит только те, которые требуются. А плагины с ее помощью добавят нужные для работы яваскрипты и файлы стилей.
Теги шаблона
Есть одна функция, которая может быть в определенных случаях весьма полезна, это
<?php bloginfo(); ?>
Из нее можно получить много интересного, например, такие соответствующие данные:
admin_email = jeff@digwp.com
atom_url = https://digwp.com/home/feed/atom
charset = UTF-8
comments_atom_url = https://digwp.com/home/comments/feed/atom
comments_rss2_url = https://digwp.com/home/comments/feed
description = Take Your WordPress Skills to the Next Level!
url = https://digwp.com/home
html_type = text/html
language = en-US
name = Digging Into WordPress
pingback_url = https://example/home/wp/xmlrpc.php
rdf_url = https://digwp.com/home/feed/rdf
rss2_url = https://digwp.com/home/feed
rss_url = https://digwp.com/home/feed/rss
siteurl = https://digwp.com/home
stylesheet_directory = https://digwp.com/home/wp/wp-content/themes/largo
stylesheet_url = https://digwp.com/home/wp/wp-content/themes/largo/style.css
template_directory = https://digwp.com/home/wp/wp-content/themes/largo
template_url = https://digwp.com/home/wp/wp-content/themes/largo
text_direction = ltr
version = 2.8.5
wpurl = https://digwp.com/home/wp
Подставляя нужный аргумент, можно получить значение, например, bloginfo('template_url'); вернет ссылку на папку с шаблоном и используется вот так
<link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/css/archives.css" type="text/css" media="screen" />
Для чего это нужно? Для того, чтобы не прописывать в шаблоне абсолютные ссылки и жесткие параметры, что показывает гибкость шаблона при переносе с одного домена на другой, с сохранением функциональности.
Но, если стандартных параметров мало, можно использовать функционал произвольных полей. Это атрибуты, которые можно назначать к записям и страницам, а затем получать значения в любом месте шаблона. Кроме этого можно создать глобальные произвольные поля, которые можно использовать не только на страницах записей и страниц.
Например, вы хотите зарабатывать на партнерской программе с своей рефссылкой. Конечно, можно руками прописать аффилиатный код везде, где нужно, но что делать, если в один прекрасный день этот код нужно будет поменять?
Вставьте в functions.php следующий код (пример для Амазона)
<?php add_action('admin_menu', 'add_gcf_interface');
function add_gcf_interface() {
add_options_page('Global Custom Fields', 'Global Custom Fields', '8', 'functions',
'editglobalcustomfields');
}
function editglobalcustomfields() { ?>
<div class="wrap">
<h2>Global Custom Fields</h2>
<form method="post" action="options.php">
<?php wp_nonce_field('update-options') ?>
<p><strong>Amazon ID:</strong><br />
<input type="text" name="amazonid" size="45"
value="<?php echo get_option('amazonid'); ?>" />
</p>
<p><input type="submit" name="Submit" value="Update Options" /></p>
<input type="hidden" name="action" value="update" />
<input type="hidden" name="page_options" value="amazonid" />
</form>
</div>
<?php } ?>
Укажите и сохраните в настройках свой реф-айди с амазона.
Теперь, где угодно в шаблоне можно с помощью кода
<?php echo get_option('amazonid'); ?>
получить значение рефайди и вставить в партнерскую ссылку на товар.
Циклы в WordPress
Цикл, хорошо известный как петля(loop) — это базовое понятие того, как работает Вордпресс. В самом общем виде представить это можно так:
<?php // The Loop
if (have_posts()) : while (have_posts()) : the_post();
...
endwhile; else:
...
endif;
?>
Сначала проверяется, есть ли в наличии постызаписи для отображения. Если это так, то начинается цикл. Функция the_post() определяет действия, которые будут выполнены для
отображения записи. После того, как эта функция будет выполнена несколько раз (в зависимости от имеющихся в наличии записей или заданного количества для вывода), цикл завершится.
Пока что звучит несколько сумбурно, поэтому давайте рассмотрим более детально.
<?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <div dass="post" id="post-<?php the_ID(); ?>"> <h2><a href="<?php the_permalink(); ?>" rel-'bookmark" title-'Ссылка на <?php the_ title_attribute(); ?>"><?php the_title(); ?></a></h2> <?php echo get_post_meta($post->ID, 'PostThumb', true); ?> <p class="meta"> <?php the_content('Полная статья'); ?> <?php endwhile; ?> <?php else : ?> | Есть ли опубликованные записи? Начало цикла, работает пока есть записи Ссылка на запись Произвольное поле, содержащее id Мета-информация: дата публикации Содержимое записи Конец цикла Нет записей? |
Как видно, цикл — это хорошо приукрашенный цикл с логикой “while” (пока). Пока есть доступные записи в базе данных, подходящие под условия, вытаскивать и отображать эти записи. Но не совсем понятно, что вытаскивать и как долго, т.к. мы видим, что while (have_posts()) не содержит никаких параметров.
На самом деле цикл хорошо знает, что делать. Достаточно добавить эту строчку кода перед циклом
<?php global $query_string; echo $query_string; ?>
Если добавить эту строку в файл single.php, то увидем что-то типа такого
year=2011&monthnum=02&name=version-3-update
Что означает, что из базы данных взять и отобразить что-то, опубликованное в феврале 2011 года и называется Version 3 update.
А если добавить в archive.php и загрузить архив рубрики JavaScript, то увидим
posts_per_page=10&what_to_show=posts&orderby=date&order=DESC&category_name=javascript
Что означает, отобразить на одной странице 10 штук, отображать записи, отсортировать по дате в обратном порядке и выбрать рубрику javascript.
Заметим, что мы вручную ничего из этого не меняли и не указывали, а сам вордпресс, загружая различный тип страниц (в данном примере архив), формирует соответствующий запрос, чтобы цикл работал правильно и выдал то, что нужно.
В некоторых шаблонах содержимое цикла Loop выносится в отдельный файл, который вызывается в соответствующих местах. Сделано это для минимизации кода и для удобства правок, когда изменения в одном файле loop.php повлияют на все задействованные шаблоны.
Некоторые типичные функции цикла
Пока вы находитесь внутри цикла, у вас есть доступ к определенным функциям, недоступным в других местах шаблона. Эти функции привязаны к содержимому записей, поэтому за пределами цикла не будут работать корректно, т.к. станет не ясно — конкретно к какой записи их отнести.
Например <?php the_title(); ?> отображает заголовок записи. Помните, что мы внутри цикла, поэтому, если цикл будет выполнен 5 раз, то каждый раз будет отображен разный заголовок.
Вот некоторые популярные функции цикла
- the_permalink() — отображает ссылку на запись;
- the_ID() — отображает id записи;
- the_author() — отображает имя автора записи;
- the_category() — отображает категориюкатегории, к которым принадлежит запись.
Кроме этого внутри цикла есть доступ к наборам переменных, которые определяются после выполнения функции the_post(). Эти переменные существуют в объекте $post. Большая часть этой информации используется различными функциями, но мы тоже можем получить к ней доступ через запросы
- $post->ID — возвращает id записи;
- $post->post_content — возвращает содержимое записи;
- $post->post_modified — возвращает время созданияредактирования записи;
- $post->post_name — возвращает slug записи.
Нужно четко понимать разницу между функциями и переменными. Функции выводят данные на экран, переменные возвращают значения, которые мы можем использовать, изменять и только потом выводить.
Если вы знаете название переменной, вы можете в зависимости от ее типа вывести значение с помощью print_r(), var_dump() или get_defmed_vars().
Полный список функций можно получить тут
https://codex.wordpress.org/Справочник_по_функциям/get_post ,
а переменных тут
https://www.rlmseo.com/blog/wordpress-post-variable-quick-reference/
Но у цикла есть не только внутренние, но и внешние функции (работающие за пределами цикла). Они возвращают более глобальную и общую информацию и не связаны с конкретной записью.
Это лишь малая часть и приведены для демонстрации принципа работы функций в зависимости от того, где они находятся.
Комментарии
Комментарии — это, вероятно, одна из причин, по которой стоит использовать вордпресс. Это мощная система с огромным количеством возможностей. Более глубокое погружение в комментарии произойдет в последующих статьях, но, т.к. функционал комментариев — часть анатомии шаблона вордпресс, то познакомимся с ними уже сейчас.
Файл comments.php
В общем, вордпресс разложил по полочкам функционал комментирования в один файл, который отвечает за следующее:
- Вся необходимая логика для отображения комментариев;
- Отображение дополнительной информации;
- Отображение формы комментирования.
Чтобы выполнять все это, comments.php нуждается в комплексной системе логики. Работает она примерно так:
Защищена ли запись (требуется пароль)?
- Да — вывести предупреждение и остановиться
- Нет — продолжать
Есть ли какие-нибудь комментарии?
- Да — вывести комментарии и продолжать
- Нет — продолжать
Открыто ли комментирование?
- Да — продолжать
- Нет — вывести предупреждение и остановиться
Требуется ли регистрация?
- Да — вывести предупреждение и остановиться
- Нет — вывести форму комментариев
И это только базовая логика. Дополнительная логика используется в различных функциях для использования различных условий и настроек.
Например, форма комментариев отображается в виде по умолчанию или при наличии комментария, на который можно написать ответ
<?php comment_form_title('Оставить комментарий', 'Комментарий к %s'); ?>
Выборочное включение для различных ситуаций
Красота использования всей этой магии, спрятанной в один файл, заключается в том, что вы можете добавить полный функционал комментирования в любом месте простой вставкой
<?php comments_template(); ?>
И точно также, простым удалением этой строки из файла шаблона вы убираете комментирование с этой страницы.
Данный метод можно распространять на что угодно, например на сайдбар. Допустим, вы хотите, чтобы одни записи выводились с сайдбаром, другие — без. Создаете произвольное поле для записи с названием noSidebar и заполняете для нужных записей.
Теперь вставьте в файл шаблона этот код
<?php
if (!get_post_meta($post->ID, "noSidebar", true))
{
get_sidebar();
} ?>
Теперь на всех страницах, с установленным полем noSidebar, сайдбар отображаться не будет.