single.php выполняется дважды – как остановить

Остановить двойную обработку шаблона темы

Остановить двойную обработку

single.php выполняется дважды при каждом просмотре статьи – именно к такому выводу я пришел после небольшого исследования предмета. Каким образом, спросите вы?
Решая задачу получения списка статей, просмотренных посетителями, я добавил в файл шаблона single.php используемой мной темы “Twenty Eleven” код для сохранения в таблице базы данных идентификатора ID просматриваемой посетителем статьи. Как же я был удивлен, обнаружив в таблице базы данных сразу две записи после просмотра всего одной статьи. Еще один щелчок мыши – и опять две записи в базе данных. При чем каждая из записей для отдельной статьи – коды ID разные. Первая запись правильная, для только что просмотренной статьи, а вторая, ненужная запись – для статьи, хронологически следующей за просмотренной статьей.
Таким образом WordPress обрабатывает содержимое статьи как минимум дважды каждый раз, когда посетитель сайта щелкает мышкой на ссылке этой статьи. Очевидно, что это совершенно ненужная нагрузка и увеличение времени обработки пользовательского запроса. Почему это происходит? Как избежать этой бесцельной траты ресурсов?
Быстрый тест в PHP-отладчике ясности не прибавил. WordPress не относится к программному обеспечению, отладка которого относительно проста. Множество фильтров и заложенных в специальные очереди отложенных действий, которые и делают WordPress столь мощным, гибким и расширяемым инструментом, в то же время добавляют сложности к проблеме понимания логики выполнения его кода, так как эта логика временами перестаёт быть линейной. Я прошел в отладчике по циклу выполнения WordPress от начала до конца первый раз, потом он проделал то же самое второй раз, уже без моего явного вмешательства и видимой на то причины, так как стек выполнения на тот момент был пуст. Что послужило причиной?
Оптимизированные для поисковых систем ссылки, основанные на перезаписи URL правилами через .htaccess веб-сервера Apache? Надо бы проверить. У меня было выбрано имя статьи или ‘post name’, и проблема улетучилась, как только я отключил использование “красивых ссылок”. Однако нужно искать другой выход, так как я не готов отказаться от так называемых дружественных к поисковикам ссылок.

Благо WordPress – очень популярная платформа, и, естественно, я не первый и не единственный, кто столкнулся с подобной проблемой. Как и всегда поиск мне помог поиск Google. Я обнаружил пару подходящих дискуссий по теме (правда на английском):
1. single.php called for current and next post with pretty permalinks;
2. Problem with add_filter while developing plugin.

Причина скрыта в том, что WordPress отрабатывает полностью в соответствии с шаблоном активной темы не только содержание выбранной посетителем сайта статьи, но и кеширует заодно следующую по хронологии статью, заодно получая на нее корректную ссылку. Слегка измененный для совместимости с последней 3.4.2 версией WordPress код позволил мне решить проблему полностью:

 // остановить предзагрузку следующей статьи и двойную обработку шаблоана single.php
 remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');

Просто добавьте эту строку кода в файл functions.php вашей активной темы. Это поможет вам избежать двойной обработки шаблона просмотра статьи with single.php.

Если вы сталкиваетесь с подобной проблемой, но не желаете или не имеете возможности внести изменения в файл functions.php используемой на сайте темы, вы можете установить небольшой плагин, который исполнит приведенный выше код без изменения кода темы или WordPress. Просто поместите PHP файл из этого архива в папку wp-content/plugins и активируйте новый плагин. Если вы хотите быть уверены, что этот код исполняется всегда и безусловно, создайте каталог wp-content/mu-plugins/ и поместите файл туда. Плагины, размещённые в этой папке активируются WordPress по-умолчанию и без вашего вмешательства. У плагина нет дополнительных настроек. Он делает свою работу молча, не досаждая вам вопросами и сообщениями.

P.S. Если вы обнаружите неучтенный мной отрицательный эффект от такой оптимизации работы WordPress, пожалуйста, поделитесь вашими наблюдениями.

  • EnderGenom

    Медитировал не это пару часов, пока не вбил вопрос в поисковик. Сенкс