Presence API: What’s new

An update on the Presence API feature plugin, announced in April. Here’s everything that’s shipped since then.

Current version: 0.14.0. Requires WordPress 7.0 and PHP 7.4.

Post locks live in the presence table, so refreshing one no longer bumps the posts cache key.

In this post

What’s new since April

  • Every avatar now requests the right resolution for retina screens (#481).
  • The “someone else updated this” banner shows up again correctly if you dismiss it and someone edits again (#371).
  • Keyboard users can reach every item in the admin bar menu, and focus stays put when the dashboard widgets refresh (#271, #275, #390).
  • One tab now polls and shares results with the rest, background tabs stop sending presence, and idle screens back off automatically (#300, #307, #675).
  • The Editors column and the Online users list refresh on each heartbeat (#604, #606).
  • Site Health tells you when Heartbeat can’t keep presence current (#544).

Recording and privacy

Recording is on by default. Switch it off for one site on Settings > General, or for every site at once on Network Admin > Settings. If either switch is off, recording is off, and post locks keep working either way (#429, #442). A privacy policy section, exporter and eraser cover presence data too (#449).

Each site has its own switch.
The network switch overrides every site’s own setting when it’s off.

From WP-CLI, run wp presence recording set off, or add --network for the whole network.

Multisite

Network Admin now shows who’s online across every site, with matching REST and WP-CLI. It’s on by default for networks below wp_is_large_network(), and the wp_presence_network_aggregation_enabled filter turns it on or off (#332, #365).

Each site writes a summary row, so Network Admin reads one table instead of every site’s.

Post locks

Post locks now live in the presence table instead of post meta, so refreshing a lock no longer invalidates every cached post query on sites with a persistent object cache (#551). Locks keep working with recording switched off (#644).

Every post type

Presence works on every post type with an editor, including what the Site Editor has open (#631, #638). Roles that can edit only pages or a custom post type get presence too (#637).

Who sees what

Everyone online still appears in the admin bar, but where they are is now behind the view_presence_location capability, which maps to list_users by default (#571). Everyone can always see their own. The admin bar shows whole faces beside My Account (#565, #574). A face is ringed in the person’s block editor color only when you’re both in the same post, the way the editor shows it, and in your admin color scheme everywhere else (#707).

AI agents

An AI agent editing over REST or MCP sends no Heartbeat, so it wouldn’t show up on its own. As of 0.13.0, each save writes a presence row for it in that post’s room, and the row expires about 75 seconds after its last save by default. The row appears in the admin bar and the Editors column with an Agent badge (#653, #697, #701).

The plugin doesn’t decide who is an agent. It asks the Agent Users plugin through wpai_is_agent_user() when that’s loaded, and any plugin can answer through the wp_presence_is_agent_user filter. With neither, nobody is labeled.

Performance

In 0.12.2, each presence query is read once per request until the table changes, which took a Users screen heartbeat from 6 presence reads to 2 (#678). The plugin also stopped checking its tables on every admin page (#657, #682), and only one visible tab per site sends the Heartbeat ping (#675).

For developers

  • As of 0.14.0, REST presence entries no longer include color, and wp_presence_get_user_color() returns the block editor’s color for a user ID instead of a stored one (#707).
  • New functions: wp_presence_exchange(), wp_presence_leave() and wp_presence_is_available(), documented in the PHP API section of the README (#546, #519).
  • Each row carries its own expiry, and reads filter by client ID prefix in SQL (#541, #530).
  • An admin bar debugger replaces the Dashboard widget, and plugins can add their own rows to it (#652, #666). It’s a development tool: it loads only with WP_DEBUG on and isn’t in the WordPress.org download, so use a git checkout or the plugin’s Live Preview in Playground.
  • Writes work on SQLite (#623).
  • Gutenberg Sync Engines, a plugin for trying server-aware real-time collaboration, keeps who’s in the editor in the presence table when Presence API is active too. To see it, launch the RTC Playground, which opens a post shared with two seeded collaborators, and open the debugger: their rows start with gse-.
101 people online, each row showing its client ID and seconds since last seen.

Feedback welcome

Discussion and development: #feature-presence-api on WordPress Slack

Bug reports and discussion: GitHub Issues

Thank you to @mindctrl, @iqbal1hossain, and @iamchitti for reviewing this post.

Props to @intenzi, @ashishjii, @iamchitti, @iqbal1hossain, @wp24horas, @aldorza, @bejignesh, @stfulldev, @obenland, @moriikuri, @ishitaj34, @theaminuldev, @muneebashraf, @mindctrl, @zahidui, @mitgiselle, @jaredrethman, @jooahmed and @westonruter for contributing.

#performance, #presence-api

A WordPress Commenter

Recent Posts

WordPress 7.1.2 Release

This security release features a fix for a critical severity security vulnerability. Because this is…

1 week ago

Performance Chat Summary: 22 September 2026

The full chat log is available beginning here on Slack. WordPress Performance Trac tickets @westonruter…

1 week ago

WordPress Takes Its Turn Leading the Open Website Alliance

I’m happy to announce that I am now serving as president of the Open Website…

2 weeks ago

WordPress 7.1.1 Maintenance and Security Release

This security and maintenance release features 17 bug fixes on Core, 19 bug fixes for…

2 weeks ago

Performance Chat Summary: 8 September 2026

The full chat log is available beginning here on Slack. WordPress Performance Trac tickets @spacedmonkey…

3 weeks ago

Students Built 108 Websites in Two Weeks in Bangladesh

In July, students at two campuses in Kishoreganj, Bangladesh, built 108 websites. In eastern Uganda,…

4 weeks ago