{"id":151565,"date":"2021-12-28T00:33:10","date_gmt":"2021-12-28T00:33:10","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/magic-login-mail\/"},"modified":"2026-03-29T22:26:54","modified_gmt":"2026-03-29T22:26:54","slug":"magic-login-mail","status":"publish","type":"plugin","link":"https:\/\/af.wordpress.org\/plugins\/magic-login-mail\/","author":12387480,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"2.06","stable_tag":"2.06","tested":"7.0","requires":"4.7","requires_php":"8.0","requires_plugins":null,"header_name":"Magic Login Mail or QR Code","header_author":"Katsushi Kawamori","header_description":"Enter your email address, and send you an email with a magic link to login without a password.","assets_banners_color":"","last_updated":"2026-03-29 22:26:54","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/shop.riverforest-wp.info\/donate\/","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/magic-login-mail\/","header_author_uri":"https:\/\/riverforest-wp.info\/","rating":5,"author_block_rating":4.6,"active_installs":100,"downloads":6383,"num_ratings":3,"support_threads":0,"support_threads_resolved":0,"author_block_count":3,"sections":["description","installation","faq","changelog"],"tags":{"2.06":{"tag":"2.06","author":"Katsushi Kawamori","date":"2026-03-29 22:26:54"}},"upgrade_notice":{"2.06":"<ul>\n<li>Fix - Vulnerability in Unauthorized Privilege Escalation Due to Unsafe QR Code File Storage.<\/li>\n<\/ul>","1.00":"<p>Initial release.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":3},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":2649698,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.06"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3181862,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3281943,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3282230,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3181862,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3282230,"resolution":"5","location":"assets","locale":""},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3282230,"resolution":"6","location":"assets","locale":""},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3181862,"resolution":"7","location":"assets","locale":""}},"screenshots":{"1":"Login form by shortcode","2":"Login form","3":"Login success","4":"Email with magic link","5":"Login error with no user","6":"Login error with expired token","7":"Log in with QR Code"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[267,602,9223,1917],"plugin_category":[38,41],"plugin_contributors":[79586],"plugin_business_model":[],"class_list":["post-151565","plugin","type-plugin","status-publish","hentry","plugin_tags-email","plugin_tags-login","plugin_tags-passwordless","plugin_tags-users","plugin_category-authentication","plugin_category-communication","plugin_contributors-katsushi-kawamori","plugin_committers-katsushi-kawamori"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/magic-login-mail\/assets\/icon-256x256.png?rev=2649698","icon_2x":"https:\/\/ps.w.org\/magic-login-mail\/assets\/icon-256x256.png?rev=2649698","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/magic-login-mail\/assets\/screenshot-1.png?rev=3181862","caption":"Login form by shortcode"},{"src":"https:\/\/ps.w.org\/magic-login-mail\/assets\/screenshot-2.png?rev=3281943","caption":"Login form"},{"src":"https:\/\/ps.w.org\/magic-login-mail\/assets\/screenshot-3.png?rev=3282230","caption":"Login success"},{"src":"https:\/\/ps.w.org\/magic-login-mail\/assets\/screenshot-4.png?rev=3181862","caption":"Email with magic link"},{"src":"https:\/\/ps.w.org\/magic-login-mail\/assets\/screenshot-5.png?rev=3282230","caption":"Login error with no user"},{"src":"https:\/\/ps.w.org\/magic-login-mail\/assets\/screenshot-6.png?rev=3282230","caption":"Login error with expired token"},{"src":"https:\/\/ps.w.org\/magic-login-mail\/assets\/screenshot-7.png?rev=3181862","caption":"Log in with QR Code"}],"raw_content":"<!--section=description-->\n<p>Enter your email address, and send you an email with a magic link or QR Code to login without a password.<\/p>\n\n<h4>Login<\/h4>\n\n<ul>\n<li>Login with email address only.<\/li>\n<li>Only registered users can login.<\/li>\n<li>Password-less login from the magic link or QR code notified in the email.<\/li>\n<li>shortcode : <code>[magic_login]<\/code><\/li>\n<li>action hook : <code>do_action( 'magic_email_send', $emails | array, true | bool )<\/code> : To send the magic link simultaneously from the management account.<\/li>\n<li>QR code login on the user's administration screen.<\/li>\n<\/ul>\n\n<h4>Thanks<\/h4>\n\n<ul>\n<li>This plugin is a modified version of <a href=\"https:\/\/wordpress.org\/plugins\/passwordless-login\/\">Passwordless Login<\/a>.<\/li>\n<li>The main changes are the addition of various filter hooks and the addition of the following action hooks.<\/li>\n<\/ul>\n\n<h4>Action hook<\/h4>\n\n<ul>\n<li>This is for sending bulk e-mails with a magic link for login to multiple accounts from the management screen.<\/li>\n<li>When using this action hook, the URL of the page where the shortcode [magic_login] is placed should be specified in the filter hook 'magic_login_mail_url'.<\/li>\n<\/ul>\n\n<pre><code>\/** ==================================================\n * To send the magic link simultaneously from the management account.\n *\n * @param array  $emails  Multiple email addresses.\n * @param bool   true  Output notifications to the management screen immediately after sending.\n *\/\ndo_action( 'magic_email_send', $emails, true );\n<\/code><\/pre>\n\n<h4>Filter hooks<\/h4>\n\n<pre><code>\/** ==================================================\n * Filter for magic link url with mail.\n *\n *\/\nadd_filter( 'magic_login_mail_url', function(){ return 'url'; }, 10, 1 );\n<\/code><\/pre>\n\n<pre><code>\/** ==================================================\n * Currently logged in user link for Magic Login Mail\n *\n * @param string $url  URL.\n * @param int    $user_id  User ID.\n * @return $url\n *\/\nadd_filter( 'magic_login_mail_user_redirect', 'redirect_url_login_users', 10, 2 );\n\n\/** ==================================================\n * Login user after redirect for Magic Login Mail\n *\n * @param string $url  URL.\n * @param int    $user_id  User ID.\n * @return $url\n *\/\nadd_filter( 'magic_login_mail_after_login_redirect', 'redirect_url_login_users', 10, 2 );\n\nfunction redirect_url_login_users( $url, $user_id ){\n    \/* your code *\/\n    return $url;\n}\n<\/code><\/pre>\n\n<pre><code>\/** ==================================================\n * Filter for message with shortcode form.\n *\n *\/\nadd_filter( 'magic_login_mail_success_link_msg', function(){ return 'Message for success.'; }, 10, 1 );\nadd_filter( 'magic_login_mail_success_login_msg', function(){ return 'Message for success with login.'; }, 10, 1 );\nadd_filter( 'magic_login_mail_valid_errors', function(){ return 'Message for mail validation error.'; }, 10, 1 );\nadd_filter( 'magic_login_mail_email_errors', function(){ return 'Message for sent mail error.'; }, 10, 1 );\nadd_filter( 'magic_login_mail_invalid_token_error', function(){ return 'Message for token error.'; }, 10, 1 );\nadd_filter( 'magic_login_mail_form_label', function(){ return 'Message for form label.'; }, 10, 1 );\n<\/code><\/pre>\n\n<pre><code>\/** ==================================================\n * Filter for color with shortcode form.\n *\n *\/\nadd_filter( 'magic_login_mail_success_link_msg_back_color', function(){ return '#e7f7d3'; }, 10, 1 );\nadd_filter( 'magic_login_mail_success_login_msg_back_color', function(){ return '#e7f7d3'; }, 10, 1 );\nadd_filter( 'magic_login_mail_valid_errors_back_color', function(){ return '#ffebe8'; }, 10, 1 );\nadd_filter( 'magic_login_mail_email_errors_back_color', function(){ return '#ffebe8'; }, 10, 1 );\nadd_filter( 'magic_login_mail_invalid_token_error_back_color', function(){ return '#ffebe8'; }, 10, 1 );\n<\/code><\/pre>\n\n<pre><code>\/** ==================================================\n * Filter for input text size.\n *\n *\/\nadd_filter( 'magic_login_mail_input_size', function(){ return 17; }, 10, 1 );\n<\/code><\/pre>\n\n<pre><code>\/** ==================================================\n * Filter for class name.\n *\n *\/\nadd_filter( 'magic_login_mail_notice_class_name', function(){ return 'mynotice'; }, 10, 1 );\nadd_filter( 'magic_login_mail_form_class_name', function(){ return 'myform'; }, 10, 1 );\nadd_filter( 'magic_login_mail_label_class_name', function(){ return 'mylabel'; }, 10, 1 );\nadd_filter( 'magic_login_mail_input_class_name', function(){ return 'myinput'; }, 10, 1 );\nadd_filter( 'magic_login_mail_submit_class_name', function(){ return 'mysubmit'; }, 10, 1 );\n<\/code><\/pre>\n\n<pre><code>\/** ==================================================\n * Filter for message with mail subject.\n *\n *\/\nadd_filter( 'magic_login_mail_subject', function(){ return 'subject'; }, 10, 1 );\n<\/code><\/pre>\n\n<pre><code>\/** ==================================================\n * Filter for message with mail.\n *\n * @param string $message  message.\n * @param string $url  url.\n * @param string $exp_date_time  expiration date and time.\n *\/\nadd_filter(\n    'magic_login_mail_message',\n    function( $message, $url, $exp_date_time ) {\n\n        $message .= '&lt;br&gt;&lt;br&gt;' . 'You may only log in once using the link above.';\n\n        return $message;\n    },\n    10,\n    3\n);\n<\/code><\/pre>\n\n<pre><code>\/** ==================================================\n * Filter for login expiration.\n *\n *\/\nadd_filter( 'magic_login_mail_expiration', function(){ return 10; }, 10, 1 );\n<\/code><\/pre>\n\n<!--section=installation-->\n<ol>\n<li>Upload <code>magic-login-mail<\/code> directory to the <code>\/wp-content\/plugins\/<\/code> directory<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<\/ol>\n\n<!--section=faq-->\n<p>none<\/p>\n\n<!--section=changelog-->\n<h4>[2.06] 2026\/02\/13<\/h4>\n\n<ul>\n<li>Fix - Vulnerability in Unauthorized Privilege Escalation Due to Unsafe QR Code File Storage.<\/li>\n<\/ul>\n\n<h4>[2.05] 2025\/04\/26<\/h4>\n\n<ul>\n<li>Fix - CSS.<\/li>\n<\/ul>\n\n<h4>[2.04] 2025\/04\/25<\/h4>\n\n<ul>\n<li>Added - Add own CSS for shortcode output.<\/li>\n<\/ul>\n\n<h4>[2.03] 2025\/04\/14<\/h4>\n\n<ul>\n<li>Fix - Loading the management screen.<\/li>\n<\/ul>\n\n<h4>[2.02] 2024\/11\/05<\/h4>\n\n<ul>\n<li>Changed - Plugin name changed from \"Magic Login Mail\" to \"Magic Login Mail or QR Code\".<\/li>\n<\/ul>\n\n<h4>[2.01] 2024\/11\/05<\/h4>\n\n<ul>\n<li>Added - QR code for login is now output on the user's administration screen.<\/li>\n<\/ul>\n\n<h4>[2.00] 2024\/10\/08<\/h4>\n\n<ul>\n<li>Added - QR codes containing magic links are now sent.<\/li>\n<\/ul>\n\n<h4>[1.07] 2024\/09\/20<\/h4>\n\n<ul>\n<li>Added - parameter addition of filter('magic_login_mail_message').<\/li>\n<\/ul>\n\n<h4>[1.06] 2024\/03\/04<\/h4>\n\n<ul>\n<li>Fix - Elimination of short code attribute values.<\/li>\n<\/ul>\n\n<h4>1.05<\/h4>\n\n<p>Supported WordPress 6.4.\nPHP 8.0 is now required.<\/p>\n\n<h4>1.04<\/h4>\n\n<p>Added class name filter('magic_login_mail_form_class_name') for login form.\nAdded \"placeholder\" and \"required\" attributes to the email input form.<\/p>\n\n<h4>1.03<\/h4>\n\n<p>Added an option to save sent emails.<\/p>\n\n<h4>1.02<\/h4>\n\n<p>Changed input size.<\/p>\n\n<h4>1.01<\/h4>\n\n<p>Supported GlotPress.<\/p>\n\n<h4>1.00<\/h4>\n\n<p>Initial release.<\/p>","raw_excerpt":"Enter your email address, and send you an email with a magic link or QR Code to login without a password.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/151565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=151565"}],"author":[{"embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/katsushi-kawamori"}],"wp:attachment":[{"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=151565"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=151565"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=151565"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=151565"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=151565"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/af.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=151565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}