Disable XML-RPC
One request can carry hundreds of password guesses, and login limits on the form never see them.
GET/wp-json/wp/v2/users200 OKStop user enumeration
Three URLs hand out every login name. Close all three without breaking author pages.
GET/wp-content/uploads/shell.php200 OKBlock PHP in uploads
The last step of most takeovers. Make an uploaded script inert, and test that it is.
POST/wp-login.php200 × 10,000Limit login attempts
WordPress lets one address guess as fast as the server answers. What a limit can and cannot stop.
HEAD/0 of 5 headersSecurity headers
Five response headers that make browsers refuse whole classes of attack, with values that are safe.
GET/wp-admin/open to allRestrict wp-admin by IP
The strongest single step for a site with a few editors, without breaking admin-ajax or locking yourself out.