Вставка HTML сразу после тега <body>
Я использую тему WordPress Twenty Twelve (если быть точным, дочернюю тему).
Хочу узнать, как вставить HTML код сразу после открывающего тега body, используя только functions.php и не затрагивая header.php.
Это возможно?

В теме Twenty Twelve нет хуков, которые срабатывают сразу после открывающего тега <body>
.
Поэтому в вашей дочерней теме, которая расширяет родительскую тему Twenty Twelve, скопируйте файл header.php
в директорию вашей дочерней темы.
Откройте файл header.php
в вашей дочерней теме и сразу после открывающего тега body добавьте хук действия, к которому вы затем сможете подключиться через ваш файл functions.php
.
Например, в вашем файле twenty-twelve-child/header.php
:
<body <?php body_class(); ?>>
<?php do_action('after_body_open_tag'); ?>
Затем в вашем файле twenty-twelve-child/functions.php
:
function custom_content_after_body_open_tag() {
?>
<div>Мой пользовательский контент</div>
<?php
}
add_action('after_body_open_tag', 'custom_content_after_body_open_tag');
Это затем отобразится в вашем HTML как:
<body>
<div>Мой пользовательский контент</div>
Рекомендуемая литература:
https://developer.wordpress.org/reference/functions/do_action/
ОБНОВЛЕНИЕ: ИЮЛЬ, 2019
Как отметил Junaid Bhura, начиная с WordPress 5.2 была введена новая вспомогательная функция темы wp_body_open
, предназначенная для использования, подобно другим вспомогательным функциям wp_head
и wp_footer
.
Например:
<html>
<head>
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<!-- КОНТЕНТ ТЕЛА ЗДЕСЬ -->
<?php wp_footer(); ?>
</body>
</html>
В файле functions.php вашей темы (или в другом подходящем месте)
function custom_content_after_body_open_tag() {
?>
<div>Мой пользовательский контент</div>
<?php
}
add_action('wp_body_open', 'custom_content_after_body_open_tag');
ВАЖНО
Вы должны убедиться, что хук существует в теме, в которую вы хотите внедрить код, так как он может еще не быть широко принят сообществом.
Если НЕТ, вам все еще нужно следовать принципу расширения темы с помощью дочерней темы, за исключением того, что ВЫ будете использовать:
<?php wp_body_open(); ?>
...вместо ИЛИ в дополнение к:
<?php do_action('after_body_open_tag'); ?>
Рекомендуемая литература:
https://developer.wordpress.org/reference/functions/wp_body_open/

Спасибо. Я попробую это.
Есть ли другой способ сделать это без добавления header.php?
Например, что-то с использованием preg_replace?

Вы могли бы, например, использовать хук template_include
или подобный, однако это крайне не рекомендуется, потому что это не только неэффективно, но и может быть очень ненадежно, если в родительской теме что-то изменится из-за обновления. Расширение родительской темы с использованием дочерней темы — это лучшая практика, она предсказуема и ожидаема, плюс дает вам значительный контроль, как в примере выше. Однако, если вы хотите использовать preg_replace
, это ваше дело...

Еще раз спасибо.
Я использую ваш код, и он отлично работает.
На самом деле мой вопрос был с точки зрения дочерней темы, но просто с использованием functions.php дочерней темы.
Но в любом случае, после реализации вашего кода, я понимаю, что он простой, легковесный и понятный.

Начиная с WordPress 5.2, доступен стандартный тег: wp_body_open() : https://developer.wordpress.org/reference/functions/wp_body_open/

Очень, очень, очень грязное решение выглядело бы так:
/* Вставка кода отслеживания или других вещей сразу после открытия BODY */
add_filter('body_class', 'wps_add_tracking_body', PHP_INT_MAX); // убедитесь, что это последний фильтр в очереди
function wps_add_tracking_body($classes) {
// закрываем тег <body>, вставляем код, открываем другой тег с бессмысленной переменной
$classes[] = '"><script> /* делаем что-нибудь */ </script><noscript></noscript novar="';
return $classes;
}

Похоже, WordPress достаточно умен, и на самом деле он добавляет это в body! Если это мета-тег, то он будет вставлен в заголовок, в противном случае он отобразится в теле документа.

Я считаю, что @cjbj прав. Похоже, это браузер перемещает его в body, а не WordPress. Посмотрите исходный код страницы, куда вы вставили его в head, и там вы его найдете.

Не делайте так! Это создаст невалидный HTML, вставив <div>
в <head>
. Браузер попытается исправить это, закрыв head (вставив </head>
) прямо перед <div>
. Это может сломать вашу страницу, потому что всё после вставленного <div>
теперь окажется в body, а не в head.
