WordPress has great filter support for getting at all sorts of specific bits of content and modifying it before output. Like the_content
filter, which lets you access the markup for a post before it's output to the screen.
I'm trying to find a catch-all filter that gives me one last crack at modifying the final markup in its entirety before output.
I've browsed the list of filters a number of times, but nothing jumps out at me: https://codex.wordpress.org/Plugin_API/Filter_Reference
Anyone know of one?
WordPress doesn't have a "final output" filter, but you can hack together one. The below example resides within a "Must Use" plugin I've created for a project.
Note: I haven't tested with any plugins that might make use of the "shutdown" action.
The plugin works by iterating through all the open buffer levels, closing them and capturing their output. It then fires off the "final_output" filter, echoing the filtered content.
Sadly, WordPress performs almost the exact same process (closing the open buffers), but doesn't actually capture the buffer for filtering (just flushes it), so additional "shutdown" actions won't have access to it. Because of this, the below action is prioritized above WordPress's.
wp-content/mu-plugins/buffer.php
<?php /** * Output Buffering * * Buffers the entire WP process, capturing the final output for manipulation. */ ob_start(); add_action('shutdown', function() { $final = ''; // We'll need to get the number of ob levels we're in, so that we can iterate over each, collecting // that buffer's output into the final output. $levels = ob_get_level(); for ($i = 0; $i < $levels; $i++) { $final .= ob_get_clean(); } // Apply any filters to the final output echo apply_filters('final_output', $final); }, 0);
An example of hooking into the final_output filter:
<?php add_filter('final_output', function($output) { return str_replace('foo', 'bar', $output); });
Edit:
This code uses anonymous functions, which are only supported in PHP 5.3 or newer. If you're running a website using PHP 5.2 or older, you're doing yourself a disservice. PHP 5.2 was released in 2006, and even though Wordpress (edit: in WP version < 5.2) STILL supports it, you should not use it.
The question is may be old, but I have found a better way to do it:
function callback($buffer) { // modify buffer here, and then return the updated code return $buffer; } function buffer_start() { ob_start("callback"); } function buffer_end() { ob_end_flush(); } add_action('wp_head', 'buffer_start'); add_action('wp_footer', 'buffer_end');
Explanation This plugin code registers two actions – buffer_start
and buffer_end
.
buffer_start
is executed at the end of the header section of the html. The parameter, the callback
function, is called at the end of the output buffering. This occurs at the footer of the page, when the second registered action, buffer_end
, executes.
The callback
function is where you add your code to change the value of the output (the $buffer
variable). Then you simply return the modified code and the page will be displayed.
Notes Be sure to use unique function names for buffer_start
, buffer_end
, and callback
, so they do not conflict with other functions you may have in plugins.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With