fix sitemap 5

This commit is contained in:
hanyixuanten
2026-07-27 18:55:36 +08:00
parent 451de60281
commit b19fbf5fa5
2 changed files with 43 additions and 8 deletions
@@ -22,6 +22,7 @@ class BTRANSLATE_Language_Router {
}
add_rewrite_tag( '%btranslate_language%', '(' . $language_pattern . ')' );
add_rewrite_rule( '^(' . $language_pattern . ')/sitemap\.xml$', 'index.php?btranslate_language=$matches[1]&btranslate_sitemap=1', 'top' );
add_rewrite_rule( '^(' . $language_pattern . ')/(.*)$', 'index.php?btranslate_language=$matches[1]&pagename=$matches[2]', 'top' );
add_rewrite_rule( '^(' . $language_pattern . ')/?$', 'index.php?btranslate_language=$matches[1]', 'top' );
}
@@ -10,18 +10,34 @@ class BTRANSLATE_Sitemap_Controller {
}
public function register() {
add_filter( 'query_vars', array( $this, 'query_vars' ) );
add_action( 'parse_request', array( $this, 'capture_request' ), 20 );
add_action( 'template_redirect', array( $this, 'maybe_serve_localized_sitemap' ), 0 );
}
public function query_vars( $query_vars ) {
$query_vars[] = 'btranslate_sitemap';
return $query_vars;
}
public function capture_request( $wp ) {
$settings = BTRANSLATE_Settings::get();
$language = $this->requested_language( $this->request_path(), $settings );
if ( '' === $language ) {
return;
}
$wp->query_vars['btranslate_language'] = $language;
$wp->query_vars['btranslate_sitemap'] = '1';
}
public function maybe_serve_localized_sitemap() {
$settings = BTRANSLATE_Settings::get();
$language = $this->router->current_language();
if ( $language === sanitize_key( $settings['source_language'] ) || ! in_array( $language, BTRANSLATE_Settings::target_languages(), true ) ) {
return;
}
if ( ! $this->is_sitemap_request( $this->request_path(), $language, $settings['routing_mode'] ) ) {
if ( '1' !== (string) get_query_var( 'btranslate_sitemap' ) || $language === sanitize_key( $settings['source_language'] ) || ! in_array( $language, BTRANSLATE_Settings::target_languages(), true ) ) {
return;
}
@@ -67,10 +83,28 @@ class BTRANSLATE_Sitemap_Controller {
return is_string( $path ) ? '/' . ltrim( $path, '/' ) : '';
}
private function is_sitemap_request( $path, $language, $routing_mode ) {
$expected_path = 'subdirectory' === $routing_mode ? '/' . $language . '/sitemap.xml' : '/sitemap.xml';
private function requested_language( $path, $settings ) {
if ( 'subdirectory' === $settings['routing_mode'] ) {
foreach ( BTRANSLATE_Settings::target_languages() as $language ) {
$language = sanitize_key( $language );
return $expected_path === untrailingslashit( $path );
if ( '/' . $language . '/sitemap.xml' === untrailingslashit( $path ) ) {
return $language;
}
}
return '';
}
if ( '/sitemap.xml' !== untrailingslashit( $path ) ) {
return '';
}
$host = isset( $_SERVER['HTTP_HOST'] ) ? BTRANSLATE_Settings::normalize_domain( wp_unslash( $_SERVER['HTTP_HOST'] ) ) : '';
$bindings = (array) $settings['domain_bindings'];
$language = isset( $bindings[ $host ] ) ? sanitize_key( $bindings[ $host ] ) : '';
return in_array( $language, BTRANSLATE_Settings::target_languages(), true ) ? $language : '';
}
private function source_sitemap_url() {