Вставка HTML сразу после тега <body>

7 мар. 2016 г., 10:13:56
Просмотры: 89.5K
Голосов: 17

Я использую тему WordPress Twenty Twelve (если быть точным, дочернюю тему).

Хочу узнать, как вставить HTML код сразу после открывающего тега body, используя только functions.php и не затрагивая header.php.

Это возможно?

1
Комментарии

Для будущих читателей, разрабатывающих собственную тему или использующих плохие/устаревшие темы, см. эту заметку в документации.

Walf Walf
14 июн. 2023 г. 04:30:27
Все ответы на вопрос 3
5
38

В теме 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/

7 мар. 2016 г. 11:11:40
Комментарии

Спасибо. Я попробую это.

Есть ли другой способ сделать это без добавления header.php?

Например, что-то с использованием preg_replace?

Ramanana Ramanana
7 мар. 2016 г. 11:22:23

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

Adam Adam
7 мар. 2016 г. 12:27:14

Еще раз спасибо.

Я использую ваш код, и он отлично работает.

На самом деле мой вопрос был с точки зрения дочерней темы, но просто с использованием functions.php дочерней темы.

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

Ramanana Ramanana
7 мар. 2016 г. 12:47:24

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

Junaid Bhura Junaid Bhura
26 июл. 2019 г. 03:53:17

@JunaidBhura спасибо за ваше предложение в этой старой теме. Я обновил пример выше, чтобы уточнить информацию о новой вспомогательной функции ядра и хуке, который может присутствовать в темах и, надеюсь, получит широкое распространение в будущем.

Adam Adam
26 июл. 2019 г. 14:08:43
1

Очень, очень, очень грязное решение выглядело бы так:

/* Вставка кода отслеживания или других вещей сразу после открытия 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;
}
21 июл. 2017 г. 12:48:15
Комментарии

+1 спасибо за трюк

Vaibhav Gupta Vaibhav Gupta
2 окт. 2019 г. 17:46:57
4
-2

Добавьте этот код в functions.php

function my_function() {
 echo'<div id="from_my_function"></div>';

}
add_action('wp_head', 'my_function');
11 июл. 2016 г. 13:05:36
Комментарии

Этот вывод будет внутри <head>, а не <body>.

cjbj cjbj
11 июл. 2016 г. 13:08:56

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

Mohamed Salem Lamiri Mohamed Salem Lamiri
1 февр. 2018 г. 17:30:34

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

Danger Danger
29 мар. 2018 г. 20:15:42

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

Daniel Morell Daniel Morell
10 февр. 2021 г. 19:16:21