{"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-24T17:51:52","modified_gmt":"2026-07-24T17:51:52","slug":"presence-api","status":"publish","type":"plugin","link":"https:\/\/pan.wordpress.org\/plugins\/presence-api\/","author":5911429,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.8","stable_tag":"0.1.8","tested":"7.0.2","requires":"7.0","requires_php":"7.4","requires_plugins":null,"header_name":"Presence API","header_author":"WordPress Core Team","header_description":"System-wide presence and awareness for WordPress.","assets_banners_color":"3e4347","last_updated":"2026-07-24 17:51:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/make.wordpress.org\/core\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":163,"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"},"0.1.5":{"tag":"0.1.5","author":"JoeFusco","date":"2026-07-23 14:20:33"},"0.1.6":{"tag":"0.1.6","author":"JoeFusco","date":"2026-07-23 15:10:00"},"0.1.7":{"tag":"0.1.7","author":"JoeFusco","date":"2026-07-24 03:30:50"},"0.1.8":{"tag":"0.1.8","author":"JoeFusco","date":"2026-07-24 17:51:52"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3620136,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3620136,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3620136,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3620136,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3620136,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.4","0.1.5","0.1.6","0.1.7","0.1.8"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[262246],"plugin_tags":[13780,5901,28310,866],"plugin_category":[],"plugin_contributors":[273209,273072,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-ashishjii","plugin_contributors-intenzi","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=3620136","banner_2x":"https:\/\/ps.w.org\/presence-api\/assets\/banner-1544x500.png?rev=3620136","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/presence-api\/assets\/icon.svg?rev=3620136","icon":"https:\/\/ps.w.org\/presence-api\/assets\/icon.svg?rev=3620136","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Presence API gives WordPress a system-wide awareness layer. It tracks which users are logged in, which admin screen they are on, and which posts they are editing.<\/p>\n\n<p>Data flows through the Heartbeat API and is stored in a dedicated <code>wp_presence<\/code> table with a 60-second TTL. No writes to <code>wp_postmeta<\/code> means no post-cache invalidation on every heartbeat.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Who's Online dashboard widget with idle detection<\/li>\n<li>Active Posts dashboard widget grouped by post<\/li>\n<li>Admin bar indicator showing other users on the same page<\/li>\n<li>Editors column in the post list<\/li>\n<li>Online filter in the Users list<\/li>\n<\/ul>\n\n<h4>Try it<\/h4>\n\n<p><a href=\"https:\/\/playground.wordpress.net\/?blueprint-url=https:\/\/raw.githubusercontent.com\/WordPress\/presence-api\/main\/blueprint.json\">Test in WordPress Playground<\/a> without installing anything.<\/p>\n\n<p><a href=\"https:\/\/youtu.be\/Xa5WkZdjBD4\">Watch the demo on YouTube<\/a><\/p>\n\n<h4>For Developers<\/h4>\n\n<p>PHP functions, REST endpoints, WP-CLI commands, filters, and room conventions are documented in the <a href=\"https:\/\/github.com\/WordPress\/presence-api\">GitHub repository<\/a>.<\/p>\n\n<h4>Background<\/h4>\n\n<p>An experimental feature plugin sponsored by the WordPress Core team, exploring what system-wide presence could look like for a future WordPress release. Follow development on <a href=\"https:\/\/make.wordpress.org\/core\/\">make.wordpress.org\/core<\/a> with the tag <code>#presence-api<\/code>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In your WordPress admin, go to <strong>Plugins \u2192 Add New Plugin<\/strong> and search for \"Presence API\", then click <strong>Install Now<\/strong>.<\/li>\n<li>Activate through the <strong>Plugins<\/strong> menu.<\/li>\n<\/ol>\n\n<p>Or install manually:<\/p>\n\n<ol>\n<li>Download the zip and upload the <code>presence-api<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate through the <strong>Plugins<\/strong> menu.<\/li>\n<\/ol>\n\n<p>Or <a href=\"https:\/\/playground.wordpress.net\/?blueprint-url=https:\/\/raw.githubusercontent.com\/WordPress\/presence-api\/main\/blueprint.json\">try it in WordPress Playground<\/a> without installing anything.<\/p>\n\n<!--section=changelog-->\n<h4>0.1.8<\/h4>\n\n<ul>\n<li>Add AI Tools disclosure to automated contributor PR body.<\/li>\n<li>Add concurrency group, use default_branch instead of hardcoded main.<\/li>\n<li>Robot PR body for first contributions, suppress props-bot on contributor PRs.<\/li>\n<li>Suppress props-bot on release-please PRs.<\/li>\n<li>Use user.type for bot detection, wrap fetch in full try\/catch.<\/li>\n<li>Remove AI disclosure from automated PR body.<\/li>\n<\/ul>\n\n<h4>0.1.7<\/h4>\n\n<ul>\n<li>Add validate_callback validation check to REST screen_key.<\/li>\n<li>Use correct REST route in PHPUnit tests.<\/li>\n<\/ul>\n\n<h4>0.1.6<\/h4>\n\n<ul>\n<li>Dispatch deploy workflow instead of calling as reusable to avoid startup failure.<\/li>\n<li>Flatten deploy workflow to remove reusable nesting causing startup failure.<\/li>\n<li>Use 10up action ASSETS_DIR instead of separate assets workflow.<\/li>\n<li>Use correct heading format in Unlinked Accounts regex.<\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Check entry ownership before enforcing per-user presence limit (<a href=\"https:\/\/github.com\/WordPress\/presence-api\/commit\/5698d9425baa9a67561626c4ca8421a5daf64728\">5698d94<\/a>), closes <a href=\"https:\/\/github.com\/WordPress\/presence-api\/issues\/88\">#88<\/a>.<\/li>\n<li>Exclude expired entries from ownership check to keep cap exact.<\/li>\n<li>Pass VERSION env var to deploy action so SVN tag matches git tag.<\/li>\n<li>Preserve version headings in sync script and correct wp_options claim.<\/li>\n<\/ul>\n\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Maintenance release.<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Add 40-user Playground blueprint.<\/li>\n<li>Address stale-screen review feedback.<\/li>\n<li>Address WordPress.org plugin review feedback.<\/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<\/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:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/299441","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"author":[{"embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/users\/5911429"}],"replies":[{"embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=299441"}],"wp:attachment":[{"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=299441"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=299441"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=299441"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=299441"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=299441"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pan.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=299441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}