diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a7c293..f417337 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Changing post's language via bulk edit (#66). - Filter for posts without language or unknown languages in the back-office post list for translatable post types. - Filter `ubb_translatable_routes` for routes outside of post/term/archives that the user wants to be available in other languages when using the method `LangInterface::translate_current_url()`. +- `SDK\LanguageContext` to provide a more human readable interface for language context switching. ### Changed diff --git a/lib/LangInterface.php b/lib/LangInterface.php index bb007d3..65cd81e 100644 --- a/lib/LangInterface.php +++ b/lib/LangInterface.php @@ -6,6 +6,7 @@ use TwentySixB\WP\Plugin\Unbabble\DB\PostTable; use TwentySixB\WP\Plugin\Unbabble\DB\TermTable; use TwentySixB\WP\Plugin\Unbabble\Options; +use TwentySixB\WP\Plugin\Unbabble\SDK\LanguageContext; use WP_Post; use WP_Query; use WP_Term; @@ -135,7 +136,7 @@ public static function get_current_language() : string { * * @param string $language Current language. */ - return apply_filters( 'ubb_current_lang', \sanitize_text_field( $lang ) ); + return \apply_filters( 'ubb_current_lang', \sanitize_text_field( $lang ) ); } /** @@ -939,21 +940,21 @@ public static function translate_current_url( string $lang ) : string { // Try to translate posts archive url. if ( $wp_the_query instanceof WP_Query && $wp_the_query->is_posts_page ) { - add_filter( 'ubb_current_lang', $fn = fn () => $lang ); - $page_for_posts = get_option( 'page_for_posts' ); - $home_url = home_url(); - remove_filter( 'ubb_current_lang', $fn ); + LanguageContext::switch_to_language( $lang ); + $page_for_posts = \get_option( 'page_for_posts' ); + $home_url = \home_url(); + LanguageContext::restore_language(); if ( empty( $page_for_posts ) ) { return $home_url; } - return get_permalink( $page_for_posts ); + return \get_permalink( $page_for_posts ); } // Try to translate a post types archive url. if ( $wp_the_query instanceof WP_Query && $wp_the_query->is_post_type_archive() ) { - add_filter( 'ubb_current_lang', $fn = fn () => $lang ); - $archive_link = get_post_type_archive_link( $wp_the_query->query['post_type'] ); - remove_filter( 'ubb_current_lang', $fn ); + LanguageContext::switch_to_language( $lang ); + $archive_link = \get_post_type_archive_link( $wp_the_query->query['post_type'] ); + LanguageContext::restore_language(); return $archive_link; } @@ -964,17 +965,17 @@ public static function translate_current_url( string $lang ) : string { ) { $term_id = $wp_the_query->queried_object->term_id ?? null; if ( $term_id === null ) { - add_filter( 'ubb_current_lang', $fn = fn () => $lang ); + LanguageContext::switch_to_language( $lang ); $home_url = home_url(); - remove_filter( 'ubb_current_lang', $fn ); + LanguageContext::restore_language(); return $home_url; } $translation = self::get_term_translation( $term_id, $lang ); if ( $translation ) { - add_filter( 'ubb_current_lang', $fn = fn () => $lang ); - $translation_permalink = get_term_link( $translation ); - remove_filter( 'ubb_current_lang', $fn ); + LanguageContext::switch_to_language( $lang ); + $translation_permalink = \get_term_link( $translation ); + LanguageContext::restore_language(); return $translation_permalink; } } @@ -983,17 +984,17 @@ public static function translate_current_url( string $lang ) : string { if ( $wp_the_query instanceof WP_Query && $wp_the_query->is_singular() ) { $post_id = $wp_the_query->queried_object->ID ?? null; if ( $post_id === null ) { - add_filter( 'ubb_current_lang', $fn = fn () => $lang ); + LanguageContext::switch_to_language( $lang ); $home_url = home_url(); - remove_filter( 'ubb_current_lang', $fn ); + LanguageContext::restore_language(); return $home_url; } $translation = self::get_post_translation( $post_id, $lang ); if ( $translation ) { - add_filter( 'ubb_current_lang', $fn = fn () => $lang ); + LanguageContext::switch_to_language( $lang ); $translation_permalink = get_permalink( $translation ); - remove_filter( 'ubb_current_lang', $fn ); + LanguageContext::restore_language(); return $translation_permalink; } } @@ -1042,9 +1043,9 @@ public static function translate_current_url( string $lang ) : string { } // Default to home_url of the language. - add_filter( 'ubb_current_lang', $fn = fn () => $lang ); + LanguageContext::switch_to_language( $lang ); $lang_link = home_url(); - remove_filter( 'ubb_current_lang', $fn ); + LanguageContext::restore_language(); return $lang_link; } diff --git a/lib/Router/Directory.php b/lib/Router/Directory.php index 9abfcb5..5e42de4 100644 --- a/lib/Router/Directory.php +++ b/lib/Router/Directory.php @@ -4,6 +4,7 @@ use TwentySixB\WP\Plugin\Unbabble\LangInterface; use TwentySixB\WP\Plugin\Unbabble\Options; +use TwentySixB\WP\Plugin\Unbabble\SDK\LanguageContext; use WP_Post; use WP_Term; @@ -440,7 +441,7 @@ public function network_home_url( string $url, string $path ) : string { $curr_origin_lang !== LangInterface::get_default_language() && LangInterface::is_language_allowed( $curr_origin_lang ) ) { - add_filter( 'ubb_current_lang', $fn = fn () => $curr_origin_lang ); + LanguageContext::switch_to_language( $curr_origin_lang ); $router_type = Options::get_router(); if ( $router_type === 'query_var' ) { add_filter( 'ubb_home_url', '__return_true' ); @@ -450,7 +451,7 @@ public function network_home_url( string $url, string $path ) : string { } else { $new_url = home_url( $path ); } - remove_filter( 'ubb_current_lang', $fn ); + LanguageContext::restore_language(); } } restore_current_blog(); diff --git a/lib/Router/QueryVar.php b/lib/Router/QueryVar.php index 8360031..e9f720a 100644 --- a/lib/Router/QueryVar.php +++ b/lib/Router/QueryVar.php @@ -4,6 +4,7 @@ use TwentySixB\WP\Plugin\Unbabble\LangInterface; use TwentySixB\WP\Plugin\Unbabble\Options; +use TwentySixB\WP\Plugin\Unbabble\SDK\LanguageContext; use WP_Post; use WP_Term; @@ -305,7 +306,7 @@ public function network_home_url( string $url, string $path ) : string { $curr_origin_lang !== LangInterface::get_default_language() && LangInterface::is_language_allowed( $curr_origin_lang ) ) { - add_filter( 'ubb_current_lang', $fn = fn () => $curr_origin_lang ); + LanguageContext::switch_to_language( $curr_origin_lang ); $router_type = Options::get_router(); if ( $router_type === 'directory' ) { add_filter( 'ubb_home_url', '__return_true' ); @@ -315,7 +316,7 @@ public function network_home_url( string $url, string $path ) : string { } else { $new_url = home_url( $path ); } - remove_filter( 'ubb_current_lang', $fn ); + LanguageContext::restore_language(); } } restore_current_blog(); diff --git a/lib/SDK/LanguageContext.php b/lib/SDK/LanguageContext.php new file mode 100644 index 0000000..7056bf2 --- /dev/null +++ b/lib/SDK/LanguageContext.php @@ -0,0 +1,75 @@ +