Switcher
**Site relevance:** Antichrist.net
**Memory type:** plugin source memory
**Source path:** Antichrist.net/wp-content/plugins/uaix-locale-router/src/Switcher.php
**Size:** 4 KB
Summary
namespace UAIXLocaleRouter;
Source Preview
This source file is short enough to preview directly on its source-memory page.
<?php
namespace UAIXLocaleRouter;
use UAIXLocaleRouter\Support\Path;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
final class Switcher {
/**
* Register hooks.
*
* @return void
*/
public static function register() {
add_action( 'init', array( __CLASS__, 'handle_switch_request' ), 1 );
add_shortcode( 'uaix_locale_switcher', array( __CLASS__, 'render_shortcode' ) );
add_shortcode( 'ns12_locale_switcher', array( __CLASS__, 'render_shortcode' ) );
}
/**
* Handle a no-JS locale switch request.
*
* @return void
*/
public static function handle_switch_request() {
$using_legacy_request = empty( $_GET['uaixlr_switch_locale'] ) && ! empty( $_GET['ns12lr_switch_locale'] );
$locale_param = $using_legacy_request ? 'ns12lr_switch_locale' : 'uaixlr_switch_locale';
$nonce_param = $using_legacy_request ? 'ns12lr_switch_nonce' : 'uaixlr_switch_nonce';
$nonce_action = $using_legacy_request ? 'ns12lr_switch_locale' : 'uaixlr_switch_locale';
if ( empty( $_GET[ $locale_param ] ) ) {
return;
}
$nonce = isset( $_GET[ $nonce_param ] ) ? sanitize_text_field( wp_unslash( $_GET[ $nonce_param ] ) ) : '';
if ( ! wp_verify_nonce( $nonce, $nonce_action ) ) {
return;
}
$target_url_tag = LocaleRepository::normalize_url_tag( sanitize_text_field( wp_unslash( $_GET[ $locale_param ] ) ) );
if ( ! LocaleRepository::is_enabled_url_tag( $target_url_tag ) ) {
return;
}
$return_path_param = $using_legacy_request ? 'ns12lr_return_path' : 'uaixlr_return_path';
$return_query_param = $using_legacy_request ? 'ns12lr_return_query' : 'uaixlr_return_query';
$return_path = isset( $_GET[ $return_path_param ] ) ? (string) wp_unslash( $_GET[ $return_path_param ] ) : '/';
$return_query = isset( $_GET[ $return_query_param ] ) ? (string) wp_unslash( $_GET[ $return_query_param ] ) : '';
$redirect_url = self::build_switch_url( $target_url_tag, $return_path, $return_query );
if ( '' === $redirect_url ) {
return;
}
wp_safe_redirect( $redirect_url );
exit;
}
/**
* Build a safe locale-switch redirect URL.
*
* @param string $target_url_tag Target locale URL tag.
* @param string $return_path Return path.
* @param string $return_query Raw return query string.
* @return string
*/
public static function build_switch_url( $target_url_tag, $return_path = '/', $return_query = '' ) {
$target_url_tag = LocaleRepository::normalize_url_tag( $target_url_tag );
if ( ! LocaleRepository::is_enabled_url_tag( $target_url_tag ) ) {
return '';
}
$return_path = Path::normalize_path( $return_path );
parse_str( (string) $return_query, $query_args );
if ( ! is_array( $query_args ) ) {
$query_args = array();
}
unset(
$query_args['uaixlr_switch_locale'],
$query_args['uaixlr_return_path'],
$query_args['uaixlr_return_query'],
$query_args['uaixlr_switch_nonce'],
$query_args['ns12lr_switch_locale'],
$query_args['ns12lr_return_path'],
$query_args['ns12lr_return_query'],
$query_args['ns12lr_switch_nonce']
);
return Path::build_front_url( Path::localize_path( $return_path, $target_url_tag ), $query_args );
}
/**
* Render the locale switcher shortcode.
*
* @return string
*/
public static function render_shortcode() {
$locales = LocaleRepository::get_enabled_locales();
$current_url_tag = Router::get_current_url_tag();
$current_path = Router::get_original_request_path();
$query_args = Path::current_query_args();
unset(
$query_args['uaixlr_switch_locale'],
$query_args['uaixlr_return_path'],
$query_args['uaixlr_return_query'],
$query_args['uaixlr_switch_nonce'],
$query_args['ns12lr_switch_locale'],
$query_args['ns12lr_return_path'],
$query_args['ns12lr_return_query'],
$query_args['ns12lr_switch_nonce']
);
$template = Plugin::template_path( 'switcher.php' );
if ( ! file_exists( $template ) ) {
return '';
}
ob_start();
include $template;
return (string) ob_get_clean();
}
}