Это восьмой урок о том, как создать тему для WordPress из верстки. Вы узнаете, как сделать шаблон для одиночной записи – файл single.php.
Что обычно выводится на странице записи? Заголовок и содержимое записи, мета-данные (такие как дата, рубрики, метки), и, конечно, комментарии и форма для отправки комментария. Давайте создадим страницу, на которой будут присутствовать все эти элементы.
Шаг 1 Подготовительные работы
Для начала, давайте немного оптимизируем структуру файла index.php. Как вы уже знаете, это основной шаблон темы для вордпресс, и именно он будет срабатывать, если более подходящий шаблон не найден. Сейчас в этом файле содержится достаточно большая часть кода, которая отвечает за вывод содержимого записи. Вот она:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<!-- Post Start --> <article class="is-post is-post-excerpt" class="<?php post_class(); ?>" id="post-<?php the_ID(); ?>"> <header> <h2 class="entry-title"><a title="<?php printf( esc_attr__( 'Permalink to %s', 'striped' ), the_title_attribute( 'echo=0' ) ); ?>" href="<?php the_permalink(); ?>" rel="bookmark"> <?php the_title(); ?> </a></h2> <!-- <span class="byline">A free, fully responsive HTML5 site template by HTML5 UP</span> --> </header> <div class="info"> <span class="date"> <span class="day"><?php the_time('j'); ?></span> <span class="month"><?php the_time('M'); ?></span> <span class="year"><?php the_time('Y'); ?></span> <!-- <span class="month">Jan<span>uary</span></span> <span class="day">14</span><span class="year">, 2013</span> --> </span> <ul class="stats"> <li><a href="#" class="fa fa-comment">16</a></li> <li><a href="#" class="fa fa-heart">32</a></li> <li><a href="#" class="fa fa-twitter">64</a></li> <li><a href="#" class="fa fa-facebook">128</a></li> </ul> </div> <a href="<?php the_permalink(); ?>" class="image image-full"><?php if ( has_post_thumbnail() ) { the_post_thumbnail(); } ?></a> <?php the_content(); ?> </article> <!-- Post End --> |
Именно эта часть кода отрабатывает на всех страницах темы, где есть хоть какое-то содержимое. Поэтому, чтобы упроситить дальнейшую работу над темой, этот кусок кода нужно вынести в отдельный файл, который будет называться content.php. Копируем, вставляем, удаляем эту часть в index.php 🙂 Сейчас нужно подключить вывод этого фрагмента. Сделаем это при помощи функции get_template_part()
:
1 |
<?php get_template_part('content') ?> |
В итоге, файл index.php будет выглядеть вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php get_header(); ?> <?php while ( have_posts() ) : the_post(); ?> <?php get_template_part('content') ?> <?php endwhile; ?> <!-- Pager --> <?php if (function_exists('oriolo_pagination')) oriolo_pagination(); else posts_nav_link(); ?> </div> </div> <?php get_sidebar(); ?> <?php get_footer(); ?> |
То же самое давайте проделаем с файлом archive.php, который мы создали в прошлом уроке.
Теперь создайте копию файла index.php и переименуйте ее в single.php. Сделаем небольшие изменения в этом файле. Для начала, удалим оттуда вывод постраничной навигации, так как она все равно не будет использоваться на этой странице. В итоге, файл single.php должен получиться таким:
1 2 3 4 5 6 7 8 |
<?php get_header(); ?> <?php while ( have_posts() ) : the_post(); ?> <?php get_template_part('content') ?> <?php endwhile; ?> </div> </div> <?php get_sidebar(); ?> <?php get_footer(); ?> |
Шаг 2 Вывод мета-данных записи
Если Вы все верно сделали, то сейчас при переходе на страницу записи должен появиться полный текст и заголовок. В первом шаге мы добавим вывод информации о записи: автора, рубрики и метки.
А теперь начинается магия 🙂 Создайте копию файла content.php, и назовите ее content-single.php. Затем поменяйте функцию get_template_part
в файле single.php, чтобы она выглядела вот так:
1 |
<?php get_template_part('content', 'single') ?> |
Этим мы сделаем так, чтобы на странице одиночной записи содержимое выводилось из файла content-single.php.
И далее, уже в файле content-single.php, перед закрывающим тегом article
, добавляем:
1 2 3 4 5 |
<footer class="entry-meta"> <?php edit_post_link( __( 'Edit', 'striped' ), '<div class="edit-link">', '</div>' ); ?> <p class="tags"><?php the_tags(__( 'Tagged as: ', 'striped' ),', '); ?></p> <p class="categories"><?php _e( 'Categorized in: ', 'striped' ) . the_category(', '); ?></p> </footer> |
Мы создали новый элемент – футер записи. В него добавили:
- Строка 2 – это вывод ссылки на редактирование записи для администатора,
- строка 3 – добавление списка тегов,
- строка 4 – добавление списка рубрик.
Теперь, при желании, можете их стилизовать при помощи CSS. Кстати, если хотите, то в футере записи также можно разместить ссылки типа “поделиться в социальных сетях” и многое другое.
Шаг 3 Вывод комментариев
Следующим, и наверное самым сложным шагом, будет вывод комментариев для записи. Во-первых, откройте файл single.php, и сразу после get_template_part
добавьте эту функцию:
1 2 3 4 5 |
<?php // If comments are open or we have at least one comment, load up the comment template. if ( comments_open() || '0' != get_comments_number() ) : comments_template(); endif; ?> |
Так мы проверим, во-первых, разрешено ли добавление комментариев к записи, и есть ли к ней комментарии, и если одно из этих условий соблюдается, то выведем список комментариев. За то, как именно комментарии будут выведены, отвечает файл comments.php.
Шаг 4 Файл comments.php
Создайте новый пустой PHP-файл с названием comments.
Создадим в этом файле блок, в котором будет выводится список комментариев:
1 2 3 |
<div id="comments"> </div><!-- #comments --> |
Сначала давайте проверим, не защищена ли запись паролем.:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<div id="comments"> <?php if ( post_password_required() ) : ?> <p class="nopassword"><?php _e( 'This post is password protected. Enter the password to view any comments.', 'striped' ); ?></p> </div><!-- #comments --> <?php /* * Stop the rest of comments.php from being processed, * but don't kill the script entirely -- we still have * to fully load the template. */ return; endif; ?> </div><!-- #comments --> |
Потом проверим, есть ли к записи коммментарии:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<div id="comments"> <?php if ( post_password_required() ) : ?> <p class="nopassword"><?php _e( 'This post is password protected. Enter the password to view any comments.', 'striped' ); ?></p> </div><!-- #comments --> <?php /* * Stop the rest of comments.php from being processed, * but don't kill the script entirely -- we still have * to fully load the template. */ return; endif; ?> <?php if ( have_comments() ) : ?> <?php endif; // end have_comments() ?> </div><!-- #comments --> |
Если комментарии есть, то их нужно вывести:
15 16 17 18 19 |
<ol class="commentlist"> <?php wp_list_comments(); ?> </ol> |
Теперь добавим заголовок для списка комментариев. Он будет содержать число комментариев и название записи:
15 16 17 18 19 20 |
<h3 id="comments-title"> <?php printf( _n( 'One Response to %2$s', '%1$s Responses to %2$s', get_comments_number(), 'striped' ), number_format_i18n( get_comments_number() ), '<em>' . get_the_title() . '</em>' ); ?> </h3> |
Также нужно добавить постраничную навигацию, она будет появляться, если страниц с комментариями много. Для этого добавим такой код до и после вывода списка комментариев:
21 22 23 24 25 26 |
<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?> <div class="navigation"> <div class="nav-previous"><?php previous_comments_link( __( '<span class="meta-nav">←</span> Older Comments', 'striped' ) ); ?></div> <div class="nav-next"><?php next_comments_link( __( 'Newer Comments <span class="meta-nav">→</span>', 'striped' ) ); ?></div> </div> <!-- .navigation --> <?php endif; // check for comment navigation ?> |
Ну и напоследок сделаем уведомление на случай, если комментариев к записи нет, и комментирование запрещено:
44 45 46 47 48 49 50 51 |
<?php /* * If there are no comments and comments are closed, let's leave a little note. */ $num_comments = get_comments_number(); if ( ! comments_open() && $num_comments == 0 ) : ?> <p class="nocomments"><?php _e( 'Comments are closed.' , 'striped' ); ?></p> <?php endif; ?> |
В итоге, содержание файла comments.php должно получиться примерно следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<div id="comments"> <?php if ( post_password_required() ) : ?> <p class="nopassword"><?php _e( 'This post is password protected. Enter the password to view any comments.', 'striped' ); ?></p> </div><!-- #comments --> <?php /* * Stop the rest of comments.php from being processed, * but don't kill the script entirely -- we still have * to fully load the template. */ return; endif; ?> <?php if ( have_comments() ) : ?> <h3 id="comments-title"><?php printf( _n( 'One Response to %2$s', '%1$s Responses to %2$s', get_comments_number(), 'striped' ), number_format_i18n( get_comments_number() ), '<em>' . get_the_title() . '</em>' ); ?></h3> <?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?> <div class="navigation"> <div class="nav-previous"><?php previous_comments_link( __( '<span class="meta-nav">←</span> Older Comments', 'striped' ) ); ?></div> <div class="nav-next"><?php next_comments_link( __( 'Newer Comments <span class="meta-nav">→</span>', 'striped' ) ); ?></div> </div> <!-- .navigation --> <?php endif; // check for comment navigation ?> <ol class="commentlist"> <?php /* * Loop through and list the comments. */ wp_list_comments(); ?> </ol> <?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?> <div class="navigation"> <div class="nav-previous"><?php previous_comments_link( __( '<span class="meta-nav">←</span> Older Comments', 'striped' ) ); ?></div> <div class="nav-next"><?php next_comments_link( __( 'Newer Comments <span class="meta-nav">→</span>', 'striped' ) ); ?></div> </div><!-- .navigation --> <?php endif; // check for comment navigation ?> <?php /* * If there are no comments and comments are closed, let's leave a little note. */ $num_comments = get_comments_number(); if ( ! comments_open() && $num_comments == 0 ) : ?> <p class="nocomments"><?php _e( 'Comments are closed.' , 'striped' ); ?></p> <?php endif; ?> <?php endif; // end have_comments() ?> </div><!-- #comments --> |
Шаг 5 Вывод формы для добавления комментариев
Вывести форму для добавления комментариев можно при помощи функции comment_form
:
1 |
<?php comment_form(); ?> |
Добавьте эту функцию в конце файла comments.php до закрывающего тега div
.
Подробнее о том, как настроить форму для комментариев, можно почитать в этом посте в моем блоге.
На этом работа с файлом шаблона комментариев закончена. Осталось немного настроить стили вывода комментариев через CSS.
Шаг 6 Оформление списка комментариев
В самом общем виде, минимальное оформление списка комментариев будет таким. В отмеченные строки я внесла изменения, остальные привожу, если вы захотите самостоятельно что-то поменять. В принципе, копировать все это оформление необязательно, можно ограничиться только необходимыми вам строками, или, в самом минимальном варианте, выделенными строками?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
ol.commentlist { list-style:none; margin:0 0 1em; padding:0; } ol.commentlist li { margin:0 0 1em 0; } ol.commentlist li.alt { } ol.commentlist li.bypostauthor {} ol.commentlist li.byuser {} ol.commentlist li.comment-author-admin {} ol.commentlist li.comment {} ol.commentlist li.comment div.comment-author { } ol.commentlist li.comment div.vcard {} ol.commentlist li.comment div.vcard cite.fn { font-size: 16px; font-weight:bold; } ol.commentlist li.comment div.vcard cite.fn a.url {} ol.commentlist li.comment div.vcard img.avatar { float:left; margin: 1em 1em 0 0; } ol.commentlist li.comment div.vcard img.avatar-32 {} ol.commentlist li.comment div.vcard img.photo {} ol.commentlist li.comment div.vcard span.says {} ol.commentlist li.comment div.commentmetadata {} ol.commentlist li.comment div.comment-meta { } ol.commentlist li.comment div.comment-meta a { color:#aaa; } ol.commentlist li.comment p { } ol.commentlist li.comment ul { margin:0 0 1em 2em; } ol.commentlist li.comment div.reply { } ol.commentlist li.comment div.reply a { } ol.commentlist li.comment ul.children { list-style:none; margin:0; } ol.commentlist li.comment ul.children li {} ol.commentlist li.comment ul.children li.alt {} ol.commentlist li.comment ul.children li.bypostauthor {} ol.commentlist li.comment ul.children li.byuser {} ol.commentlist li.comment ul.children li.comment {} ol.commentlist li.comment ul.children li.comment-author-admin {} ol.commentlist li.comment ul.children li.depth-2 { margin:0 0 0 3em; } ol.commentlist li.comment ul.children li.depth-3 { margin:0 0 0 3em; } ol.commentlist li.comment ul.children li.depth-4 { margin:0 0 0 3em; } ol.commentlist li.comment ul.children li.depth-5 {} ol.commentlist li.comment ul.children li.odd {} ol.commentlist li.even { } ol.commentlist li.odd { } ol.commentlist li.parent { } ol.commentlist li.thread-alt { } ol.commentlist li.thread-even {} ol.commentlist li.thread-odd {} |
Эти строки нужно добавить в файл стиле темы, или, если брать пример той темы, которую переношу на WordPress в этом примере я, в файл /css/style.css.
Шаг 7 Важные мелочи
Все практически готово, осталось совсем чуть-чуть: необходимо вывести число комментариев к записи на главной странице блога, странице архивов и странице отдельной записи. Поэтому, будем редактировать файлs content.php и content-single.php.
Там есть вот такой список, который выводится слева от заголовка записи рядом с датой:
1 2 3 4 5 6 |
<ul class="stats"> <li><a href="#" class="fa fa-comment">16</a></li> <li><a href="#" class="fa fa-heart">32</a></li> <li><a href="#" class="fa fa-twitter">64</a></li> <li><a href="#" class="fa fa-facebook">128</a></li> </ul> |
Заменим первую строку, чтобы получилось вот так:
1 2 3 4 5 6 |
<ul class="stats"> <li><a href="<?php echo get_comments_link(); ?>" class="fa fa-comment"><?php echo get_comments_number(); ?></a></li> <li><a href="#" class="fa fa-heart">32</a></li> <li><a href="#" class="fa fa-twitter">64</a></li> <li><a href="#" class="fa fa-facebook">128</a></li> </ul> |
Теперь, на страницах блога будет выводится количество комментариев для каждой записи. В дальнейшем мы вернемся к этому списку, и сделаем остальные кнопки динамическими тоже.
Итоги
После всех проделанных действий, мы получили вот такой список комментариев и форму для их добавления:
Из этого урока вы узнали, как создать страницу для вывода одиночной записи, а также создали файлы content.php, content-single.php, comments.php. Чтобы не пропустить следующий урок, подписывайтесь на обновления блога.