Всем привет! Сегодня на seo-mayak.com я расскажу, что такое цикл WordPress, как он работает и какую роль играют циклы в формировании страницы. Познакомимся с функциями: have_posts(), the_post(), the_permalink() и the_title(), а также разберем глобальную переменную $post.
Признаюсь, что на самом деле я планировал написать пост совершенно на другую тему, но в процессе понял, что сначала мне необходимо растолковать понятие the loop ( в переводе с англ. — петля или цикл).
А так как тема циклов WordPress довольно обширная, мне пришлось изменить планы и начать писать новую статью. Кстати такое у меня случается уже не в первый раз.
В комментариях часто спрашивают о том, в какое место файла надо вставить тот или иной код и мне парой очень сложно объяснить, особенно новичкам, что некоторые функции работают только в пределах цикла.
Итак, что такое цикл WordPress?
Конечно общее определение не дает ясного понимание сего процесса. Возьмем для примера главную страницу блога, на которой выводятся анонсы записей.
Вы никогда не задумывались, каким образом WordPress выводит те самые анонсы и почему на странице отображаются 5 и более превьюшек?
Для того, чтобы попытаться дать понятное объяснение тому, как работает цикл WordPress, давайте разберемся с процессами, которые происходят в глубине сознания WordPress, когда пользователь открывает главную страницу Вашего блога. Поехали!
Условия цикла WordPress. Функция have_posts()
Сразу оговорюсь, что существует несколько способов запуска цикла WordPress и я опишу некоторые из них, в своих будущих статьях, а для облегчения восприятия начнем мы с самого распространенного, стандартного цикла.
В файле index.php, а именно этот файл отвечает за главную страницу любого блога, стандартный цикл начинается со строк:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
И заканчивается строками:
<?php endwhile; else: ?> <p><?php _e('К сожалению, по Вашему запросу ничего не найдено');?></p> <?php endif; ?>
Итак, пользователь открывает главную страницу и в работу вступает функция have_posts(), которая проверяет базу данных на наличие постов, соответствующих данному запросу.
Конструкция if в PHP задает условие для выполнения сценария, исходя из которого будут выполнятся все действия (if можно перевести, как «Если»). Данный сценарий включает в себя два условия.
Условие №1. ЕСЛИ ответ БД положительный (т.е, если функция have_posts() возвращает значение true), то выражение while запускает цикл.
Цикл делает определенное количество витков, пока не дойдет до последней записи, количество которых регулируется настройками WordPress (по умолчанию десять записей).
Если выражаться профессиональным языком, цикл будет продолжаться до тех пор, пока функция have_posts() не вернет значение false.
После того, как цикл сделал свой последний виток и функция have_posts() вернула значение false, выражение endwhile дает команду остановить цикл.
Условие №2. ЕСЛИ ответ БД отрицательный (т.е, функция сразу возвращает значение false), это значит, что в БД не было обнаружено записей, соответствующих запросу и цикл не запустится.
В этом случаи вступает в силу второе условие, которое «включается» с помощью выражения else (можно перевести, как «Иначе»).
ИНАЧЕ откроется страница ошибки 404 и на экран будет выведено сообщение, наподобие: «К сожалению, по Вашему запросу ничего не найдено».
И наконец, выражение endif завершает выполнение сценария.
Теперь давайте вернемся как условию №1 и более подробно разберем все происходящие в нем события.
Анатомия цикла WordPress. Функция the_post() и переменная $post
Итак, пользователь открыл главную страницу, функция have_posts() проверила БД на наличие записей, соответствующих запросу и вернула значение true, что означает — данные найдены. Далее выражение while запускает цикл и активируется функция the_post().
Функция the_post() вступает в взаимодействие с глобальной переменной $post и получат от нее все необходимы данные, которые в последствии передает в браузер пользователя.
Наверняка у многих возник вопрос, а что такое глобальная переменная? Думаю об этом надо рассказать по-подробней. Но прежде всего необходимо понять, что такое переменная в принципе.
На заметку! Переменная — это некий контейнер, в который помещаются данные, необходимые для работы тех или иных функций.
Переменные в PHP могут быть трех типов: локальные, глобальные и статические.
Локальные переменные создаются непосредственно внутри функции и данные, занесенные в них, предназначаются для работы только той функции, в которой они были созданы и не могут быть использованы за ее пределами.
Глобальные переменные — это переменные, которые объявляются в не тела какой-то конкретной функции, поэтому могут распространятся и на другие функции, но в рамках определенной программы.
Статические переменные в отличии от локальных и глобальных не затираются при выходе их функций, но распространяют свое действие только в пределах определенной блока кода или файла.
В нашем случаи, данной программой является цикл WordPress. Как я уже говорил ранее, цикл можно создать с помощью разных функций и в работе всех этих функций допускается использование переменной $post. Надеюсь понятно.
Глобальная переменная $post создается веб-сервером и является, так сказать, одноразовой, в том смысле, что при каждом новом витке цикла, она создается заново и принимает данные следующего поста. Работает данная переменная только в пределах цикла.
Переменная $post может принимать ряд свойств (до это я их называл данными). Названия этих свойств, ни что иное, как названия полей в таблице wp_posts базы данных. Вот эти свойства:
ID – идентификатор записи;
post_author – идентификатор автора записи;
post_parent – идентификатор родительского поста;
post_title – название записи;
post_content – содержание записи;
comment_count – количество комментариев к записи;
comment_status – можно ли добавлять комментарии к записи (open | closed | registered_only);
post_date – дата записи (формат этой даты YYYY-MM-DD HH:MM:SS);
post_date_gmt – дата записи в виде GMT (формат даты YYYY-MM-DD HH:MM:SS);
post_modified – дата последнего обновления записи (формат даты YYYY-MM-DD HH:MM:SS);
post_modified_gmt — дата последнего обновления записи в GMT (формат YYYY-MM-DD HH:MM:SS);
post_excerpt – выдержка из записи (цитата);
post_status – статус записи (publish | pending | draft | private | static | object | attachment | inherit | future | trash);
ping_status — разрешен/запрещен пинг к записи: pingback и trackback (open | closed);
post_password – пароль для записи;
post_name – slug (слаг записи);
to_ping – URL для пинга;
pinged – URL, которые уведомляются о том, что в данном посте на них сослались;
guid – уникальная ссылка на пост (shortlink);
post_type – тип записи. Например, ‘post’, ‘page’, ‘attachment’ или другой тип;
post_mime_type – MIME-тип (для вложений, имеющих тип ‘attachment’);
menu_order – рейтинг записи (влияет на порядок вывода записей).
В соответствии с вышеперечисленными свойствами, в переменной $post формируется массив элементов, который обрабатывается функцией the_post() и отдается в браузер пользователя.
Я понимаю, что новичкам будет не просто усвоить столь сложный материал, но если вспомнить, как я набирался знаний, собирая информацию по кусочкам, то сие подробное изложение, было бы для меня просто находкой. Идем дальше.
Итак, с формирование цикла мы малость разобрались, теперь давайте познакомимся с основными функциями, которые работают непосредственно внутри цикла WordPress.
Функции цикла: the_permalink(), the_title()
Дело в том что цикл WordPress не ограничивается работой вышеупомянутых функций have_posts() и the_post(). Если взглянуть на код стандартного цикла, который прописан в файле index.php, то он будет выглядеть примерно так:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2> <?php the_content('Читать полностью »'); ?> <?php endwhile; else: ?> <p><?php _e('К сожалению, по Вашему запросу ничего не найдено');?></p> <?php endif; ?>
Как видно, внутри цикла расположился тег заголовка. У кого-то это может быть тег h1, у кого-то h2 — это не суть важно. Как известно, заголовок в анонсе статьи является ссылкой, поэтому в нем присутствует конструкция:
<a href="ссылка">анкор</a>
А вот что это за функция прописана вместо ссылки? В WordPress предусмотрен целый рад функций, которые могут работать только внутри цикла. Именно такой функцией является the_permalink().
Кроме всех вышеперечисленных данных, которые помещаются веб-сервером в переменную $post, в базе данных имеются и другие полезные сведения, например абсолютный URL записи.
Итак, запустился цикл и сделал свой первый виток и функция the_permalink() выводит ссылку на текущий пост, который в данный момент находится в цикле. Когда цикл делает следующий виток и на обработку поступают данные следующей записи, то функция выводит соответствующий URL.
Поэтому функция the_permalink() и ей подобные не могут работать вне цикла. Надеюсь понятно.
Стоит сказать, что функция the_permalink() является тегом шаблона и работает на основе другой функции get_permalink(), о которой я также обязательно расскажу в своих следующих статьях, так что подписывайтесь на обновления блога.
В качестве анкора, в данной конструкции, выступает функция the_title(), которая работает по схожей схеме, что и функция the_permalink(), но с той разницей, что выводит заголовок текущей записи в цикле.
Далее в коде прописана еще одна функция the_content(), которая взаимодействует с тегом more и обрезает текущую запись в цикле. Если в текущей записи не будет обнаружен тег more, то пост будет выведен целиком.
Вместо the_content() в коде может работать другая функция — the_excerpt(), которая также способна обрезать текст, но работает по другому принципу.
Я постарался как можно подробней описать весь процесс формирования цикла WordPress, но если остались вопросы, всегда готов ответить на них в комментариях.
Как я уже сказал ранее, существует целый рад функций, которые могут работать в цикле и если знать как их использовать, то можно значительно улучшить функционал сайта, а также сделать его более привлекательным. В следующей статье я расскажу об одной такой функции, которая называется the_post_thumbnail() и отвечает за вывод изображений в цикле.
P.S. Инициировать цикл в WordPress можно несколькими способами, которые я также обязательно опишу в своих будущих статьях.
До встречи!
С уважением, Виталий Кириллов
Спасибо за полезную статью.
Подскажите пожалуйста — на каком этапе и где и чем (при формировании поста) — задается кодировка. Дело в том что у меня отдельные символы записей отображаются кодами символов типа &#xxxx — и побороть это никак не получается. Поиски по Гуглу — ничего не дали. Переписка с хостером тоже.
По установкам сервера — character set results = ср1251 (значение сессии = utf8).
Отличный материал, то что искал. Для новичков хотелось бы добавить про функции. Функция the_permalink() и ей подобные не могут работать вне цикла, еще и потому, что хранят в себе массив данных, а его можно перебрать только с помощью циклов, иначе ни как.