Вопрос или проблема
Есть ли легкий способ удалить все html-комментарии, такие как <!-- wp_head()-->
из исходного кода всех страниц и постов? Может быть, используя functions.php? Есть ли легкий метод без плагина?
Вот быстрый способ удалить все комментарии, используя буферизацию вывода и preg_replace
. Мы подключаемся до того, как WordPress начнет выводить HTML, чтобы начать буферизацию. Затем мы подключаемся после того, как WordPress закончит выводить HTML, чтобы получить буфер и удалить теги HTML-комментариев из содержимого.
Этот код желательно бы находился в собственном плагине. Но он может быть в вашем functions.php, если вы действительно не хотите добавлять больше плагинов.
namespace StackExchange\WordPress;
//* Начать буферизацию вывода
function startOutputBuffer() {
ob_start();
}
//* Вывод буфера
function stopOutputBuffer() {
$html = ob_get_clean();
echo strip_html_comments( $html );
}
//* Смотрите примечание для указания источника этого кода
function strip_html_comments( string $html ) : string {
return preg_replace('/<!--(.*)-->/Uis', '', $html);
}
//* Добавить действие до того, как WordPress начнет выводить контент, чтобы начать буферизацию
add_action( 'wp', __NAMESPACE__ . '\startOutputBuffer' );
//* Добавить действие после того, как WordPress прекращает выводить контент, чтобы остановить буферизацию
add_action( 'shutdown', __NAMESPACE__ . '\stopOutputBuffer' );
Примечание: Регулярное выражение из ответа на StackOverflow от Benoit Villière.
Следующие действия WordPress могут удалить ваш код от всех HTML-комментариев. Поместите PHP-код в ваш файл functions.php
в директории темы WordPress.
function callback($buffer) {
$buffer = preg_replace('/<!--(.|s)*?-->/', '', $buffer);
return $buffer;
}
function buffer_start() {
ob_start("callback");
}
function buffer_end() {
ob_end_flush();
}
add_action('get_header', 'buffer_start');
add_action('wp_footer', 'buffer_end');
Два вышеуказанных решения не сработали для меня (первое вызвало фатальную ошибку на сайте, второе не имело эффекта), но я смог сделать смесь из обоих “решений”, которая, кажется, работает очень хорошо (при вставке в functions.php WordPress):
function callback($buffer) {
$buffer = preg_replace('/<!--(.*)-->/Uis', '', $buffer);
return $buffer;
}
function buffer_start() {
ob_start("callback");
}
function buffer_end() {
ob_end_flush();
}
add_action('get_header', 'buffer_start');
add_action('wp_footer', 'buffer_end');
Исходный код выглядит намного чище, “легче” и более приватным без потенциально множества html-комментариев, не предназначенных для публики.
Имейте в виду, что это также очистило условные “if” комментарии из публичного исходного кода, но в моем случае они были предназначены в основном для очень старого Internet Explorer. Думаю, хорошо сделанные плагины и так далее не должны работать с условными конструкциями, отформатированными как html-комментарии, верно?
Любое подтверждающее или исправляющее мнение приветствуется!
Ответ или решение
Удаление HTML-комментариев из исходного кода в WordPress может быть полезным по ряду причин: для облегчения счетчика страниц, увеличения конфиденциальности или для улучшения производительности. Вопрос, который был сформулирован, подразумевает, что вы предпочитаете обходиться без дополнительных плагинов и хотите воспользоваться возможностями, которые предоставляет файл functions.php
.
Теория
В основе концепции удаления HTML-комментариев лежит механизм буферизации вывода. Буферизация позволяет вначале "перехватить" весь вывод, производимый скриптом, и лишь затем его обработать или изменить перед тем, как он будет окончательно представлен пользователю. Это достигается с помощью функций PHP, таких как ob_start
, ob_get_clean
, и ob_end_flush
. Эти функции позволяют вам управлять всем, что выводится, до того, как это станет видимым на странице.
Регулярные выражения (регулярные выражения, или regex) — это мощный инструмент для поиска и манипуляции строками. В данном случае нам следует использовать preg_replace
для удаления HTML-комментариев. Регулярное выражение /<!--(.*)-->/Uis
предназначено для нахождения всех комментариев, заключённых между <!--
и -->
, игнорируя при этом вложенные комментарии и с учётом всех изменений в условиях мультистрочности и любых символов внутри комментария.
Пример
Рассмотрим пример, где используется буферизация вывода и регулярные выражения для удаления HTML-комментариев.
function callback($buffer) {
$buffer = preg_replace('/<!--(.*)-->/Uis', '', $buffer);
return $buffer;
}
function buffer_start() {
ob_start("callback");
}
function buffer_end() {
ob_end_flush();
}
add_action('get_header', 'buffer_start');
add_action('wp_footer', 'buffer_end');
В этом коде, который можно разместить внутри functions.php
вашего WordPress шаблона, прежде чем WordPress начнёт отдавать заголовки страницы, срабатывает функция buffer_start
, которая инициализирует буферизацию, и когда вся страница загружена и готова к показу, вызывается buffer_end
. В процессе выполнения содержимое буфера передаётся через функцию callback
, где и производится замена.
Применение
Применение данного метода позволяет эффективно удалять HTML-комментарии из исходного кода страниц WordPress. Это будет полезно для сайтов, которые стремятся минимизировать дополнительную информацию, которая может быть представлена в комментариях, чаще всего используемых разработчикам для отладки или ориентира. Это дополнительно обеспечит меньшую загрузку страницы, она будет "чистее" и потенциально быстрее загружаться, так как не будет незначительных данных, которые браузеру нужно будет обрабатывать.
При реализации помните, что ваш код должен быть протестирован в среде разработки, прежде чем вы внедрите его на рабочих серверах. Неправильное использование регулярных выражений или буферизации может привести к некорректной работе сайта, особенно если на вашем сайте активно используются сторонние скрипты, которые могут ожидать наличия определённых комментариев.
Также стоит учесть, что удаление комментариев повлияет на условные комментарии, которые могли быть задействованы, например, для специфических версий Internet Explorer. Поэтому, если такие комментарии используются, стоит рассмотреть и протестировать последствия их удаления.
Таким образом, зная особенности буферизации и использования регулярных выражений на PHP, вы сможете эффективно управлять видимостью кода, выводимого вашим сайтом, непосредственно из файла functions.php
, что позволяет избегать зависимостей от сторонних плагинов.