noindex robots meta tag so search engines drop them, and the Posts and Pages admin lists show an "Unlisted" label next to each one.
Where the toggle lives
_unlisted_post post meta value and keeps a small cached list of unlisted IDs, so there is no extra query cost on the front end.
Custom post types
Posts and pages are supported by default. Add other post types with the unlisted_posts_post_types filter. A post type must support custom-fields for the block editor toggle to save.
add_filter( 'unlisted_posts_post_types', function ( $types ) { $types[] = 'product'; return $types; } );
Yes. Anyone with the link can open it and share it like any other URL. It is only left out of lists, feeds and search engines. If you need real access control, use WordPress's private or password-protected visibility instead.
The page sends a noindex robots meta tag and is left out of the core XML sitemaps, so search engines that respect those signals will not index it. If an SEO plugin builds your sitemap, check that it honours noindex (most do) or exclude the post there as well.
Yes. The classic editor gets a checkbox in the Publish box, and the block editor gets a toggle in the Summary panel.
No. Existing unlisted posts are migrated automatically the first time the admin loads after updating.
unlisted_posts_post_types filter._unlisted_post post meta (exposed to the REST API), so it survives exports, imports and WP-CLI. Existing unlisted posts are migrated automatically.noindex tag uses the wp_robots API instead of the deprecated wp_no_robots() function, and is only added on the unlisted post itself.post__not_in value set by other plugins or themes.unlisted-posts so translations from WordPress.org load.