Родного фильтра в 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 );
});
Писал с головы, без тестирования. Могут быть нюансы, но в целом смысл должен быть понятен.