私はWebサイト制作業を生業にしていますが、WordPress案件は相も変わらず多いですね。
私の場合はローカルに開発環境を用意して開発しています。面倒ですが、それが間違いないですので。これまで特に何も考えずにこれまで開発してきました。
……が、ローカルの開発環境にログインするのが面倒!
ということにある日突然気がついてしまいました。だって自分以外から不正アクセスされるわけもないですから。ちゃんとルーターを噛ませていますし、ホームネットワークなのにログインする必要は無いだろうと。
なぜこれまで気がつかなかったんだと思うほどで、一度気がついてしまうと気になってしようが無い。そこで、開発環境用のWordPressでログイン不要になる方法がないか考えてみました。
方法の選択肢
ログインを不要にする
ログインしなくても良い方法があればベストです。ただ、ログインせずに記事を書けるプラグインはあったのですが、ログインしないで管理画面をいじれるような記事は見つかりませんでした。
そりゃそうだ(笑)
ログインを簡単にする
ログインは必要でも、自動化できるなどであれば入力する手間も無くなりますし大分楽です。現状でもID・パスはChromeに登録させてはいるんですが、ログインボタンを押すのが面倒。しかも同じドメインで複数パスを使っていると初期状態で表示されなかったりすることも。
とにかく1~2秒でも早く管理画面にいければ嬉しいです。1000回ログインで都度2秒浮けば、33分浮きますからね。33分でも有限の人生ですからチリツモです。
というのは本気のような冗談のような気もしますが、とにかく少しでも早くなればいいやくらいに深く考えずにやってみました。途中経過も書いていますので、結果だけ知りたい方は最後の方まで飛ばしてください。
採用した方法
ログイン画面で何かしたことはなかったのですが、login_headというアクションフックがあるようです。じゃあここでIDとパスワードを入れてフォームをsubmitさせればいいんじゃないか!?と思いやってみました。function.phpに以下を入力。
function wp_auto_login(){
if (is_local()) {
?>
$(function() {
$('#user_login').val("test");
$('#user_pass').val("test");
$('#loginform').submit();
});
<?php
}
}
add_action('login_head','wp_auto_login');
is_local()はローカルかどうかを判別するような自作関数を適当に作ってます。IDとパスワードはtestとしています。
しかしjQueryがまだロードされていないので以下のように$がエラーになる。
wp-login.php:20 Uncaught ReferenceError: $ is not defined
at wp-login.php:20
じゃあこれで!windowロード時のリスナに追加しました。
function wp_auto_login(){
if (is_local()) {
?>
<script>
window.addEventListener('load', function() {
$('#user_login').val("test");
$('#user_pass').val("test");
$('#loginform').submit();
})
</script>
<?php
}
}
add_action('login_head','wp_auto_login');
あれ!?エラー。
wp-login.php:19 Uncaught TypeError: $ is not a function
at wp-login.php:19
コンフリクト対策なのか、$をjQueryにして三度目の正直!
function wp_auto_login(){
if (is_local()) {
?>
<script>
window.addEventListener('load', function() {
jQuery('#user_login').val("test");
jQuery('#user_pass').val("test");
jQuery('#loginform').submit();
})
</script>
<?php
}
}
add_action('login_head','wp_auto_login');
見事意図した動作になりました。
最終版
このままだと管理画面からログアウトをクリックした後にもすぐログインしてしまいます。明示的にログアウトした時のみ再ログインしないようにした最終バージョンが以下です。
参考版のis_local()関数も入れておきました。ただしこれは私の環境ですので、そのまま使わないでくださいね。
function wp_auto_login(){
if (is_local() && @$_GET['loggedout'] != 'true') {
?>
<script>
window.addEventListener('load', function() {
jQuery('#user_login').val("test");
jQuery('#user_pass').val("test");
jQuery('#loginform').submit();
})
</script>
<?php
}
}
function is_local() {
return $_SERVER['SERVER_ADDR'] == '127.0.0.1' || strpos($_SERVER['SERVER_ADDR'],'192.168.') !== FALSE;
}
add_action('login_head','wp_auto_login');
これで、ログイン画面のURLを叩けばすぐログインできるようになりました。多分これを考えるのは少数派なんだろうなぁと思いますがどなたかのお役に立てば幸いです。
余談
本ページでご紹介している内容は、本番環境でも可能です。その場合、自己責任&リスクがあることをお忘れ無く。
私はSiteGuard WP Pluginというプラグインで、ログインURLを変更しています。また、私固有のアクセスのみ、自動ログインが発動するようにしています。
ログインURLを知っている人が自動ログインできちゃうと困りますのでね。加えて言うなら、自分の個人サイトのみで、クライアントのサイトには絶対やりません。
コメント