{"id":49421,"date":"2016-07-01T22:56:15","date_gmt":"2016-07-01T22:56:15","guid":{"rendered":"https:\/\/wordpress.org\/plugins-wp\/loggedin\/"},"modified":"2026-07-29T18:50:15","modified_gmt":"2026-07-29T18:50:15","slug":"loggedin","status":"publish","type":"plugin","link":"https:\/\/lug.wordpress.org\/plugins\/loggedin\/","author":13607416,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.1.0","stable_tag":"3.1.0","tested":"7.0.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Loggedin - Session Manager, Limit Concurrent Logins & Force Logout","header_author":"Joel James","header_description":"","assets_banners_color":"000000","last_updated":"2026-07-29 18:50:15","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/paypal.me\/JoelCJ","header_plugin_uri":"https:\/\/duckdev.com\/products\/loggedin-limit-active-logins\/","header_author_uri":"https:\/\/duckdev.com\/","rating":4.9,"author_block_rating":0,"active_installs":8000,"downloads":156200,"num_ratings":110,"support_threads":1,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"joelcj91","date":"2019-04-16 07:34:12"},"1.1.0":{"tag":"1.1.0","author":"joelcj91","date":"2019-06-06 07:34:21"},"1.2.0":{"tag":"1.2.0","author":"joelcj91","date":"2020-08-01 05:50:05"},"1.3.0":{"tag":"1.3.0","author":"joelcj91","date":"2020-09-06 02:25:09"},"1.3.1":{"tag":"1.3.1","author":"joelcj91","date":"2023-10-25 05:35:12"},"1.3.2":{"tag":"1.3.2","author":"joelcj91","date":"2025-08-21 18:42:36"},"2.0":{"tag":"2.0","author":"joelcj91","date":"2025-11-10 10:34:47"},"2.0.1":{"tag":"2.0.1","author":"joelcj91","date":"2025-11-10 20:12:48"},"2.0.2":{"tag":"2.0.2","author":"joelcj91","date":"2025-12-09 13:27:35"},"2.0.3":{"tag":"2.0.3","author":"joelcj91","date":"2025-12-09 13:41:23"},"2.0.4":{"tag":"2.0.4","author":"joelcj91","date":"2026-05-25 17:34:43"},"3.0.0":{"tag":"3.0.0","author":"joelcj91","date":"2026-06-26 20:33:20"},"3.0.1":{"tag":"3.0.1","author":"joelcj91","date":"2026-06-27 15:21:52"},"3.0.2":{"tag":"3.0.2","author":"joelcj91","date":"2026-07-01 07:59:50"},"3.1.0":{"tag":"3.1.0","author":"joelcj91","date":"2026-07-29 18:50:15"}},"upgrade_notice":{"3.1.0":"<p>Adds WP-CLI support \u2014 list, count and destroy user sessions and read or write plugin settings from the command line. No changes to existing behaviour.<\/p>"},"ratings":{"1":1,"2":2,"3":0,"4":2,"5":105},"assets_icons":{"icon.svg":{"filename":"icon.svg","revision":3348320,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3548008,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3548008,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250},"banner.svg":{"filename":"banner.svg","revision":3548008,"resolution":false,"location":"assets","locale":false}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3627597,"resolution":false,"location":"assets","locale":"","contents":"{\"landingPage\":\"\\\/wp-admin\\\/users.php?page=loggedin\",\"preferredVersions\":{\"php\":\"7.4\",\"wp\":\"6.0\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"loggedin\"},\"options\":{\"activate\":true}}]}"}},"all_blocks":[],"tagged_versions":["1.0.1","1.1.0","1.2.0","1.3.0","1.3.1","1.3.2","2.0","2.0.1","2.0.2","2.0.3","2.0.4","3.0.0","3.0.1","3.0.2","3.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3587649,"resolution":"1","location":"assets","locale":"","width":825,"height":390},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3587649,"resolution":"2","location":"assets","locale":"","width":825,"height":306}},"screenshots":{"1":"<strong>General Settings<\/strong> \u2014 concurrent-login limit and login logic.","2":"<strong>Force Logout<\/strong> \u2014 admin Force Logout panel."}},"plugin_section":[],"plugin_tags":[4553,257744,4551,193505,48887],"plugin_category":[34,38,58],"plugin_contributors":[126295,78159],"plugin_business_model":[],"class_list":["post-49421","plugin","type-plugin","status-publish","hentry","plugin_tags-concurrent-login","plugin_tags-force-logout","plugin_tags-login-limit","plugin_tags-prevent-account-sharing","plugin_tags-session-management","plugin_category-accessibility","plugin_category-authentication","plugin_category-user-management","plugin_contributors-duckdev","plugin_contributors-joelcj91","plugin_committers-duckdev","plugin_committers-joelcj91"],"banners":{"banner":"https:\/\/ps.w.org\/loggedin\/assets\/banner-772x250.png?rev=3548008","banner_2x":"https:\/\/ps.w.org\/loggedin\/assets\/banner-1544x500.png?rev=3548008","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/loggedin\/assets\/icon.svg?rev=3348320","icon":"https:\/\/ps.w.org\/loggedin\/assets\/icon.svg?rev=3348320","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/loggedin\/assets\/screenshot-1.jpg?rev=3587649","caption":"<strong>General Settings<\/strong> \u2014 concurrent-login limit and login logic."},{"src":"https:\/\/ps.w.org\/loggedin\/assets\/screenshot-2.jpg?rev=3587649","caption":"<strong>Force Logout<\/strong> \u2014 admin Force Logout panel."}],"raw_content":"<!--section=description-->\n<p><strong>Loggedin<\/strong> is a session manager for WordPress \u2014 it gives you control over the login sessions your users hold, and the tools to end them when you need to.<\/p>\n\n<p>At its core, Loggedin caps the number of simultaneous WordPress sessions a user account is allowed to hold. When the cap is reached, you choose what happens next \u2014 log out the oldest device, log out every other device, or block the new login outright. It's the lightweight, no-bloat way to stop account sharing on membership sites, LMS courses, paid communities, and any WordPress install where one paid account shouldn't be open on five devices at once.<\/p>\n\n<p>The plugin hooks straight into WordPress's standard authentication pipeline and uses the native <code>WP_Session_Tokens<\/code> API, so it works on every host, with every theme, and alongside every login plugin you might already run. No cron jobs, no background polling, no third-party services.<\/p>\n\n<h3>How it works<\/h3>\n\n<p>A \"session\" in WordPress is the authenticated token created the moment a user logs in \u2014 one per browser, per device. Two browsers on the same laptop count as two sessions; a phone and a desktop count as two. Closing a tab does <strong>not<\/strong> end a session \u2014 the token lives server-side until the user explicitly signs out or another login displaces it.<\/p>\n\n<p>Loggedin watches every login attempt:<\/p>\n\n<ol>\n<li>Counts the user's current active sessions.<\/li>\n<li>Compares that count to the limit you've configured.<\/li>\n<li>Applies the rule you've picked \u2014 silently make room for the new login, or reject the new login with an error on wp-login.<\/li>\n<\/ol>\n\n<p>There's a one-click <strong>Force Logout<\/strong> panel in the admin to clear every session for a specific user when someone's locked out by the cap and can't reach their other devices. Identify the user by ID, email, or username \u2014 all three work.<\/p>\n\n<h3>Who it's for<\/h3>\n\n<ul>\n<li><strong>Membership sites<\/strong> \u2014 MemberPress, Paid Memberships Pro, Restrict Content Pro, WooCommerce Memberships, etc. Stop one paid account from being shared across a household, a classroom, or a Discord server.<\/li>\n<li><strong>Online courses &amp; LMS<\/strong> \u2014 LearnDash, LifterLMS, TutorLMS, Sensei. Make sure the seat someone paid for is actually used by that someone.<\/li>\n<li><strong>Subscription stores<\/strong> \u2014 WooCommerce Subscriptions, Easy Digital Downloads recurring. Keep subscriber counts honest.<\/li>\n<li><strong>Corporate intranets &amp; client portals<\/strong> \u2014 Enforce a one-device-at-a-time policy for staff or client accounts.<\/li>\n<li><strong>BuddyPress \/ BuddyBoss communities<\/strong> \u2014 Reduce ban-evasion and duplicate-account abuse.<\/li>\n<li><strong>Compliance-driven sites<\/strong> \u2014 Healthcare, finance, education installs where audit policy requires a per-account session cap.<\/li>\n<\/ul>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>Session management from the dashboard<\/strong> \u2014 Inspect and end user sessions from <strong>Users \u2192 Loggedin<\/strong>, or from WP-CLI. Add the Active Sessions add-on for a live, sortable view of every signed-in user and device.<\/li>\n<li><strong>Global concurrent-login limit<\/strong> \u2014 Pick any number from 1 upwards as the per-user cap.<\/li>\n<li><strong>Three built-in modes<\/strong> \u2014 Logout Oldest (kick the user's oldest device, keep the rest), Logout All (the new login becomes the only active session), or Block New (reject the login and show an error on wp-login).<\/li>\n<li><strong>Admin Force Logout<\/strong> \u2014 Type a user ID, email, or username and clear every active session for that user in one click.<\/li>\n<li><strong>Works with any session storage<\/strong> \u2014 Uses the standard <code>WP_Session_Tokens<\/code> API. Stock WordPress, Redis, Memcached \u2014 all supported (the Logout Oldest mode needs the default user-meta storage; the other modes work everywhere).<\/li>\n<li><strong>Customizable error message<\/strong> \u2014 Override the message shown when a login is blocked, via a single filter.<\/li>\n<li><strong>WP-CLI support<\/strong> \u2014 Inspect and destroy user sessions and read or write settings from the command line: <code>wp loggedin sessions list &lt;user&gt;<\/code>, <code>wp loggedin sessions destroy &lt;user&gt;<\/code>, <code>wp loggedin settings set maximum 3<\/code>. Ideal for bulk operations, deploy scripts and headless installs.<\/li>\n<li><strong>Built for developers<\/strong> \u2014 Every decision passes through documented PHP hooks and filters. Override the cap per user \/ role \/ capability, exempt service accounts, audit force-logouts, or splice the plugin into your own auth pipeline. Full hook reference in the <a href=\"https:\/\/docs.duckdev.com\/loggedin\/developer-docs\">developer docs<\/a>.<\/li>\n<li><strong>Lightweight<\/strong> \u2014 No cron, no background polling, no remote calls. The whole plugin runs at the moment a login happens.<\/li>\n<li><strong>Translation-ready<\/strong> \u2014 Loaded with the WordPress i18n APIs; contribute translations on WordPress.org.<\/li>\n<\/ul>\n\n<h3>\ud83d\udce6 Add-ons<\/h3>\n\n<p>Extend Loggedin with these official <a href=\"https:\/\/duckdev.com\/addons\/loggedin\/\">add-ons<\/a>:<\/p>\n\n<ul>\n<li><strong><a href=\"https:\/\/duckdev.com\/addon\/loggedin-active-sessions\/\">Active Sessions<\/a><\/strong> \u2014 See exactly who's signed in right now, drill into each device per user, and sign out a single session \u2014 or every session \u2014 in one click.<\/li>\n<li><strong><a href=\"https:\/\/duckdev.com\/addon\/limit-per-user\/\">Limit Per User<\/a><\/strong> \u2014 Override the global session cap for an individual user account directly from their WordPress profile. Perfect for tiered access or trusted-staff exemptions.<\/li>\n<li><strong><a href=\"https:\/\/duckdev.com\/addon\/limit-per-role\/\">Limit Per Role<\/a><\/strong> \u2014 Set a different concurrent-session cap per WordPress role. Give administrators more headroom while keeping subscribers tight, or vice versa.<\/li>\n<li><strong><a href=\"https:\/\/duckdev.com\/addon\/real-time-logout\/\">Real-time Logout<\/a><\/strong> \u2014 Detect logouts in near-real-time. When Loggedin terminates a session, the user's other open tabs reload to wp-login automatically \u2014 no waiting for the next page click.<\/li>\n<\/ul>\n\n<h3>\ud83d\udcda Documentation<\/h3>\n\n<ul>\n<li><a href=\"https:\/\/docs.duckdev.com\/loggedin\/getting-started\">Getting started<\/a><\/li>\n<li><a href=\"https:\/\/docs.duckdev.com\/loggedin\/general-settings\">General settings<\/a><\/li>\n<li><a href=\"https:\/\/docs.duckdev.com\/loggedin\/force-logout\">Force Logout (Manage Sessions)<\/a><\/li>\n<li><a href=\"https:\/\/docs.duckdev.com\/loggedin\/wp-cli\">WP-CLI commands<\/a><\/li>\n<li><a href=\"https:\/\/docs.duckdev.com\/loggedin\/addons\/\">Add-ons overview<\/a><\/li>\n<li><a href=\"https:\/\/docs.duckdev.com\/loggedin\/developer-docs\">Developer docs \u2014 hooks, filters, REST<\/a><\/li>\n<\/ul>\n\n<h3>\ud83d\udc1b Bug reports<\/h3>\n\n<p>Found a bug? File it on the <a href=\"https:\/\/github.com\/Joel-James\/loggedin\/issues\">Loggedin GitHub repository<\/a>.<\/p>\n\n<p><em>GitHub is for bug reports and development-related issues only. For end-user support, please use the WordPress.org <a href=\"https:\/\/wordpress.org\/support\/plugin\/loggedin\/\">support forums<\/a>.<\/em><\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install Loggedin from the WordPress.org plugin directory (<strong>Plugins \u2192 Add New \u2192 search \"Loggedin\"<\/strong>) or upload the ZIP under <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>. Full instructions: <a href=\"https:\/\/docs.duckdev.com\/general\/installing-plugin\">how to install a plugin<\/a>.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>Users \u2192 Loggedin<\/strong> to configure the concurrent-login limit and pick the rule applied when the limit is reached.<\/li>\n<\/ol>\n\n<p>That's it. The default \u2014 limit of <code>1<\/code>, <strong>Logout All<\/strong> mode \u2014 already prevents account sharing on a fresh install.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20loggedin%20a%20full%20session%20manager%3F\"><h3>Is Loggedin a full session manager?<\/h3><\/dt>\n<dd><p>It manages the sessions WordPress already creates, rather than replacing WordPress's session handling. Here's exactly what's in the free plugin:<\/p>\n\n<ul>\n<li><strong>Limit<\/strong> how many sessions an account can hold at once, and choose what happens when the limit is reached.<\/li>\n<li><strong>Force logout<\/strong> every session for any user, from the admin or from WP-CLI.<\/li>\n<li><strong>Inspect<\/strong> a user's active sessions \u2014 login time, expiry, IP and device \u2014 via <code>wp loggedin sessions list<\/code>.<\/li>\n<\/ul>\n\n<p>For a live, sortable view of every signed-in user across the site, with per-device detail and one-click sign-out, add the <a href=\"https:\/\/duckdev.com\/addon\/loggedin-active-sessions\/\">Active Sessions<\/a> add-on. Idle timeouts and login alerts are on the roadmap as add-ons too.<\/p>\n\n<p>If all you need is to cap concurrent logins and stop account sharing, the free plugin does that on its own \u2014 no add-on required.<\/p><\/dd>\n<dt id=\"will%20this%20stop%20users%20from%20sharing%20their%20wordpress%20password%3F\"><h3>Will this stop users from sharing their WordPress password?<\/h3><\/dt>\n<dd><p>It stops <em>simultaneous<\/em> sharing \u2014 two people can't be signed in to the same account on different devices at the same time once the cap is set to <code>1<\/code>. They can still take turns logging in if you don't want to block the new login outright. Pick <strong>Block New<\/strong> mode to refuse the second login entirely and force the password-sharer to also log out the first device, which most people won't do.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20woocommerce%2C%20memberpress%2C%20learndash%2C%20buddypress%2C%20etc.%3F\"><h3>Does this work with WooCommerce, MemberPress, LearnDash, BuddyPress, etc.?<\/h3><\/dt>\n<dd><p>Yes. Loggedin hooks into the standard WordPress authentication pipeline (<code>wp_authenticate_user<\/code> and <code>check_password<\/code>), so any plugin that logs users in through the normal WordPress flow \u2014 which is essentially every membership, LMS, e-commerce, and community plugin \u2014 is covered automatically. No integration code required.<\/p><\/dd>\n<dt id=\"can%20i%20set%20different%20limits%20for%20administrators%20and%20subscribers%3F\"><h3>Can I set different limits for administrators and subscribers?<\/h3><\/dt>\n<dd><p>Yes, with the official <a href=\"https:\/\/duckdev.com\/addon\/limit-per-role\/\">Limit Per Role add-on<\/a>. It adds a per-role panel to the settings page where you can give each WordPress role its own cap (e.g. administrators: 5, editors: 3, subscribers: 1). Users with multiple roles get the highest configured limit.<\/p><\/dd>\n<dt id=\"can%20i%20set%20a%20different%20limit%20for%20one%20specific%20user%3F\"><h3>Can I set a different limit for one specific user?<\/h3><\/dt>\n<dd><p>Yes, with the official <a href=\"https:\/\/duckdev.com\/addon\/limit-per-user\/\">Limit Per User add-on<\/a>. It adds a field to the WordPress profile screen so you can override the global cap on a per-user basis \u2014 useful for shared editorial accounts, executive users, or anyone who legitimately needs more sessions than your default.<\/p><\/dd>\n<dt id=\"will%20current%20users%20be%20logged%20out%20when%20i%20install%20or%20change%20the%20limit%3F\"><h3>Will current users be logged out when I install or change the limit?<\/h3><\/dt>\n<dd><p>No. Loggedin only acts when a <em>new<\/em> login happens. Existing sessions stay active until they expire, the user logs out, or a future login displaces them under the rule you've configured.<\/p><\/dd>\n<dt id=\"where%20can%20i%20find%20the%20settings%20for%20loggedin%3F\"><h3>Where can I find the settings for Loggedin?<\/h3><\/dt>\n<dd><p>In the WordPress admin, go to <strong>Users \u2192 Loggedin<\/strong>. You'll see two tabs \u2014 <strong>Settings<\/strong> for the cap and login logic, and <strong>Add-ons<\/strong> for installing and licensing first-party extensions.<\/p><\/dd>\n<dt id=\"what%20are%20the%20available%20login%20logic%20options%3F\"><h3>What are the available login logic options?<\/h3><\/dt>\n<dd><p>The plugin offers three built-in modes:<\/p>\n\n<ul>\n<li><strong>Logout Oldest<\/strong> \u2014 When the limit is reached, the user's single oldest active session is terminated to make room for the new login. Closest match to consumer \"remember me\" UX.<\/li>\n<li><strong>Logout All<\/strong> \u2014 When the limit is reached, every other active session for the user is terminated and the new login becomes the only active session.<\/li>\n<li><strong>Block New<\/strong> \u2014 When the limit is reached, the new login attempt is rejected with an error on wp-login.<\/li>\n<\/ul>\n\n<p>Additional modes can be added via the <code>loggedin_logics<\/code> filter. See the <a href=\"https:\/\/docs.duckdev.com\/loggedin\/general-settings#login-logic\">General Settings docs<\/a> for details.<\/p><\/dd>\n<dt id=\"how%20long%20does%20a%20login%20session%20last%3F\"><h3>How long does a login session last?<\/h3><\/dt>\n<dd><p>The duration of a WordPress login session is controlled by WordPress, not Loggedin.<\/p>\n\n<ul>\n<li>\"Remember Me\" checked at login \u2192 session lasts <strong>14 days<\/strong>.<\/li>\n<li>\"Remember Me\" not checked \u2192 session lasts <strong>2 days<\/strong>.<\/li>\n<\/ul>\n\n<p>Customize the duration with the standard <code>auth_cookie_expiration<\/code> filter:<\/p>\n\n<pre><code>`php\n<\/code><\/pre>\n\n<p>function custom_auth_cookie_expiration( $expire ) {\n    return MONTH_IN_SECONDS; \/\/ 30 days for every login.\n}<\/p>\n\n<p>add_filter( 'auth_cookie_expiration', 'custom_auth_cookie_expiration' );\n    `<\/p><\/dd>\n<dt id=\"what%20if%20a%20user%20has%20reached%20the%20limit%20but%20doesn%27t%20know%20which%20devices%20are%20active%3F\"><h3>What if a user has reached the limit but doesn't know which devices are active?<\/h3><\/dt>\n<dd><p>Administrators can force-logout every session for the user from the dashboard:<\/p>\n\n<ol>\n<li>Go to <strong>Users \u2192 Loggedin<\/strong> in the WordPress admin.<\/li>\n<li>Scroll to the <strong>Force Logout<\/strong> panel at the bottom of the Settings tab.<\/li>\n<li>Enter the user's ID, email address, or username and click <strong>Force Logout<\/strong>. All active sessions for that user are terminated immediately.<\/li>\n<\/ol><\/dd>\n<dt id=\"does%20loggedin%20work%20with%20redis%20%2F%20memcached%20%2F%20external%20session%20storage%3F\"><h3>Does Loggedin work with Redis \/ Memcached \/ external session storage?<\/h3><\/dt>\n<dd><p>Yes for the <strong>Logout All<\/strong> and <strong>Block New<\/strong> modes \u2014 both go through the standard <code>WP_Session_Tokens<\/code> API, which respects whatever storage backend WordPress is configured to use. The <strong>Logout Oldest<\/strong> mode needs the default user-meta storage because the WP API doesn't expose a \"drop the oldest\" primitive; pick Logout All instead if your sessions live elsewhere.<\/p><\/dd>\n<dt id=\"does%20loggedin%20support%20wp-cli%3F\"><h3>Does Loggedin support WP-CLI?<\/h3><\/dt>\n<dd><p>Yes, since 3.1.0. Every command lives under <code>wp loggedin<\/code> \u2014 <code>wp loggedin sessions<\/code> lists, counts and destroys a user's active sessions, and <code>wp loggedin settings<\/code> reads and writes the plugin settings. Destructive commands prompt for confirmation unless you pass <code>--yes<\/code>.<\/p>\n\n<p>See the <a href=\"https:\/\/docs.duckdev.com\/loggedin\/wp-cli\">WP-CLI documentation<\/a> for the full command reference, options and scripting examples, or run <code>wp help loggedin<\/code> in your terminal.<\/p><\/dd>\n<dt id=\"is%20loggedin%20gdpr-compliant%3F\"><h3>Is Loggedin GDPR-compliant?<\/h3><\/dt>\n<dd><p>Loggedin stores no personal data itself. It only counts and manipulates WordPress session tokens that already exist in your database via the standard <code>WP_Session_Tokens<\/code> API. No external services are called, no telemetry is sent.<\/p><\/dd>\n<dt id=\"does%20loggedin%20slow%20down%20logins%3F\"><h3>Does Loggedin slow down logins?<\/h3><\/dt>\n<dd><p>No. The work Loggedin does on each login is one query for the user's existing session tokens and an in-memory count \u2014 measured in microseconds. No HTTP calls, no cron jobs, no background polling.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20error%20message%20shown%20when%20a%20login%20is%20blocked%3F\"><h3>Can I customize the error message shown when a login is blocked?<\/h3><\/dt>\n<dd><p>Yes, via the <code>loggedin_error_message<\/code> filter:<\/p>\n\n<pre><code>`php\n<\/code><\/pre>\n\n<p>add_filter( 'loggedin_error_message', function ( $message ) {\n    return 'Your account is already signed in elsewhere. Sign out from another device to continue.';\n} );\n    `<\/p>\n\n<p>See the <a href=\"https:\/\/docs.duckdev.com\/loggedin\/developer-docs\">developer docs<\/a> for every filter and action the plugin exposes.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.1.0<\/h4>\n\n<ul>\n<li>New: WP-CLI support \u2014 manage Loggedin from the command line with <code>wp loggedin sessions<\/code> (list, count, destroy) and <code>wp loggedin settings<\/code> (list, get, set). Run <code>wp help loggedin<\/code> for the full reference.<\/li>\n<li>New: <code>wp loggedin sessions destroy &lt;user&gt; --token=&lt;hash&gt;<\/code> signs a user out of a single device instead of all of them.<\/li>\n<li>New: <code>loggedin_cli_init<\/code> action so add-ons can register their own subcommands under the <code>wp loggedin<\/code> namespace.<\/li>\n<li>New: <code>loggedin_destroy_session<\/code> action fired when an individual session is destroyed.<\/li>\n<li>Improve: Renamed to \"Loggedin - Session Manager, Limit Concurrent Logins &amp; Force Logout\" to reflect the plugin's broader scope. Nothing about the concurrent-login limiting has changed \u2014 same settings, same behaviour, same plugin.<\/li>\n<li>Improve: The CLI refuses to write a setting the sanitizer would reject, so a typo can no longer silently reset your login logic to the default.<\/li>\n<li>Improve: CLI commands are only loaded on WP-CLI requests \u2014 a normal page load doesn't pay for them.<\/li>\n<\/ul>\n\n<h4>3.0.2<\/h4>\n\n<ul>\n<li>New: Review-request notice restored, powered by the <code>duckdev\/wp-review-notice<\/code> library and scoped to the Loggedin settings screen with a 7-day delay.<\/li>\n<li>Improve: Legacy review-notice state migrated to the new storage keys so users who already dismissed the prompt stay dismissed.<\/li>\n<li>Improve: Admin notices now render inside the plugin's centered page column instead of above the header, matching the 404 to 301 shell.<\/li>\n<li>Fix: Left-hand gap between the plugin header and the admin sidebar caused by WordPress's default <code>#wpcontent<\/code> padding.<\/li>\n<\/ul>\n\n<h4>3.0.1<\/h4>\n\n<ul>\n<li>New: <code>loggedin.admin.tabs<\/code> JS filter \u2014 addons can register their own React component as a tab in the Loggedin admin nav, with optional <code>before<\/code> \/ <code>after<\/code> positioning hints. Powers the new Active Sessions addon.<\/li>\n<li>New: Cross-sell banner on the Force Logout panel routed through <code>loggedin.settings.force_logout.cross_sell<\/code> so addons can hide or replace it once installed.<\/li>\n<li>Improve: Addon card layout aligned with the 404 to 301 plugin \u2014 primary CTA pinned to the left of the footer, \"More details\" link on the right, title-cased license button labels.<\/li>\n<li>Fix: The v2 \u2192 v3 settings migration never ran on existing installs, leaving legacy option keys in place after the upgrade.<\/li>\n<\/ul>\n\n<h4>3.0.0<\/h4>\n\n<ul>\n<li>New: Modern React-powered admin under Users \u2192 Loggedin with two tabs \u2014 Settings (concurrent-login limit + login logic + Force Logout panel) and Add-ons (catalogue + license management).<\/li>\n<li>New: REST API at <code>\/loggedin\/v1\/<\/code> for settings, session management and add-on licensing.<\/li>\n<li>New: Unified <code>loggedin_settings<\/code> option registered with <code>show_in_rest<\/code>, readable and writable by the React admin and by external integrations through the standard core-data flow.<\/li>\n<li>New: Force Logout panel now accepts a user ID, email or username \u2014 the resolver detects the input shape automatically.<\/li>\n<li>New: Add-ons module powered by Freemius \u2014 official add-ons (Real-time Logout, Limit Per User, Limit Per Role) self-register via the new <code>loggedin_register_addon<\/code> filter and appear in the Add-ons tab.<\/li>\n<li>New: JavaScript extension slot \u2014 add-ons can append their own React <code>PanelBody<\/code> to the Settings tab via the <code>loggedin.settings.panels<\/code> filter.<\/li>\n<li>New: Documented PHP hook surface \u2014 <code>loggedin_init<\/code>, <code>loggedin_settings_defaults<\/code>, <code>loggedin_admin_script_vars<\/code>, <code>loggedin_addons_catalog<\/code>, <code>loggedin_destroy_oldest_session<\/code> and more.<\/li>\n<li>Improve: Reorganised plugin structure (PSR-4 namespaces under <code>DuckDev\\Loggedin\\<\/code>) and aligned with WordPress Coding Standards.<\/li>\n<li>Improve: Comprehensive sanitisation pass across every input and option write path.<\/li>\n<li>Improve: PHP 7.4 is now the minimum supported version.<\/li>\n<\/ul>\n\n<p>For the full release history, see the <a href=\"https:\/\/docs.duckdev.com\/loggedin\/changelog\">changelog<\/a>.<\/p>","raw_excerpt":"WordPress session manager \u2014 limit concurrent user logins, stop account sharing, force logout active sessions, and manage every signed-in device.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/49421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=49421"}],"author":[{"embeddable":true,"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/joelcj91"}],"wp:attachment":[{"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=49421"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=49421"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=49421"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=49421"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=49421"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lug.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=49421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}