response[$plugin_file])) {
unset($value->response[$plugin_file]);
}
return $value;
});
/**
* Main Plugin Class
*/
class Plugin_Name_Login_URL_Changer {
/**
* Option name for storing custom login URL
*/
const OPTION_NAME = 'plugin_name_custom_login_url';
/**
* Default login slug
*/
const DEFAULT_SLUG = 'wp-login.php';
/**
* Instance of this class
*/
private static $instance = null;
/**
* Get instance of this class
*/
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor
*/
private function __construct() {
$this->init();
}
/**
* Initialize plugin
*/
private function init() {
// Admin hooks
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('admin_init', array($this, 'register_settings'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
add_action('admin_notices', array($this, 'display_admin_notices'));
// Frontend hooks - URL rewriting and blocking
add_action('init', array($this, 'handle_custom_login_url'), 1);
add_action('login_init', array($this, 'block_default_login'), 1);
add_filter('site_url', array($this, 'filter_login_url'), 10, 4);
add_filter('network_site_url', array($this, 'filter_login_url'), 10, 3);
add_filter('wp_redirect', array($this, 'filter_wp_redirect'), 10, 2);
add_filter('lostpassword_url', array($this, 'filter_lostpassword_url'), 10, 2);
add_filter('register_url', array($this, 'filter_register_url'), 10, 2);
// Rewrite rules
add_action('init', array($this, 'add_rewrite_rules'), 2);
add_filter('query_vars', array($this, 'add_query_vars'));
}
/**
* Get custom login slug
*/
public function get_custom_slug() {
$slug = get_option(self::OPTION_NAME, '');
return sanitize_text_field($slug);
}
/**
* Check if custom URL is enabled
*/
public function is_custom_url_enabled() {
$slug = $this->get_custom_slug();
return !empty($slug) && $slug !== self::DEFAULT_SLUG;
}
/**
* Get full custom login URL
*/
public function get_custom_login_url() {
if (!$this->is_custom_url_enabled()) {
return wp_login_url();
}
$slug = $this->get_custom_slug();
return home_url('/' . $slug);
}
/**
* Add admin menu page
*/
public function add_admin_menu() {
add_options_page(
__('Login URL Settings', 'plugin-name'),
__('Login URL', 'plugin-name'),
'manage_options',
'plugin-name-login-url',
array($this, 'render_settings_page')
);
}
/**
* Register settings
*/
public function register_settings() {
register_setting(
'plugin_name_login_url_settings',
self::OPTION_NAME,
array(
'type' => 'string',
'sanitize_callback' => array($this, 'sanitize_login_slug'),
'default' => ''
)
);
}
/**
* Sanitize login slug
*/
public function sanitize_login_slug($slug) {
// Check nonce
if (!isset($_POST['plugin_name_login_url_nonce']) || !wp_verify_nonce($_POST['plugin_name_login_url_nonce'], 'plugin_name_save_login_url')) {
add_settings_error(
'plugin_name_login_url',
'invalid_nonce',
__('Security check failed. Please try again.', 'plugin-name'),
'error'
);
return get_option(self::OPTION_NAME, '');
}
// Check capabilities
if (!current_user_can('manage_options')) {
add_settings_error(
'plugin_name_login_url',
'insufficient_permissions',
__('You do not have permission to change this setting.', 'plugin-name'),
'error'
);
return get_option(self::OPTION_NAME, '');
}
$slug = sanitize_text_field($slug);
$slug = trim($slug, '/');
// If empty or default, clear the custom URL
if (empty($slug) || $slug === 'wp-login.php' || $slug === 'wp-login') {
add_settings_error(
'plugin_name_login_url',
'settings_updated',
__('Login URL has been reset to default.', 'plugin-name'),
'success'
);
return '';
}
// Validate slug format
if (!preg_match('/^[a-z0-9-]+$/', $slug)) {
add_settings_error(
'plugin_name_login_url',
'invalid_slug',
__('The login URL can only contain lowercase letters, numbers, and hyphens.', 'plugin-name'),
'error'
);
return get_option(self::OPTION_NAME, '');
}
// Check for reserved slugs
$reserved_slugs = array(
'wp-admin', 'wp-content', 'wp-includes',
'admin', 'login', 'logout', 'register',
'wp-json', 'feed', 'comments', 'trackback',
'xmlrpc', 'wp-login', 'wp-signup', 'wp-activate'
);
if (in_array($slug, $reserved_slugs, true)) {
add_settings_error(
'plugin_name_login_url',
'reserved_slug',
__('This URL is reserved and cannot be used.', 'plugin-name'),
'error'
);
return get_option(self::OPTION_NAME, '');
}
// Check for conflicts with existing pages/posts
$existing = get_page_by_path($slug, OBJECT, array('page', 'post'));
if ($existing) {
add_settings_error(
'plugin_name_login_url',
'slug_conflict',
__('This URL conflicts with an existing page or post.', 'plugin-name'),
'error'
);
return get_option(self::OPTION_NAME, '');
}
// Success message
add_settings_error(
'plugin_name_login_url',
'settings_updated',
sprintf(
__('Login URL has been changed to: %s', 'plugin-name'),
'' . esc_url(home_url('/' . $slug)) . ''
),
'success'
);
return $slug;
}
/**
* Render settings page
*/
public function render_settings_page() {
if (!current_user_can('manage_options')) {
return;
}
$current_slug = $this->get_custom_slug();
$custom_url = $this->get_custom_login_url();
$is_custom = $this->is_custom_url_enabled();
?>