From ca96ece534744473e8c42c00022a1ce2f9e32808 Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Fri, 7 Feb 2025 10:27:21 +0000 Subject: [PATCH 1/6] Fixed for content_replcament. Reverted method signature to allow for null values. Added unit tests and added a try and catch aswell to catch any future issues. --- .../includes/replacement/callbacks.php | 63 +++++++++---------- .../integration/ReplacementCallbacksTests.php | 8 +++ 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/plugins/faustwp/includes/replacement/callbacks.php b/plugins/faustwp/includes/replacement/callbacks.php index 84f11ca01..e044277c9 100644 --- a/plugins/faustwp/includes/replacement/callbacks.php +++ b/plugins/faustwp/includes/replacement/callbacks.php @@ -27,44 +27,43 @@ /** * Callback for WordPress 'the_content' filter. * - * @param string $content The post content. + * @param null|string $content The post content. * - * @return string The post content. + * @return null|string The post content. */ -function content_replacement( string $content ): string { - - if ( ! $content ) { - return ''; - } - - $replace_content_urls = domain_replacement_enabled(); - $replace_media_urls = ! use_wp_domain_for_media(); +function content_replacement( $content ) { - if ( ! $replace_content_urls && ! $replace_media_urls ) { - return $content; - } + try { + if ( ! $content ) { + return $content; + } + $replace_content_urls = domain_replacement_enabled(); + $replace_media_urls = ! use_wp_domain_for_media(); + if ( ! $replace_content_urls && ! $replace_media_urls ) { + return $content; + } + $wp_site_urls = faustwp_get_wp_site_urls( site_url() ); + if ( empty( $wp_site_urls ) ) { + return $content; + } + $relative_upload_url = faustwp_get_relative_upload_url( $wp_site_urls, wp_upload_dir()['baseurl'] ); + $wp_media_urls = faustwp_get_wp_media_urls( $wp_site_urls, $relative_upload_url ); + $frontend_uri = (string) faustwp_get_setting( 'frontend_uri' ) ?? '/'; + if ( $replace_content_urls && $replace_media_urls ) { + return str_replace( $wp_site_urls, $frontend_uri, $content ); + } + if ( $replace_media_urls ) { + return str_replace( $wp_media_urls, $frontend_uri . $relative_upload_url, $content ); + } + $site_urls_pattern = implode( '|', array_map( 'preg_quote', $wp_site_urls ) ); + $pattern = '#(' . $site_urls_pattern . ')(?!' . $relative_upload_url . '(\/|$))#'; - $wp_site_urls = faustwp_get_wp_site_urls( site_url() ); - if ( empty( $wp_site_urls ) ) { + return preg_replace( $pattern, $frontend_uri, $content ); + } catch ( \Exception $e ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( 'Error replacing content URLs: ' . $e->getMessage() ); return $content; } - - $relative_upload_url = faustwp_get_relative_upload_url( $wp_site_urls, wp_upload_dir()['baseurl'] ); - $wp_media_urls = faustwp_get_wp_media_urls( $wp_site_urls, $relative_upload_url ); - $frontend_uri = (string) faustwp_get_setting( 'frontend_uri' ) ?? '/'; - - if ( $replace_content_urls && $replace_media_urls ) { - return str_replace( $wp_site_urls, $frontend_uri, $content ); - } - - if ( $replace_media_urls ) { - return str_replace( $wp_media_urls, $frontend_uri . $relative_upload_url, $content ); - } - - $site_urls_pattern = implode( '|', array_map( 'preg_quote', $wp_site_urls ) ); - $pattern = '#(' . $site_urls_pattern . ')(?!' . $relative_upload_url . '(\/|$))#'; - - return preg_replace( $pattern, $frontend_uri, $content ); } /** diff --git a/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php b/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php index 1e8728d44..dbea8128c 100644 --- a/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php +++ b/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php @@ -92,6 +92,14 @@ public function test_wp_calculate_image_srcset_filter(): void { self::assertSame( 10, has_action( 'wp_calculate_image_srcset', 'WPE\FaustWP\Replacement\image_source_srcset_replacement' ) ); } + + /** + * Test to make sure content rep can accept null values + */ + public function test_content_replacement_for_null_content_replacement() { + $this->assertNull(content_replacement( null ) ); + } + /** * Tests content_replacement() returns original value when content replacement is not enabled. */ From 70866741ffb7272cdba2b83a8a66b700c7e9d2e4 Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Fri, 7 Feb 2025 10:30:54 +0000 Subject: [PATCH 2/6] Added changeset. Fixes #2037 --- .changeset/afraid-panthers-pay.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/afraid-panthers-pay.md diff --git a/.changeset/afraid-panthers-pay.md b/.changeset/afraid-panthers-pay.md new file mode 100644 index 000000000..196e75591 --- /dev/null +++ b/.changeset/afraid-panthers-pay.md @@ -0,0 +1,5 @@ +--- +"@faustwp/wordpress-plugin": patch +--- + +Bug: Fixed an issue with the function content_replacement throwing a 500 error for a null value. From 88509101c5c7908fc2f8095c565dc1cf9411b81c Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Fri, 7 Feb 2025 10:37:06 +0000 Subject: [PATCH 3/6] Updated test name. --- plugins/faustwp/tests/integration/ReplacementCallbacksTests.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php b/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php index dbea8128c..5d8d49114 100644 --- a/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php +++ b/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php @@ -96,7 +96,7 @@ public function test_wp_calculate_image_srcset_filter(): void { /** * Test to make sure content rep can accept null values */ - public function test_content_replacement_for_null_content_replacement() { + public function test_content_replacement_for_null_values() { $this->assertNull(content_replacement( null ) ); } From d8f482552d78c7bcadc02766630e1106b4bb3850 Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Fri, 7 Feb 2025 11:05:11 +0000 Subject: [PATCH 4/6] Code review changes. --- .../includes/replacement/callbacks.php | 58 +++++++++---------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/plugins/faustwp/includes/replacement/callbacks.php b/plugins/faustwp/includes/replacement/callbacks.php index e044277c9..43465fc29 100644 --- a/plugins/faustwp/includes/replacement/callbacks.php +++ b/plugins/faustwp/includes/replacement/callbacks.php @@ -27,43 +27,37 @@ /** * Callback for WordPress 'the_content' filter. * - * @param null|string $content The post content. + * @param string $content The post content. * - * @return null|string The post content. + * @return string The post content. */ -function content_replacement( $content ) { - - try { - if ( ! $content ) { - return $content; - } - $replace_content_urls = domain_replacement_enabled(); - $replace_media_urls = ! use_wp_domain_for_media(); - if ( ! $replace_content_urls && ! $replace_media_urls ) { - return $content; - } - $wp_site_urls = faustwp_get_wp_site_urls( site_url() ); - if ( empty( $wp_site_urls ) ) { - return $content; - } - $relative_upload_url = faustwp_get_relative_upload_url( $wp_site_urls, wp_upload_dir()['baseurl'] ); - $wp_media_urls = faustwp_get_wp_media_urls( $wp_site_urls, $relative_upload_url ); - $frontend_uri = (string) faustwp_get_setting( 'frontend_uri' ) ?? '/'; - if ( $replace_content_urls && $replace_media_urls ) { - return str_replace( $wp_site_urls, $frontend_uri, $content ); - } - if ( $replace_media_urls ) { - return str_replace( $wp_media_urls, $frontend_uri . $relative_upload_url, $content ); - } - $site_urls_pattern = implode( '|', array_map( 'preg_quote', $wp_site_urls ) ); - $pattern = '#(' . $site_urls_pattern . ')(?!' . $relative_upload_url . '(\/|$))#'; +function content_replacement( $content = '' ) { - return preg_replace( $pattern, $frontend_uri, $content ); - } catch ( \Exception $e ) { - // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log - error_log( 'Error replacing content URLs: ' . $e->getMessage() ); + if ( ! $content ) { + return $content; + } + $replace_content_urls = domain_replacement_enabled(); + $replace_media_urls = ! use_wp_domain_for_media(); + if ( ! $replace_content_urls && ! $replace_media_urls ) { + return $content; + } + $wp_site_urls = faustwp_get_wp_site_urls( site_url() ); + if ( empty( $wp_site_urls ) ) { return $content; } + $relative_upload_url = faustwp_get_relative_upload_url( $wp_site_urls, wp_upload_dir()['baseurl'] ); + $wp_media_urls = faustwp_get_wp_media_urls( $wp_site_urls, $relative_upload_url ); + $frontend_uri = (string) faustwp_get_setting( 'frontend_uri' ) ?? '/'; + if ( $replace_content_urls && $replace_media_urls ) { + return str_replace( $wp_site_urls, $frontend_uri, $content ); + } + if ( $replace_media_urls ) { + return str_replace( $wp_media_urls, $frontend_uri . $relative_upload_url, $content ); + } + $site_urls_pattern = implode( '|', array_map( 'preg_quote', $wp_site_urls ) ); + $pattern = '#(' . $site_urls_pattern . ')(?!' . $relative_upload_url . '(\/|$))#'; + + return preg_replace( $pattern, $frontend_uri, $content ); } /** From cdf703ad3aa0e4dc7cf76592b0a3d5dffbb5c3b6 Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Fri, 7 Feb 2025 12:34:19 +0000 Subject: [PATCH 5/6] Changed signature to match what is in content blocks for the content resolver. --- plugins/faustwp/includes/replacement/callbacks.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/faustwp/includes/replacement/callbacks.php b/plugins/faustwp/includes/replacement/callbacks.php index 43465fc29..6019ec60e 100644 --- a/plugins/faustwp/includes/replacement/callbacks.php +++ b/plugins/faustwp/includes/replacement/callbacks.php @@ -27,11 +27,11 @@ /** * Callback for WordPress 'the_content' filter. * - * @param string $content The post content. + * @param ?string $content The post content. * - * @return string The post content. + * @return ?string The post content. */ -function content_replacement( $content = '' ) { +function content_replacement( ?string $content ) { if ( ! $content ) { return $content; From b4b69608f8bcf3623ab27d413fbf701a10e6af67 Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Fri, 7 Feb 2025 13:38:01 +0000 Subject: [PATCH 6/6] Updated tests. Declared strict_types to the replacement files to catch any futher errors. --- plugins/faustwp/includes/replacement/callbacks.php | 2 ++ plugins/faustwp/includes/replacement/functions.php | 4 +++- .../tests/integration/ReplacementCallbacksTests.php | 7 +++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/faustwp/includes/replacement/callbacks.php b/plugins/faustwp/includes/replacement/callbacks.php index 6019ec60e..8b8214860 100644 --- a/plugins/faustwp/includes/replacement/callbacks.php +++ b/plugins/faustwp/includes/replacement/callbacks.php @@ -5,6 +5,8 @@ * @package FaustWP */ +declare(strict_types=1); + namespace WPE\FaustWP\Replacement; use function WPE\FaustWP\Settings\{ diff --git a/plugins/faustwp/includes/replacement/functions.php b/plugins/faustwp/includes/replacement/functions.php index 645aa1eb2..27e4fbda2 100644 --- a/plugins/faustwp/includes/replacement/functions.php +++ b/plugins/faustwp/includes/replacement/functions.php @@ -5,6 +5,8 @@ * @package FaustWP */ +declare(strict_types=1); + namespace WPE\FaustWP\Replacement; use function WPE\FaustWP\Settings\{ @@ -144,7 +146,7 @@ function faustwp_get_wp_site_urls( string $site_url ): array { $host_url = wp_parse_url( $site_url, PHP_URL_HOST ); - $is_https = strpos( $site_url, 0, 6 ) === 'https:'; + $is_https = strpos( $site_url, 'https://' ) === 0; return apply_filters( 'faustwp_get_wp_site_urls', diff --git a/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php b/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php index 5d8d49114..9caefbe75 100644 --- a/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php +++ b/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php @@ -96,8 +96,11 @@ public function test_wp_calculate_image_srcset_filter(): void { /** * Test to make sure content rep can accept null values */ - public function test_content_replacement_for_null_values() { - $this->assertNull(content_replacement( null ) ); + public function test_content_replacement_for_different_types() { + $this->assertNull(content_replacement( null)); + $this->assertEmpty(content_replacement('')); + $content = '

This is a string with no URLs to be replaced.

'; + $this->assertEquals($content, content_replacement($content)); } /**