Skip to content
wiki.fftac.org

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();
	}
}