Self-service emergency login for agency staff on client WordPress sites.
Agency Pass adds a magic-link login flow to the WordPress login screen. Staff with whitelisted email addresses can request a temporary login link that creates a time-limited user with a restricted admin role. No external infrastructure required — the entire solution is self-contained.
- PHP 8.1+
- WordPress 6.2+
- Upload the
agency-passdirectory to/wp-content/plugins/ - Activate the plugin through the "Plugins" screen in WordPress
- On activation, a mu-plugin loader is installed to guarantee early loading
Add constants to wp-config.php:
define( 'AGENCY_PASS_EMAIL_PATTERN', '/^.+@youragency\.de$/' );define( 'AGENCY_PASS_TOKEN_TTL', 900 ); // Magic link validity in seconds (default: 15 min)
define( 'AGENCY_PASS_USER_TTL', 86400 ); // Temporary user lifetime in seconds (default: 24 h)- A "Agency Pass" button appears on the WordPress login form
- Clicking it reveals an email input field
- If the email matches the configured pattern, a single-use magic link is sent via
wp_mail() - Clicking the link creates a temporary user with the
agency_pass_adminrole and logs them in - Expired users are cleaned up automatically via WP-Cron
The agency_pass_admin role has all administrator capabilities except:
edit_users,delete_users,create_userslist_users,promote_users,remove_users
add_filter( 'agency_pass_email_allowed', function ( bool $allowed, string $email ): bool {
// Custom validation logic here
return $allowed;
}, 10, 2 );agency_pass_link_requested— fired when a magic link is requestedagency_pass_login— fired on successful emergency loginagency_pass_user_cleanup— fired when an expired user is removed
composer install
composer cs # Run PHPCS
composer cs:fix # Fix PHPCS violations
composer analyse # Run PHPStan
composer test # Run all tests
composer test:unit # Run unit tests onlyddev start && ddev orchestrategit config core.hooksPath .githooksgit remote add template https://github.com/apermo/template-wordpress.git
git fetch template
git checkout -b chore/sync-template
git merge template/main --allow-unrelated-histories