Как добавить контент после тега <body>
Мне нужно добавить некоторые элементы непосредственно после тега <body>
.
Возможно ли это сделать используя только хуки WordPress?

WordPress 5.2.0 представил хук wp_body_open
(подробности в кодексе WordPress)
// Добавляем код после открывающего тега body.
add_action( 'wp_body_open', 'wpdoc_add_custom_body_open_code' );
function wpdoc_add_custom_body_open_code() {
echo '<!-- пользовательский код -->';
}

После прочтения этого ответа я сделал следующее.
ob_start();
add_action('shutdown', function() {
if ( is_admin() ) {
return;
}
$final = '';
$levels = ob_get_level();
for ($i = 0; $i < $levels; $i++){
$final .= ob_get_clean();
}
echo apply_filters('final_output', $final);
}, 0);
add_filter('final_output', function($output) {
if ( is_admin() ) {
return;
}
$after_body = apply_filters('after_body','');
$output = preg_replace("/(\<body.*\>)/", "$1".$after_body, $output);
return $output;
});
add_filter('after_body',function($after_body){
$after_body.='<div class="content">Мой контент</div>';
return $after_body;
});
Первые два фильтра "shutdown" и "final_output" являются основными функциями. Они могут быть частью плагина. После их создания вы можете использовать новый фильтр after_body, чтобы добавить что угодно после тега body.
В данном случае я добавил простой div, в результате получилось следующее:
<body><div class="content">Мой контент</div>
Что также интересно - с этим регулярным выражением вам не нужно беспокоиться о повреждении того, что находится внутри тега body. Например, класса или любого другого атрибута.

Я не смог найти ни одного рабочего примера в интернете, но у меня есть одно решение, и я надеюсь, оно может кому-то помочь.
jQuery(document).ready( function($) {
$('body').prepend('<h1>Привет, мир</h1>');
});
https://wordpress.org/support/topic/add_action-right-after-ltbodygt-tag

Хочу сообщить, что с этой помощью я создал этот плагин http://woocomercescratchdiscount.themefantasy.com/

Если вы используете Genesis от StudioPress, есть хук, который можно использовать, как тот, что я применяю для плагинов Facebook:
add_action( 'genesis_before', 'fn_AddFacebook' ); function fn_AddFacebook(){ $script=' (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.8"; fjs.parentNode.insertBefore(js, fjs); }(document, \'script\', \'facebook-jssdk\'));'; echo $script; }
Этот вариант работает у меня. По сути, это то же самое, что и добавление собственного хука, как в первом ответе (с которым я согласен, что он лучший).
Однако... если вы, как и я, собираете сайты на основе любого шаблона, который выбрал клиент, мне не нравится добавлять свои хуки таким образом. Я храню весь свой код в отдельной директории и подключаю его к functions.php. Поэтому я бы использовал jQuery-решение, чтобы добавить код в DOM после загрузки.
Тем не менее, я протестировал идею Ralf912 с буферизацией вывода. Это очень круто. Я бы сказал, что если вам нужно гарантировать корректное выполнение вашего кода на той же странице, и он должен быть там на 100%, и вы не хотите возиться с шаблоном, то это хорошая идея.

Вы можете создать плагин на основе JavaScript, который использует метод prependTo
для размещения тега сразу после открывающего тега body. Ознакомьтесь с примером для справки.

@Nippysaurus Действительно (+1), но буферизация вывода ничем не лучше.

Да, это довольно просто:
add_action( 'init', 'test_start_buffer', 0, 0 );
function test_start_buffer(){
ob_start( 'test_get_buffer' );
}
function test_get_buffer( $buffer){
return preg_replace( '#<body.+>#', '<body>', $buffer);
}
Первая функция зарегистрирует callback для буферизации вывода. Вторая функция является callback и будет модифицировать и возвращать HTML. Пожалуйста, ознакомьтесь с руководством PHP по буферизации вывода для получения дополнительной информации.
