Skip to content
wiki.fftac.org

Uaix Locale Router Uninstall

**Site relevance:** Antichrist.net

**Memory type:** plugin source memory

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

**Size:** 3.3 KB

Summary

Uninstall UAIX Locale Router.

Source Preview

This source file is short enough to preview directly on its source-memory page.

<?php
/**
 * Uninstall UAIX Locale Router.
 *
 * @package UAIXLocaleRouter
 */

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

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

global $wpdb;

$settings             = get_option( 'uaixlr_settings', array() );
$cleanup_legacy_ns12 = is_array( $settings ) && ! empty( $settings['cleanup_legacy_ns12'] );

$option_names = array(
	'uaixlr_settings',
	'uaixlr_supported_locales',
	'uaixlr_default_locale',
	'uaixlr_dictionary_manifest',
	'uaixlr_install_version',
	'uaixlr_bootstrap_notice',
	'uaixlr_bootstrap_notice_raw',
	'uaixlr_migration_status',
	'_transient_uaixlr_admin_notice',
	'_transient_timeout_uaixlr_admin_notice',
	'_transient_uaixlr_link_review',
	'_transient_timeout_uaixlr_link_review',
	'_transient_uaixlr_localized_home_check',
	'_transient_timeout_uaixlr_localized_home_check',
	'_transient_uaixlr_translation_runtime_strings',
	'_transient_timeout_uaixlr_translation_runtime_strings',
);

foreach ( $option_names as $option_name ) {
	delete_option( $option_name );
	delete_site_option( $option_name );
}

$table_name = $wpdb->prefix . 'uaixlr_dictionary_validation';
$wpdb->query( "DROP TABLE IF EXISTS {$table_name}" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared

$upload_dir = wp_upload_dir();
$base_dir   = isset( $upload_dir['basedir'] ) ? trailingslashit( $upload_dir['basedir'] ) . 'uaix-locale-router' : '';

uaixlr_uninstall_remove_directory( $base_dir, isset( $upload_dir['basedir'] ) ? $upload_dir['basedir'] : '' );

if ( $cleanup_legacy_ns12 ) {
	$legacy_options = array(
		'ns12lr_settings',
		'ns12lr_supported_locales',
		'ns12lr_default_locale',
		'ns12lr_dictionary_manifest',
		'ns12lr_install_version',
		'ns12lr_bootstrap_notice',
		'ns12lr_bootstrap_notice_raw',
		'_transient_ns12lr_admin_notice',
		'_transient_timeout_ns12lr_admin_notice',
	);

	foreach ( $legacy_options as $legacy_option ) {
		delete_option( $legacy_option );
		delete_site_option( $legacy_option );
	}

	$legacy_table_name = $wpdb->prefix . 'ns12lr_dictionary_validation';
	$wpdb->query( "DROP TABLE IF EXISTS {$legacy_table_name}" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared

	$legacy_base_dir = isset( $upload_dir['basedir'] ) ? trailingslashit( $upload_dir['basedir'] ) . 'ns12-locale-router' : '';
	uaixlr_uninstall_remove_directory( $legacy_base_dir, isset( $upload_dir['basedir'] ) ? $upload_dir['basedir'] : '' );
}

/**
 * Remove a plugin-owned upload directory after confirming it lives under uploads.
 *
 * @param string $base_dir Directory to delete.
 * @param string $uploads_base WordPress uploads base directory.
 * @return void
 */
function uaixlr_uninstall_remove_directory( $base_dir, $uploads_base ) {
	if ( '' === $base_dir || '' === $uploads_base || ! is_dir( $base_dir ) ) {
		return;
	}

	$real_base    = realpath( $base_dir );
	$real_uploads = realpath( $uploads_base );

	if ( false === $real_base || false === $real_uploads || 0 !== strpos( $real_base, $real_uploads ) ) {
		return;
	}

	$items = new RecursiveIteratorIterator(
		new RecursiveDirectoryIterator( $base_dir, FilesystemIterator::SKIP_DOTS ),
		RecursiveIteratorIterator::CHILD_FIRST
	);

	foreach ( $items as $item ) {
		if ( $item->isDir() ) {
			rmdir( $item->getPathname() );
			continue;
		}

		unlink( $item->getPathname() );
	}

	rmdir( $base_dir );
}