Skip to content

Instantly share code, notes, and snippets.

@hakre
Created November 16, 2010 00:37
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save hakre/701245 to your computer and use it in GitHub Desktop.
Save hakre/701245 to your computer and use it in GitHub Desktop.
Change Admin URL
<?php
/**
* Change Admin URL
*
* Copyright (C) 2010 hakre <http://hakre.wordpress.com/>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* USAGE:
*
* Copy the file into wp-content/mu-plugins directory and add the
* following RewriteRule to your apache configuration or .htaccess:
*
* RewriteRule ^admin/(.*)$ wp-admin/$1 [QSA,L]
*
* It will rewrite the wordpress admin-URL
*
* from: http://example.com/wp-admin/ ...
* to : http://example.com/admin/ ...
*
* @author hakre <http://hakre.wordpress.com>
* @see http://wordpress.stackexchange.com/questions/4037/how-to-redirect-rewrite-all-wp-login-requests/4063
* @todo mod_rewrite_rules - filter to insert into .htacces on plugin activation
*/
return ChangeAdminUrlPlugin::bootstrap();
class ChangeAdminUrlPlugin {
private $renameFrom = 'wp-admin';
private $renameTo = 'admin';
static $instance;
static public function bootstrap() {
null === self::$instance
&& self::$instance = new self()
;
return self::$instance;
}
private function setCookiePath() {
defined('SITECOOKIEPATH') || define('SITECOOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('siteurl') . '/' ) );
defined('ADMIN_COOKIE_PATH') || define('ADMIN_COOKIE_PATH', SITECOOKIEPATH . $this->renameTo);
}
public function __construct() {
$this->setCookiePath();
add_action('init', array($this, 'init')) ;
}
public function init() {
add_filter('admin_url', array($this, 'admin_url'), 10, 3);
}
public function admin_url($url, $path, $blog_id) {
$renameFrom = $this->renameFrom;
$renameTo = $this->renameTo;
$scheme = 'admin';
$find = get_site_url($blog_id, $renameFrom.'/', $scheme);
$replace = get_site_url($blog_id, $renameTo.'/', $scheme);
(0 === strpos($url, $find))
&& $url = $replace.substr($url, strlen($find))
;
return $url;
}
}
#EOF;
@gator92
Copy link

gator92 commented May 24, 2013

This solves most of the issues involved with securing the wp backend by obscurity. However, since relative links are not considered by this plugin, the admin ajax url is left unchanged. For anyone else who might experience this issue, the admin_url method can be modified to consider the scheme context, for example:

public function admin_url($url, $path, $blog_id) {
    $scheme = (0 === strpos($url, '/')) ? 'relative' : 'admin';
    $find = get_site_url($blog_id, $this->renameFrom . '/', $scheme);
    $replace = get_site_url($blog_id, $this->renameTo . '/', $scheme);
    (0 === strpos($url, $find))
        && $url = $replace . substr($url, strlen($find));
    return $url;
}

@bryanwillis
Copy link

Gator good find. Your solution makes sense, but it didn't seem to fix it. It looks like the url's are changed, but it's causing admin-ajax to search in the new admin_url which doesn't exist as a folder. Is your solution still working for you? I feel like it might be more of an htaccess issue now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment