From 166a5e6f7cf1b571cf46da3e2c4ae288f4e7cb01 Mon Sep 17 00:00:00 2001 From: magdev Date: Mon, 2 Feb 2026 16:52:13 +0100 Subject: [PATCH] fix: Complete memory leak fix for shortcode context handling - Changed shortcode context from boolean to depth counter for nested shortcodes - Added shortcode context protection to template-wrapper.php for single page views - Fixes remaining recursion path in single FediStream post views Co-Authored-By: Claude Opus 4.5 --- CHANGELOG.md | 12 +++++++++++- includes/Frontend/TemplateLoader.php | 19 +++++++++++-------- includes/Frontend/template-wrapper.php | 6 ++++++ wp-fedistream.php | 4 ++-- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b7fdc4..33a9aaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.4.3] - 2026-02-02 + +### Fixed + +- **Further memory leak fix** - v0.4.2 fix was still incomplete + - Changed `$in_shortcode_context` boolean to `$shortcode_context_depth` counter to properly handle nested shortcodes + - Added shortcode context protection to `template-wrapper.php` for single page views + - This fixes the remaining recursion path where `the_content` filter was still being applied when viewing single FediStream posts (artists, albums, tracks, playlists) + ## [0.4.2] - 2026-02-02 ### Fixed @@ -217,7 +226,8 @@ Initial release of WP FediStream - a WordPress plugin for streaming music over A --- -[Unreleased]: https://src.bundespruefstelle.ch/magdev/wp-fedistream/compare/v0.4.2...HEAD +[Unreleased]: https://src.bundespruefstelle.ch/magdev/wp-fedistream/compare/v0.4.3...HEAD +[0.4.3]: https://src.bundespruefstelle.ch/magdev/wp-fedistream/compare/v0.4.2...v0.4.3 [0.4.2]: https://src.bundespruefstelle.ch/magdev/wp-fedistream/compare/v0.4.1...v0.4.2 [0.4.1]: https://src.bundespruefstelle.ch/magdev/wp-fedistream/compare/v0.4.0...v0.4.1 [0.4.0]: https://src.bundespruefstelle.ch/magdev/wp-fedistream/compare/v0.3.0...v0.4.0 diff --git a/includes/Frontend/TemplateLoader.php b/includes/Frontend/TemplateLoader.php index eb0e1cc..822fc97 100644 --- a/includes/Frontend/TemplateLoader.php +++ b/includes/Frontend/TemplateLoader.php @@ -36,12 +36,13 @@ class TemplateLoader { private const MAX_RECURSION_DEPTH = 3; /** - * Whether we're currently in a shortcode rendering context. - * When true, the_content filter is skipped to prevent recursive shortcode processing. + * Shortcode rendering context depth counter. + * When > 0, the_content filter is skipped to prevent recursive shortcode processing. + * Using a counter instead of boolean to handle nested shortcodes properly. * - * @var bool + * @var int */ - private static bool $in_shortcode_context = false; + private static int $shortcode_context_depth = 0; /** * Enter shortcode rendering context. @@ -50,7 +51,7 @@ class TemplateLoader { * @return void */ public static function enter_shortcode_context(): void { - self::$in_shortcode_context = true; + ++self::$shortcode_context_depth; } /** @@ -60,7 +61,9 @@ class TemplateLoader { * @return void */ public static function exit_shortcode_context(): void { - self::$in_shortcode_context = false; + if ( self::$shortcode_context_depth > 0 ) { + --self::$shortcode_context_depth; + } } /** @@ -69,7 +72,7 @@ class TemplateLoader { * @return bool */ public static function is_in_shortcode_context(): bool { - return self::$in_shortcode_context; + return self::$shortcode_context_depth > 0; } /** @@ -253,7 +256,7 @@ class TemplateLoader { // Skip the_content filter if: // 1. We're in a shortcode context (prevents recursive shortcode processing) // 2. We're at depth > 1 (nested data loading) - $skip_content_filter = self::$in_shortcode_context || self::$recursion_depth > 1; + $skip_content_filter = self::$shortcode_context_depth > 0 || self::$recursion_depth > 1; $data = array( 'id' => $post->ID, diff --git a/includes/Frontend/template-wrapper.php b/includes/Frontend/template-wrapper.php index f2dc859..1a6edce 100644 --- a/includes/Frontend/template-wrapper.php +++ b/includes/Frontend/template-wrapper.php @@ -13,6 +13,9 @@ if ( ! defined( 'ABSPATH' ) ) { use WP_FediStream\Plugin; use WP_FediStream\Frontend\TemplateLoader; +// Enter shortcode context to prevent recursive shortcode processing in post content. +TemplateLoader::enter_shortcode_context(); + // Get template context. $context = TemplateLoader::get_context(); @@ -75,4 +78,7 @@ get_header();