Skip to content
wiki.fftac.org

Adminpages - Source Excerpt 01

Back to Adminpages

Summary

This source excerpt preserves a bounded section of Antichrist.net/wp-content/plugins/uaix-locale-router/src/Admin/AdminPages.php so readers can inspect the evidence without opening the full source file.

**Source path:** Antichrist.net/wp-content/plugins/uaix-locale-router/src/Admin/AdminPages.php

<?php

namespace UAIXLocaleRouter\Admin;

use UAIXLocaleRouter\Plugin;
use UAIXLocaleRouter\Support\Html;


if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

final class AdminPages {
	/**
	 * Register admin hooks.
	 *
	 * @return void
	 */
	public static function register() {
		add_action( 'admin_menu', array( __CLASS__, 'register_menus' ) );
		add_action( 'admin_notices', array( __CLASS__, 'render_admin_notices' ) );

		add_action( 'admin_post_uaixlr_save_settings', array( SettingsPage::class, 'handle_save_settings' ) );
		add_action( 'admin_post_uaixlr_repair_runtime', array( StatusPage::class, 'handle_repair_runtime' ) );
		add_action( 'admin_post_uaixlr_repair_htaccess', array( StatusPage::class, 'handle_repair_htaccess' ) );
		add_action( 'admin_post_uaixlr_add_locale', array( SettingsPage::class, 'handle_add_locale' ) );
		add_action( 'admin_post_uaixlr_update_locales', array( SettingsPage::class, 'handle_update_locales' ) );
		add_action( 'admin_post_uaixlr_upload_dictionary', array( DictionariesPage::class, 'handle_upload' ) );
		add_action( 'admin_post_uaixlr_download_template', array( DictionariesPage::class, 'handle_download_template' ) );
		add_action( 'admin_post_uaixlr_download_dictionary', array( DictionariesPage::class, 'handle_download_dictionary' ) );
		add_action( 'admin_post_uaixlr_run_validations', array( ValidationPage::class, 'handle_run_validations' ) );

		// Deprecated NS12 admin action aliases keep bookmarked forms and older automations working.
		add_action( 'admin_post_ns12lr_save_settings', array( SettingsPage::class, 'handle_save_settings' ) );
		add_action( 'admin_post_ns12lr_repair_runtime', array( StatusPage::class, 'handle_repair_runtime' ) );
		add_action( 'admin_post_ns12lr_repair_htaccess', array( StatusPage::class, 'handle_repair_htaccess' ) );
		add_action( 'admin_post_ns12lr_add_locale', array( SettingsPage::class, 'handle_add_locale' ) );
		add_action( 'admin_post_ns12lr_update_locales', array( SettingsPage::class, 'handle_update_locales' ) );
		add_action( 'admin_post_ns12lr_upload_dictionary', array( DictionariesPage::class, 'handle_upload' ) );
		add_action( 'admin_post_ns12lr_download_template', array( DictionariesPage::class, 'handle_download_template' ) );
		add_action( 'admin_post_ns12lr_download_dictionary', array( DictionariesPage::class, 'handle_download_dictionary' ) );
		add_action( 'admin_post_ns12lr_run_validations', array( ValidationPage::class, 'handle_run_validations' ) );
	}

	/**
	 * Register admin menus.
	 *
	 * @return void
	 */
	public static function register_menus() {
		add_menu_page(
			'UAIX Locale Router',
			'UAIX Locale Router',
			'manage_options',
			'uaixlr-settings',
			array( SettingsPage::class, 'render_settings_page' ),
			'dashicons-translation',
			58
		);

		add_submenu_page(
			'uaixlr-settings',
			'General Settings',
			'Settings',
			'manage_options',
			'uaixlr-settings',
			array( SettingsPage::class, 'render_settings_page' )
		);

		add_submenu_page(
			'uaixlr-settings',
			'System Status',
			'Status',
			'manage_options',
			'uaixlr-status',
			array( StatusPage::class, 'render_page' )
		);

		add_submenu_page(
			'uaixlr-settings',
			'Locale Catalog',
			'Locales',
			'manage_options',
			'uaixlr-locales',
			array( SettingsPage::class, 'render_locales_page' )
		);

		add_submenu_page(
			'uaixlr-settings',
			'Dictionaries',
			'Dictionaries',
			'manage_options',
			'uaixlr-dictionaries',
			array( DictionariesPage::class, 'render_page' )
		);

		add_submenu_page(
			'uaixlr-settings',
			'Validation',
			'Validation',
			'manage_options',
			'uaixlr-validation',
			array( ValidationPage::class, 'render_page' )
		);
	}

	/**
	 * Render a flash notice if present.
	 *
	 * @return void
	 */
	public static function render_admin_notices() {
		$notice = Plugin::consume_flash_notice();

		if ( ! empty( $notice['message'] ) ) {
			$type = isset( $notice['type'] ) ? (string) $notice['type'] : 'success';
			$type = in_array( $type, array( 'success', 'warning', 'error', 'info' ), true ) ? $type : 'success';

			echo '<div class="notice notice-' . esc_attr( $type ) . ' is-dismissible"><p>' . esc_html( $notice['message'] ) . '</p>';
			self::render_flash_notice_data( isset( $notice['data'] ) && is_array( $notice['data'] ) ? $notice['data'] : array() );
			echo '</div>';
		}

		self::render_routing_notice();
		self::render_link_review_notice();
	}

	/**
	 * Render structured flash notice details when available.
	 *
	 * @param array $data Flash notice data.
	 * @return void
	 */
	private static function render_flash_notice_data( array $data ) {
		if ( empty( $data ) ) {
			return;
		}

		if ( ! empty( $data['summary'] ) && is_string( $data['summary'] ) ) {
			echo '<p>' . esc_html( $data['summary'] ) . '</p>';
		}

		if ( ! empty( $data['details'] ) && is_array( $data['details'] ) ) {
			echo '<ul class="uaixlr-admin-notice-list">';

			foreach ( $data['details'] as $label => $value ) {
				if ( ! is_string( $label ) || '' === trim( $label ) ) {
					continue;
				}

				if ( is_array( $value ) ) {
					$value = implode( ', ', array_map( 'strval', $value ) );
				}

				echo '<li><strong>' . esc_html( $label ) . ':</strong> ' . esc_html( (string) $value ) . '</li>';
			}

			echo '</ul>';
		}

		if ( ! empty( $data['issues'] ) && is_array( $data['issues'] ) ) {
			echo wp_kses_post( Html::issues_list( $data['issues'] ) );
		}

		if ( ! empty( $data['guidance'] ) && is_array( $data['guidance'] ) ) {
			echo '<ul class="uaixlr-guidance-list">';

			foreach ( $data['guidance'] as $line ) {
				if ( ! is_string( $line ) || '' === trim( $line ) ) {
					continue;
				}

				echo '<li>' . esc_html( $line ) . '</li>';
			}

			echo '</ul>';
		}
	}

	/**
	 * Render a persistent routing warning on plugin admin pages when localized-home checks fail.
	 *
	 * @return void
	 */
	private static function render_routing_notice() {
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}

		$page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : '';

		if ( 0 !== strpos( $page, 'uaixlr-' ) && 0 !== strpos( $page, 'ns12lr-' ) ) {
			return;
		}

		$status      = Plugin::system_status();
		$diagnostics = Plugin::localized_home_diagnostics( $status );

		if ( 'good' === $diagnostics['severity'] ) {
			return;
		}

		$response = __( 'no HTTP response', 'uaix-locale-router' );

		if ( $diagnostics['status_code'] > 0 ) {
			$response = sprintf(
				/* translators: %d: HTTP status code */
				__( 'HTTP %d', 'uaix-locale-router' ),
				$diagnostics['status_code']
			);
		} elseif ( ! empty( $diagnostics['response_error'] ) ) {
			$response = $diagnostics['response_error'];
		}

		$notice_type = 'critical' === $diagnostics['severity'] ? 'error' : 'warning';
		$status_link = sprintf(
			'<a href="%s">%s</a>',
			esc_url( self::page_url( 'uaixlr-status' ) ),
			esc_html__( 'Open Status for the rewrite checklist.', 'uaix-locale-router' )
		);

		echo '<div class="notice notice-' . esc_attr( $notice_type ) . '"><p>';
		echo '<strong>' . esc_html__( 'UAIX Locale Router routing check:', 'uaix-locale-router' ) . '</strong> ';
		echo esc_html(
			sprintf(
				/* translators: 1: localized URL, 2: response result, 3: summary */
				__( '%1$s returned %2$s. %3$s', 'uaix-locale-router' ),
				$diagnostics['localized_home_url'],
				$response,
				$diagnostics['summary']
			)
		);

		if ( ! empty( $diagnostics['likely_server_rewrite_issue'] ) ) {
			$htaccess = isset( $diagnostics['htaccess_status'] ) && is_array( $diagnostics['htaccess_status'] ) ? $diagnostics['htaccess_status'] : Plugin::htaccess_diagnostics();

			if ( ! empty( $htaccess['auto_repair_available'] ) ) {
				echo ' ' . esc_html__( 'Open Status and use Repair .htaccess to refresh the site-root rewrite blocks automatically.', 'uaix-locale-router' );
			} else {
				echo ' ' . esc_html__( 'The plugin could not repair the site-root .htaccess file automatically on this server. Check the WordPress rewrite block and the UAIX Locale Router block there beside wp-admin, wp-content, and index.php. If that file does not exist yet, create it there. If cPanel says it already exists, it is hidden and you should edit the existing file instead.', 'uaix-locale-router' );
			}
		}

		echo ' ' . wp_kses_post( $status_link );
		echo '</p></div>';
	}

	/**
	 * Render a locale-link review warning on plugin admin pages when hardcoded links need review.
	 *
	 * @return void
	 */
	private static function render_link_review_notice() {
		if ( ! current_user_can( 'manage_options' ) ) {
			return;
		}

		$page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : '';

		if ( 0 !== strpos( $page, 'uaixlr-' ) && 0 !== strpos( $page, 'ns12lr-' ) ) {