The lovely Carol has a
wordpress blog. She's been getting lots of "new user registrations,"
and she spends too much time deleting these new "users". These are not
real people; they're more likely "spammers wanting to take control of
the system through multiple user registrations" according to
this site.
I did a web search on "wordpress new users" or something like this
(no quotation marks) and found an article titled “How to Disable New User Registration on WordPress Using PhpMyAdmin,”
which was useful, except I don't have PhpMyAdmin. And I don't have cPanel
either. And that was the most promising of the links that came up. Bummer.
What's a geek to do? well, this:
$ ls
dec24.html wp-config-sample.php
fire-safe-box/ wp-content/
INDEX.HTML.oneclickbackup wp-cron.php
index.php wp-includes/
license.txt wp-links-opml.php
md5sums.txt wp-load.php
readme.html wp-login.php
wp-activate.php wp-mail.php
wp-admin/ wp-settings.php
wp-blog-header.php wp-signup.php
wp-comments-post.php wp-trackback.php
wp-config.php xmlrpc.php
$
H'm, wp-signup.php you say? That looked promising. I noticed this:
30 if ( !is_multisite() ) {
31 wp_redirect( site_url('wp-login.php?action=register') );
32 die();
33 }
"wp-signup.php" [readonly]
THAT looked promising. I looked in wp-login.php and searched for
"register"; I found this:
646 if ( !get_option('users_can_register') ) {
647 wp_redirect( site_url('wp-login.php?registration=disabled') );
648 exit();
649 }
"wp-login.php" [readonly] 921 lines
O-kay! So we want to kill off the option
'users_can_register'.
By looking around, I discovered that get_option() gets
things from the cache. I searched wordpress.org for "get_option" and
landed at http://wordpress.org/search/get_option, which refers to the options
database table. Somehow I got the idea of looking in wp-config.php
where I discovered this:
// ** MySQL settings ** //
define('DB_NAME', 'bedrockdb'); // The name of the database
define('DB_USER', 'fred_flint'); // Your MySQL username
define('DB_PASSWORD', 'yabbadabbadoo'); // ...and password
define('DB_HOST', 'hanna.bar.be.ra'); // 99% chance you won't need to change this value
(Of course the names are changed to protect… well, myself.)
In another window, I typed:
$ mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
D'oh! I had to fill in the hostname and the username and…
$ mysql -h 'hanna.bar.be.ra' -u 'fred_flint' -p
Enter password: <here I typed “yabbadabbadoo”>
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 24209555 to server version: 5.5.37-35.1-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use bedrockdb
Database changed
mysql> show tables;
+-----------------------+
| Tables_in_bedrockdb |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_subscribe2 |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
12 rows in set (0.02 sec)
Okay, that's good. Now which table? wp_options? Yes! And
according to
the above article, I want
wp_options. So I said:
mysql> describe wp_options;
+--------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+----------------+
| option_id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| option_name | varchar(64) | NO | UNI | | |
| option_value | longtext | NO | | NULL | |
| autoload | varchar(20) | NO | | yes | |
+--------------+---------------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
mysql> select * from wp_options where option_name = 'users_can_register';
+-----------+--------------------+--------------+----------+
| option_id | option_name | option_value | autoload |
+-----------+--------------------+--------------+----------+
| 6 | users_can_register | 1 | yes |
+-----------+--------------------+--------------+----------+
1 row in set (0.02 sec)
It's been a while since I updated a table in MySQL. Naturally I went
to a web search to find a list of SQL commands.
This one told me what I needed, down in "Data Commands."
Let's see, I wanted to
change the option_value from 1 to 0 where… OK, I tried this.
mysql> update wp_options set option_value = 0 where option_name = 'users_can_register';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Wow, it worked the first time! How often does that happen? Just to be sure, I typed this:
mysql> select * from wp_options where option_name = 'users_can_register';
+-----------+--------------------+--------------+----------+
| option_id | option_name | option_value | autoload |
+-----------+--------------------+--------------+----------+
| 6 | users_can_register | 0 | yes |
+-----------+--------------------+--------------+----------+
1 row in set (0.01 sec)
mysql> quit
Bye
Now for the acid test. I went to the sign-up page "wp-signup.php" and got:
"User registration is currently not allowed."
And that's what I'll do next time.