Как добавить контент после тега <body>

20 нояб. 2012 г., 23:56:47
Просмотры: 17.7K
Голосов: 4

Мне нужно добавить некоторые элементы непосредственно после тега <body>.

Возможно ли это сделать используя только хуки WordPress?

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

Пожалуйста, Nippysaurus, сделай это без взлома всего, что не нужно взламывать... @kaiser дал правильный ответ :)

brasofilo brasofilo
21 нояб. 2012 г. 05:45:35

Придется поверить тебе на слово... В итоге я использовал дочерний шаблон, так что не пришлось реализовывать ни одно из этих решений :) Я совсем новичок в разработке под WordPress (это мой второй сайт), поэтому интересно увидеть, как решаются подобные задачи.

Nippysaurus Nippysaurus
21 нояб. 2012 г. 06:45:13
Все ответы на вопрос 7
0

Просто добавьте пользовательский хук в ваш шаблон:

<body>
<?php do_action( 'wpse73370_custom_hook' ); ?>
21 нояб. 2012 г. 02:42:37
0

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 '<!-- пользовательский код -->';
}
9 мар. 2021 г. 14:45:37
0

После прочтения этого ответа я сделал следующее.

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. Например, класса или любого другого атрибута.

23 нояб. 2016 г. 20:15:17
1

Я не смог найти ни одного рабочего примера в интернете, но у меня есть одно решение, и я надеюсь, оно может кому-то помочь.

 jQuery(document).ready( function($) {
  $('body').prepend('<h1>Привет, мир</h1>');
 });

https://wordpress.org/support/topic/add_action-right-after-ltbodygt-tag

5 окт. 2014 г. 21:59:52
Комментарии

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

Sabir Abdul Gafoor Shaikh Sabir Abdul Gafoor Shaikh
10 мар. 2015 г. 15:14:18
0

Если вы используете 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%, и вы не хотите возиться с шаблоном, то это хорошая идея.

18 нояб. 2016 г. 02:11:41
4

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

21 нояб. 2012 г. 00:28:59
Комментарии

А что если посетитель сайта отключил javascript?

Ralf912 Ralf912
21 нояб. 2012 г. 01:38:21

Это самый костыльный костыль из всех :p

Nippysaurus Nippysaurus
21 нояб. 2012 г. 01:53:21

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

kaiser kaiser
21 нояб. 2012 г. 02:41:40

@kaiser Ты думаешь о вложенном буферизации вывода. Это иногда бывает немного сложно. Использование буферизации вывода с callback-функцией не так сложно, потому что callback будет вызываться при каждом вызове ob_ функции и перед вызовом ob_ функции.

Ralf912 Ralf912
21 нояб. 2012 г. 21:56:37
0

Да, это довольно просто:

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 по буферизации вывода для получения дополнительной информации.

21 нояб. 2012 г. 01:34:10