Search code examples
phpwordpressyoothemes

Yootheme Pro - Wordpress: Get content of page before it is displayed


I'm writing a simple plugin for wordpress that changes a single word on a page or a post to make it bold.

For example: vlbs -> vlbs

It works fine for normal Wordpress pages and posts with this code:

defined('ABSPATH') or die('You can\'t enter this site');

class VLBS {

    function __construct() {

    }

    function activate() {
        flush_rewrite_rules();
    }

    function deactivate() {
        flush_rewrite_rules();
    }

    function unstinstall() {
    }

function new_content($content) {
                return $content = str_replace('vlbs','<strong style="color:#00a500">vlbs</strong>', $content);    
}

}

if(class_exists('VLBS')){
    $VLBS = new VLBS();

}

add_filter('the_content', array($VLBS, 'new_content'));

//activation
register_activation_hook(__FILE__, array($VLBS, 'activate'));

//deactivation
register_deactivation_hook(__FILE__, array($VLBS, 'deactivate'));

However, it does not work on a page built with Yootheme Pro Pagebuilder. Whatever is done within the function new_content() is processed after the content has already been loaded. Thus, I cannot manipulate it before it is displayed to the user.

So the question would be: How can I get the content of a page before it is displayed? Is there an equivalent to Wordpress' 'the_content'?

Any help is really appreciated! Thank you very much in advance.

Best regards Fabian

Yootheme: 1.22.5
Wordpress: 5.2.4
PHP: 7.3
Browser: Tested on Chrome, Firefox, Edge, Internet Explorer


Solution

  • In your code, do you are sure it's the good usage of add_filter content ?

    In the doc, the 2nd parameter is string, not array:

    add_filter( 'the_content', 'filter_the_content_in_the_main_loop' );
    
    function filter_the_content_in_the_main_loop( $content ) {
    
        // Check if we're inside the main loop in a single post page.
        if ( is_single() && in_the_loop() && is_main_query() ) {
            return $content . esc_html__("I'm filtering the content inside the main loop", "my-textdomain");
        }
    
        return $content;
    }
    

    In wordpress, the_content function display the content. There is an other function for get_the_content

    Go to your page file and get the content. You can use str_replace and echo the new content after.

    Example single.php :

    if ( $query->have_posts() ) :               
        while( $query->have_posts() ) : $query->the_post();
    
            $content = get_the_content();
    
            $new_content = str_replace(search, replace, $content);
    
            echo $new_content;
    
        endwhile;
    endif;
    

    If it is not possible for you, try to use the output buffer functions. If you need use this functions, I say it and I developpe more this part. But test the solution above before.

    Oh, and it exist a special community for WP where your question will more pertinent : https://wordpress.stackexchange.com/