diff --git a/.changeset/long-laws-doubt.md b/.changeset/long-laws-doubt.md new file mode 100644 index 000000000..51c5fc8b8 --- /dev/null +++ b/.changeset/long-laws-doubt.md @@ -0,0 +1,5 @@ +--- +"@faustwp/wordpress-plugin": patch +--- + +Fixed issue in content_replacement when site_url() contains port diff --git a/.github/workflows/e2e-next-faustwp-example.yml b/.github/workflows/e2e-next-faustwp-example.yml index 8d868a283..f98bfa6ce 100644 --- a/.github/workflows/e2e-next-faustwp-example.yml +++ b/.github/workflows/e2e-next-faustwp-example.yml @@ -2,8 +2,8 @@ name: E2E Test Packages on: pull_request: - paths-ignore: - - '**/*.md' + paths: + - 'examples/next/**' jobs: e2e-test-faustwp-getting-started-example: diff --git a/plugins/faustwp/includes/replacement/callbacks.php b/plugins/faustwp/includes/replacement/callbacks.php index f352563d2..12dda06ed 100644 --- a/plugins/faustwp/includes/replacement/callbacks.php +++ b/plugins/faustwp/includes/replacement/callbacks.php @@ -27,7 +27,11 @@ add_filter( 'the_content', __NAMESPACE__ . '\\content_replacement' ); add_filter( 'wpgraphql_content_blocks_resolver_content', __NAMESPACE__ . '\\content_replacement' ); /** - * Callback for WordPress 'the_content' filter. + * Replace the URLs in the post content basesd on two settings if enabled: + * 1. Enable Post and Category URL rewrites - rewrite the WordPress internal URL in the content with the Front-end URL + * 1.1 If NOT enabled - use the WordPress URL + * 2. Use the WordPress domain for media URLs in post content - use WordPress URL for media files (images,csv,pdf) + * 2.1 If NOT enabled - use front-end url * * @param ?string $content The post content. * @@ -40,6 +44,7 @@ function content_replacement( ?string $content ) { } $replace_content_urls = domain_replacement_enabled(); $replace_media_urls = ! use_wp_domain_for_media(); + if ( ! $replace_content_urls && ! $replace_media_urls ) { return $content; } @@ -50,16 +55,46 @@ function content_replacement( ?string $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 "Enable Post and Category URL" is enabled, use front-end URL for internal URLs, but not for media links */ + + if ( $replace_content_urls ) { + + // Look for href links. + preg_match_all( '#href="([^"]+)"#i', $content, $href_links ); + if ( is_array( $href_links ) && ! empty( $href_links[1] ) ) { + foreach ( $href_links[1] as $i => $url ) { + // skip media links. + $is_media = array_filter( $wp_media_urls, fn( $media ) => strpos( $url, $media ) === 0 ); + if ( $is_media ) { + continue; + } + + $is_wp_url = array_filter( $wp_site_urls, fn( $base ) => strpos( $url, $base ) === 0 ); + if ( ! $is_wp_url ) { + continue; + } + + // get relative link. + $relative = str_replace( reset( $is_wp_url ), '', $url ); + $updated = 'href="' . $frontend_uri . $relative . '"'; + + $original = $href_links[0][ $i ]; + + if ( $original ) { + $content = str_replace( $original, $updated, $content ); + } + } + } } + + /* If "Use the WordPress domain for media URLs in post content" is NOT enabled, use front-end URL for media URLs */ + if ( $replace_media_urls ) { - return str_replace( $wp_media_urls, $frontend_uri . $relative_upload_url, $content ); + $content = 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 ); + return $content; } /** diff --git a/plugins/faustwp/includes/replacement/functions.php b/plugins/faustwp/includes/replacement/functions.php index 27e4fbda2..34e3866e9 100644 --- a/plugins/faustwp/includes/replacement/functions.php +++ b/plugins/faustwp/includes/replacement/functions.php @@ -136,7 +136,7 @@ function is_wp_link_ajax_request(): bool { /** - * Get all site URLs for each possible HTTP protocol + * Get all site URLs for each possible HTTP protocol. * * @param string $site_url The site url. * @@ -144,8 +144,11 @@ function is_wp_link_ajax_request(): bool { */ function faustwp_get_wp_site_urls( string $site_url ): array { - $host_url = wp_parse_url( $site_url, PHP_URL_HOST ); - + $host_url_parse = wp_parse_url( $site_url ); + $host_url = $host_url_parse['host'] ?? ''; + if ( ! empty( $host_url_parse['port'] ) ) { + $host_url .= ':' . $host_url_parse['port']; + } $is_https = strpos( $site_url, 'https://' ) === 0; return apply_filters( @@ -158,6 +161,7 @@ function faustwp_get_wp_site_urls( string $site_url ): array { ); } + /** * Get all media urls based off the available site urls * @@ -180,18 +184,16 @@ function faustwp_get_wp_media_urls( array $wp_site_urls, string $relative_upload /** * Gets the relative wp-content upload URL. * - * @param array $site_urls An array of site URLs. - * @param string $upload_url An array of site URLs. + * @param array|string $site_urls An array of site URLs. + * @param string $upload_url An array of site URLs. * * @return string The relative upload URL. */ function faustwp_get_relative_upload_url( array $site_urls, string $upload_url = '' ): string { - foreach ( $site_urls as $site_url ) { if ( strpos( $upload_url, $site_url ) === 0 ) { return (string) str_replace( $site_url, '', $upload_url ); } } - return ''; } diff --git a/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php b/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php index 71d4a3be9..e72f6b870 100644 --- a/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php +++ b/plugins/faustwp/tests/integration/ReplacementCallbacksTests.php @@ -642,4 +642,29 @@ public function test_image_sourceset_replacement_for_different_http_protocols_wi $this->assertSame( $expected, image_source_srcset_replacement( $sources ) ); } + public function test_for_media_when_replacement_is_disabled_and_url_contains_port() { + + $frontend_uri = 'http://localhost:3000'; + + update_option('siteurl', 'http://localhost:8881'); + $site_url = site_url(); + + faustwp_update_setting( 'frontend_uri', $frontend_uri ); + faustwp_update_setting( 'enable_image_source', '0' ); + + $this->assertSame( $frontend_uri . '/wp-content/uploads/sites/2/2024/12/WP-Engine-Blue-888x459-1-300x155.webp', content_replacement( $site_url . '/wp-content/uploads/sites/2/2024/12/WP-Engine-Blue-888x459-1-300x155.webp' ) ); + } + public function test_URL_replacement_is_disabled_and_url_contains_port() { + + $frontend_uri = 'http://localhost:3000'; + + update_option('siteurl', 'http://localhost:8881'); + $site_url = site_url(); + + faustwp_update_setting( 'frontend_uri', $frontend_uri ); + faustwp_update_setting( 'enable_rewrites', '0' ); + + $this->assertSame( $frontend_uri . '/sample-page', content_replacement( $site_url . '/sample-page' ) ); + } + }