{"id":299441,"date":"2026-07-21T22:26:31","date_gmt":"2026-07-21T22:26:31","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/presence-api\/"},"modified":"2026-07-21T22:25:35","modified_gmt":"2026-07-21T22:25:35","slug":"presence-api","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/presence-api\/","author":5911429,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.4","stable_tag":"0.1.4","tested":"7.0.2","requires":"7.0","requires_php":"7.4","requires_plugins":null,"header_name":"Presence API","header_author":"Joe Fusco","header_description":"System-wide presence and awareness for WordPress.","assets_banners_color":"3e4347","last_updated":"2026-07-21 22:25:35","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":30,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"0.1.4":{"tag":"0.1.4","author":"JoeFusco","date":"2026-07-21 22:25:35"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3617894,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3617894,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3617894,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3617907,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3617907,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.4"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[262246],"plugin_tags":[13780,5901,28310,866],"plugin_category":[],"plugin_contributors":[81359],"plugin_business_model":[216239],"class_list":["post-299441","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-awareness","plugin_tags-heartbeat","plugin_tags-presence","plugin_tags-real-time","plugin_contributors-joefusco","plugin_business_model-community","plugin_committers-joefusco","plugin_committers-wordpressdotorg"],"banners":{"banner":"https:\/\/ps.w.org\/presence-api\/assets\/banner-772x250.png?rev=3617907","banner_2x":"https:\/\/ps.w.org\/presence-api\/assets\/banner-1544x500.png?rev=3617907","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/presence-api\/assets\/icon.svg?rev=3617894","icon":"https:\/\/ps.w.org\/presence-api\/assets\/icon.svg?rev=3617894","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Tracks which users are logged in, what admin screen they are viewing, and which posts are being edited. Uses a dedicated database table with a 60-second TTL. Data flows through the existing Heartbeat API.<\/p>\n\n<p>For full details, see the <a href=\"https:\/\/github.com\/WordPress\/presence-api\">GitHub repository<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate through the \"Plugins\" menu in WordPress.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Auto-sync readme.txt changelog from CHANGELOG.md in sync-versions.sh.<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Add 40-user Playground blueprint.<\/li>\n<li>Add 40-user Playground blueprint (down from 100).<\/li>\n<li>Address stale-screen review feedback.<\/li>\n<li>Address WordPress.org plugin review feedback.<\/li>\n<li>Close wp_presence_current_screen_key() brace dropped by autofix.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Add WordPress Playground blueprint for one-click testing.<\/li>\n<li>Remove demo CLI command from production builds.<\/li>\n<li>Split CI into separate PHPCS, PHPUnit, and Multisite workflows.<\/li>\n<li>Exclude vendor directory from release zip.<\/li>\n<li>Add readme.txt for WordPress.org directory submission.<\/li>\n<li>Add WordPress.org repository compliance files (CONTRIBUTING, CODEOWNERS, CODE_OF_CONDUCT).<\/li>\n<li>Move community health files to .github\/.<\/li>\n<li>Replace deprecated get_page_by_title() with WP_Query.<\/li>\n<li>Add ABSPATH guards to db-viewer.php and demo-seeder.php.<\/li>\n<li>Exclude .claude directory from release zip.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Fix Plugin Check errors for directory submission.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Dedicated <code>wp_presence<\/code> table with <code>UNIQUE KEY (room, client_id)<\/code> for atomic upserts via <code>INSERT ... ON DUPLICATE KEY UPDATE<\/code>.<\/li>\n<li>60-second TTL with batched cron cleanup.<\/li>\n<li>Public API: <code>wp_get_presence<\/code>, <code>wp_set_presence<\/code>, <code>wp_remove_presence<\/code>, <code>wp_remove_user_presence<\/code>, <code>wp_can_access_presence_room<\/code>, <code>wp_presence_post_room<\/code>.<\/li>\n<li>REST endpoints: <code>GET\/POST\/DELETE \/wp-presence\/v1\/presence<\/code>, <code>GET \/wp-presence\/v1\/presence\/rooms<\/code> with SQL pagination and <code>Cache-Control: no-store<\/code>.<\/li>\n<li>Heartbeat integration for admin and editor presence pings.<\/li>\n<li>Post-lock bridge: translates <code>wp-refresh-post-lock<\/code> into presence entries.<\/li>\n<li>Login\/logout lifecycle hooks gated on <code>edit_posts<\/code>.<\/li>\n<li>Dashboard widgets: Who's Online (with idle detection, overflow threshold, avatar stacks) and Active Posts (grouped by post with editor counts).<\/li>\n<li>Admin bar indicator: avatar stack for same-page users, dropdown grouped by \"On this page\" \/ \"Elsewhere\", alphabetically sorted.<\/li>\n<li>Post list \"Editors\" column with avatar stacks.<\/li>\n<li>Users list \"Online\" filter tab.<\/li>\n<li>WP-CLI: <code>set<\/code>, <code>list<\/code>, <code>summary<\/code>, <code>cleanup<\/code>.<\/li>\n<li>Debugger widget (WP_DEBUG only): heartbeat monitor with live table viewer.<\/li>\n<li><code>wp_presence_default_ttl<\/code> filter and <code>WP_PRESENCE_DEFAULT_TTL<\/code> constant.<\/li>\n<li>Multisite-aware <code>uninstall.php<\/code>.<\/li>\n<li>Full i18n with <code>.pot<\/code> file.<\/li>\n<li>WCAG AA accessibility: ARIA labels, <code>aria-live<\/code>, keyboard navigation.<\/li>\n<li>59 PHPUnit tests, 118 assertions.<\/li>\n<li>Playwright e2e tests with screenshot artifacts.<\/li>\n<\/ul>","raw_excerpt":"System-wide presence and awareness for WordPress.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/299441","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/users\/5911429"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=299441"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=299441"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=299441"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=299441"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=299441"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=299441"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=299441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}