/** * Renders the content for a builder layout while in the loop. * This method should only be called by the_content filter as * defined in fl-builder.php. To output builder content, use * the_content function while in a WordPress loop. * * @since 1.0 * @param string $content The existing content. * @return string */ public static function render_content($content) { $post_id = FLBuilderModel::get_post_id(); $enabled = FLBuilderModel::is_builder_enabled(); $rendering = $post_id === self::$post_rendering; $ajax = defined('DOING_AJAX'); $in_loop = in_the_loop(); $is_global = in_array($post_id, FLBuilderModel::get_global_posts()); if ($enabled && !$rendering && !$ajax && ($in_loop || $is_global)) { // Set the post rendering ID. self::$post_rendering = $post_id; // Remove the builder's render_content filter so it's not called again. remove_filter('the_content', 'FLBuilder::render_content'); // Render the content. ob_start(); echo '<div class="' . self::render_content_classes() . '" data-post-id="' . $post_id . '">'; self::render_nodes(); echo '</div>'; $content = ob_get_clean(); // Reapply the builder's render_content filter. add_filter('the_content', 'FLBuilder::render_content'); // Do shortcodes here since letting the WP filter run can cause an infinite loop. $pattern = get_shortcode_regex(); $content = preg_replace_callback("/{$pattern}/s", 'FLBuilder::double_escape_shortcodes', $content); $content = do_shortcode($content); // Add srcset attrs to images with the class wp-image-<ID>. if (function_exists('wp_make_content_images_responsive')) { $content = wp_make_content_images_responsive($content); } // Clear the post rendering ID. self::$post_rendering = null; } return $content; }
/** * Renders the content for a builder layout while in the loop. * This method should only be called by the_content filter as * defined in fl-builder.php. To output builder content, use * the_content function while in a WordPress loop. * * @since 1.0 * @param string $content The existing content. * @return string */ public static function render_content($content) { global $wp_filter; $post_id = FLBuilderModel::get_post_id(); $enabled = FLBuilderModel::is_builder_enabled(); $rendering = $post_id === self::$post_rendering; $ajax = defined('DOING_AJAX'); $in_loop = in_the_loop(); $is_global = in_array($post_id, FLBuilderModel::get_global_posts()); if ($enabled && !$rendering && !$ajax && ($in_loop || $is_global)) { // Store this post ID so we know it is currently being rendered // in case another method or function calls apply filters on the // content after this method has run which creates an infinite loop. self::$post_rendering = $post_id; // Store a reference to the current the_content filters array since // any modules or widgets that call apply_filters on the_content cause // the array pointer to move to the end. That makes it so the builder // content doesn't receive filters after this method runs as it should. $filters = $wp_filter['the_content']; // Remove the builder's render_content filter so it's not called again // by modules or widgets that call apply_filters on the content. remove_filter('the_content', 'FLBuilder::render_content'); // Render the content. ob_start(); echo '<div class="fl-builder-content fl-builder-content-' . $post_id . '" data-post-id="' . $post_id . '">'; self::render_rows(); echo '</div>'; $content = ob_get_clean(); // Restore the original the_content filters array. $wp_filter['the_content'] = $filters; } return $content; }