@nimayoleynik

Какой фильтр использовать в плагине для WP чтобы получить переменную всей страницы на этапе перед выдачей пользователю?

Какой фильтр использовать в add_filter чтобы получить переменную всей страницы на этапе перед выдачей пользователю ?

По сути пишу плагин который обрабатывает страницу перед ее выдачей пользователю но уже после работы WP и нужно подправить и body и header и footer. Сейчас работает на каких то костылях отдельно получая части сайта и правя их при этом совершая лишнюю работу дял каждого вызова. Намного удобнее было бы это делать 1 фильтром - в который попадала бы вся страница целиком перед выдачей пользователю. Да можно залезть в ядро и добавить собственный фильтр но не хотелось бы создавать велосипед с 2 парами педалей, не найдя 1-ые.
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Родного фильтра в WordPress для таких задач не существует. Можно решить через output buffering. Для этого создайте mu-plugin (он гарантированно будет выполняться до темы), в котором включите буферизацию и зарегистрируйте свой фильтр. Например, файл wp-content/mu-plugins/html_filter.php:
<?php
// Включаем буферизацию.
ob_start();

// Регистриуем свой фильтр на хуке shutdown, он выполняется в конце цикла работы WP, страница на этот момент сгенерирована.
add_action( 'shutdown', function() {
    $html = '';

    // Уровней буферизации может быть больше одного нашего, мы должны взять все:
    while( ob_get_level() ) {
        $html .= ob_get_clean();
    }

    // А теперь пропускаем финальный вывод через свой кастомный фильтр:
    echo apply_filters( 'filter_html', $html );
}, 0);

А теперь можем хукаться в наш фильтр:
add_filter( 'filter_html', function( $output ) {
    return str_replace( 'foo', 'bar', $output );
});

Писал с головы, без тестирования. Могут быть нюансы, но в целом смысл должен быть понятен.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
san_jorich
@san_jorich
Творческий кодер
переменную всей страницы
0-o
Если вы хотите "спарсить" весь загруженный код, то лучше jQuery(document).ready()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы