{"id":299766,"date":"2026-05-06T12:23:42","date_gmt":"2026-05-06T12:23:42","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/content-expiry\/"},"modified":"2026-08-27T22:30:00","modified_gmt":"2026-08-27T22:30:00","slug":"stalepilot","status":"publish","type":"plugin","link":"https:\/\/gl.wordpress.org\/plugins\/stalepilot\/","author":21092980,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.1","requires":"6.6","requires_php":"7.4","requires_plugins":null,"header_name":"Teydea Content Expiry - Auto-Expire Posts & Scheduled Status Changes","header_author":"Teydea Studio","header_description":"Control what happens to content after it expires: change status, notify editors, and display countdowns.","assets_banners_color":"fafafa","last_updated":"2026-08-27 22:30:00","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/teydeastudio.com\/?utm_source=Teydea+Content+Expiry","rating":0,"author_block_rating":0,"active_installs":0,"downloads":276,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"teydeastudio","date":"2026-05-06 12:23:54","revision":3524400},"1.0.3":{"tag":"1.0.3","author":"teydeastudio","date":"2026-06-22 19:30:59","revision":3582302},"1.1.0":{"tag":"1.1.0","author":"teydeastudio","date":"2026-08-27 22:30:00","revision":3669578}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3669562,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3669562,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3669562,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3669562,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3669562,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3669578,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/options-general.php?page=stalepilot-settings-page\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"7.1\"},\"features\":{\"networking\":true},\"steps\":[{\"step\":\"login\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"stalepilot\"},\"options\":{\"activate\":true}},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"option\",\"update\",\"stalepilot__settings\",\"{\\\"general\\\":{\\\"defaultAction\\\":\\\"draft\\\",\\\"enabledPostTypes\\\":[\\\"post\\\",\\\"page\\\"],\\\"notificationsEnabled\\\":true,\\\"notificationsRecipients.roles\\\":[\\\"administrator\\\",\\\"editor\\\"],\\\"notificationsRecipients.users\\\":[],\\\"preExpiryWarningDays\\\":3,\\\"dashboardWidgetWindowDays\\\":14}}\",\"--format=json\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"post\",\"create\",\"--post_type=post\",\"--post_status=publish\",\"--post_author=1\",\"--post_name=summer-sale\",\"--post_title=Summer Sale: 30% Off All Annual Plans\",\"--post_content=<!-- wp:paragraph --><p>Our biggest sale of the year is live. Annual plans are 30% off for new and existing customers.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:stalepilot\\\/countdown {\\\"prefixText\\\":\\\"Offer ends in\\\",\\\"expiredMessage\\\":\\\"This offer has ended.\\\",\\\"warningColor\\\":\\\"#b26a00\\\",\\\"urgentColor\\\":\\\"#c1121f\\\",\\\"fontSize\\\":\\\"large\\\"} \\\/--><!-- wp:paragraph --><p>When the countdown reaches zero this post is moved to draft automatically.<\\\/p><!-- \\\/wp:paragraph -->\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"eval\",\"$container = Teydea_Studio\\\\Content_Expiry\\\\get_container(); $post = get_page_by_path( \\\"summer-sale\\\", OBJECT, \\\"post\\\" ); ( new Teydea_Studio\\\\Content_Expiry\\\\Expiry_Writer( $container ) )->set( $post->ID, time() + 9 * HOUR_IN_SECONDS, \\\"draft\\\" );\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"post\",\"create\",\"--post_type=post\",\"--post_status=publish\",\"--post_author=1\",\"--post_name=holiday-shipping-deadlines\",\"--post_title=Holiday Shipping Deadlines\",\"--post_content=<!-- wp:paragraph --><p>Cut-off dates for guaranteed delivery before the holidays.<\\\/p><!-- \\\/wp:paragraph --><!-- wp:stalepilot\\\/timed-content {\\\"visibilityMode\\\":\\\"show-until\\\",\\\"usePostExpiry\\\":true} --><div class=\\\"wp-block-stalepilot-timed-content\\\"><!-- wp:paragraph --><p>Standard shipping: order by December 18. Express shipping: order by December 21.<\\\/p><!-- \\\/wp:paragraph --><\\\/div><!-- \\\/wp:stalepilot\\\/timed-content --><!-- wp:paragraph --><p>The block above hides itself once the post expiry date passes.<\\\/p><!-- \\\/wp:paragraph -->\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"eval\",\"$container = Teydea_Studio\\\\Content_Expiry\\\\get_container(); $post = get_page_by_path( \\\"holiday-shipping-deadlines\\\", OBJECT, \\\"post\\\" ); ( new Teydea_Studio\\\\Content_Expiry\\\\Expiry_Writer( $container ) )->set( $post->ID, time() + 2 * DAY_IN_SECONDS, \\\"private\\\" );\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"post\",\"create\",\"--post_type=post\",\"--post_status=publish\",\"--post_author=1\",\"--post_name=scaling-wordpress-webinar\",\"--post_title=Webinar: Scaling WordPress for Editorial Teams\",\"--post_content=<!-- wp:paragraph --><p>Registration closes when this post expires.<\\\/p><!-- \\\/wp:paragraph -->\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"eval\",\"$container = Teydea_Studio\\\\Content_Expiry\\\\get_container(); $post = get_page_by_path( \\\"scaling-wordpress-webinar\\\", OBJECT, \\\"post\\\" ); ( new Teydea_Studio\\\\Content_Expiry\\\\Expiry_Writer( $container ) )->set( $post->ID, time() + 6 * DAY_IN_SECONDS, \\\"draft\\\" );\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"post\",\"create\",\"--post_type=post\",\"--post_status=publish\",\"--post_author=1\",\"--post_name=pricing-update-notice\",\"--post_title=Pricing Update Notice for Q3\",\"--post_content=<!-- wp:paragraph --><p>A temporary notice about the upcoming pricing change.<\\\/p><!-- \\\/wp:paragraph -->\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"eval\",\"$container = Teydea_Studio\\\\Content_Expiry\\\\get_container(); $post = get_page_by_path( \\\"pricing-update-notice\\\", OBJECT, \\\"post\\\" ); ( new Teydea_Studio\\\\Content_Expiry\\\\Expiry_Writer( $container ) )->set( $post->ID, time() + 12 * DAY_IN_SECONDS, \\\"trash\\\" );\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"post\",\"create\",\"--post_type=page\",\"--post_status=publish\",\"--post_author=1\",\"--post_name=black-friday-terms\",\"--post_title=Black Friday Terms and Conditions\",\"--post_content=<!-- wp:paragraph --><p>Full terms of the promotion, including eligibility and the refund window.<\\\/p><!-- \\\/wp:paragraph -->\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"eval\",\"$container = Teydea_Studio\\\\Content_Expiry\\\\get_container(); $post = get_page_by_path( \\\"black-friday-terms\\\", OBJECT, \\\"page\\\" ); ( new Teydea_Studio\\\\Content_Expiry\\\\Expiry_Writer( $container ) )->set( $post->ID, time() + 10 * DAY_IN_SECONDS, \\\"private\\\" );\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"post\",\"create\",\"--post_type=post\",\"--post_status=publish\",\"--post_author=1\",\"--post_name=spring-promotion-2026\",\"--post_title=Spring Promotion 2026\",\"--post_content=<!-- wp:paragraph --><p>The spring promotion has finished, so this post was moved to draft automatically.<\\\/p><!-- \\\/wp:paragraph -->\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"eval\",\"$container = Teydea_Studio\\\\Content_Expiry\\\\get_container(); $post = get_page_by_path( \\\"spring-promotion-2026\\\", OBJECT, \\\"post\\\" ); ( new Teydea_Studio\\\\Content_Expiry\\\\Expiry_Writer( $container ) )->set( $post->ID, time() - 3 * DAY_IN_SECONDS, \\\"draft\\\" ); ( new Teydea_Studio\\\\Content_Expiry\\\\Expiry_Manager( $container ) )->execute_expiry( $post->ID ); update_post_meta( $post->ID, \\\"stalepilot__expired_at\\\", time() - 3 * DAY_IN_SECONDS );\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"post\",\"create\",\"--post_type=post\",\"--post_status=publish\",\"--post_author=1\",\"--post_name=terms-of-service-update\",\"--post_title=Legal Notice: Terms of Service Update\",\"--post_content=<!-- wp:paragraph --><p>The review deadline for this notice has passed, so it is no longer published publicly.<\\\/p><!-- \\\/wp:paragraph -->\"]},{\"step\":\"wp-cli\",\"command\":[\"wp\",\"eval\",\"$container = Teydea_Studio\\\\Content_Expiry\\\\get_container(); $post = get_page_by_path( \\\"terms-of-service-update\\\", OBJECT, \\\"post\\\" ); ( new Teydea_Studio\\\\Content_Expiry\\\\Expiry_Writer( $container ) )->set( $post->ID, time() - 8 * DAY_IN_SECONDS, \\\"private\\\" ); ( new Teydea_Studio\\\\Content_Expiry\\\\Expiry_Manager( $container ) )->execute_expiry( $post->ID ); update_post_meta( $post->ID, \\\"stalepilot__expired_at\\\", time() - 8 * DAY_IN_SECONDS );\"]}]}"}},"all_blocks":{"stalepilot\/countdown":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"stalepilot\/countdown","title":"Countdown","category":"widgets","icon":"clock","description":"Display a countdown timer or static date for the content expiry.","textdomain":"stalepilot","usesContext":["postId","postType"],"attributes":{"displayMode":{"type":"string","default":"countdown"},"dateFormat":{"type":"string","default":"F j, Y g:i a"},"prefixText":{"type":"string","default":""},"suffixText":{"type":"string","default":""},"expiredMessage":{"type":"string","default":""},"countdownFormat":{"type":"string","default":"compact"},"warningThresholdValue":{"type":"number","default":2},"warningThresholdUnit":{"type":"string","default":"days"},"warningColor":{"type":"string","default":""},"urgentThresholdValue":{"type":"number","default":12},"urgentThresholdUnit":{"type":"string","default":"hours"},"urgentColor":{"type":"string","default":""}},"supports":{"color":{"text":true,"background":false},"spacing":{"margin":["horizontal","vertical"],"padding":["horizontal","vertical"]},"typography":{"fontSize":true,"lineHeight":true,"__experimentalFontFamily":true,"__experimentalFontWeight":true,"__experimentalFontStyle":true,"__experimentalTextTransform":true,"__experimentalDefaultControls":{"fontSize":true}}},"editorScript":"file:.\/index.js","viewScript":"file:.\/view.js","style":"file:.\/index.css"},"stalepilot\/timed-content":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"stalepilot\/timed-content","title":"Timed Content","category":"widgets","icon":"visibility","description":"Show or hide inner blocks based on a date\/time condition.","textdomain":"stalepilot","usesContext":["postId","postType"],"attributes":{"visibilityMode":{"type":"string","default":"show-until"},"dateTime":{"type":"string","default":""},"relativeEnabled":{"type":"boolean","default":false},"relativeValue":{"type":"number","default":7},"relativeUnit":{"type":"string","default":"days"},"usePostExpiry":{"type":"boolean","default":false}},"example":{"innerBlocks":[{"name":"core\/paragraph","attributes":{"content":"This content will be shown or hidden based on the schedule."}}]},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css"}},"tagged_versions":["1.0.2","1.0.3","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3669562,"resolution":"1","location":"assets","locale":"","width":2048,"height":1500},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3669562,"resolution":"2","location":"assets","locale":"","width":2048,"height":1500},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3669562,"resolution":"3","location":"assets","locale":"","width":2048,"height":1500},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3669562,"resolution":"4","location":"assets","locale":"","width":2048,"height":1500},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3669562,"resolution":"5","location":"assets","locale":"","width":2048,"height":1500},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3669562,"resolution":"6","location":"assets","locale":"","width":2048,"height":1500}},"screenshots":{"1":"Block Editor: set an expiry date and choose what happens when it arrives - move to draft, make private, or move to trash.","2":"Posts list: a sortable Expiry column, plus a dedicated \"Expired\" view showing how many posts have already passed their date.","3":"Settings: choose which post types support expiry and set the default expiry action.","4":"Settings: email notifications on expiry, with optional pre-expiry warnings and recipients by role or individual user.","5":"Dashboard: the \"Expiring Soon\" widget lists content approaching its expiry date within a configurable window.","6":"Front end: the Expiry Countdown block shows a live countdown, with color thresholds as the deadline approaches."}},"plugin_section":[262246],"plugin_tags":[56514,4917,262017,56512,20954],"plugin_category":[],"plugin_contributors":[162490,223836],"plugin_business_model":[],"class_list":["post-299766","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-content-expiry","plugin_tags-content-management","plugin_tags-expiration-date","plugin_tags-post-expiry","plugin_tags-scheduled-content","plugin_contributors-bartoszgadomski","plugin_contributors-teydeastudio","plugin_committers-teydeastudio","plugin_support_reps-bartoszgadomski"],"banners":{"banner":"https:\/\/ps.w.org\/stalepilot\/assets\/banner-772x250.jpg?rev=3669562","banner_2x":"https:\/\/ps.w.org\/stalepilot\/assets\/banner-1544x500.jpg?rev=3669562","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/stalepilot\/assets\/icon.svg?rev=3669562","icon":"https:\/\/ps.w.org\/stalepilot\/assets\/icon.svg?rev=3669562","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/stalepilot\/assets\/screenshot-1.png?rev=3669562","caption":"Block Editor: set an expiry date and choose what happens when it arrives - move to draft, make private, or move to trash."},{"src":"https:\/\/ps.w.org\/stalepilot\/assets\/screenshot-2.png?rev=3669562","caption":"Posts list: a sortable Expiry column, plus a dedicated \"Expired\" view showing how many posts have already passed their date."},{"src":"https:\/\/ps.w.org\/stalepilot\/assets\/screenshot-3.png?rev=3669562","caption":"Settings: choose which post types support expiry and set the default expiry action."},{"src":"https:\/\/ps.w.org\/stalepilot\/assets\/screenshot-4.png?rev=3669562","caption":"Settings: email notifications on expiry, with optional pre-expiry warnings and recipients by role or individual user."},{"src":"https:\/\/ps.w.org\/stalepilot\/assets\/screenshot-5.png?rev=3669562","caption":"Dashboard: the \"Expiring Soon\" widget lists content approaching its expiry date within a configurable window."},{"src":"https:\/\/ps.w.org\/stalepilot\/assets\/screenshot-6.png?rev=3669562","caption":"Front end: the Expiry Countdown block shows a live countdown, with color thresholds as the deadline approaches."}],"raw_content":"<!--section=description-->\n<p><strong>Teydea Content Expiry lets you set an expiry date on any post type and automatically take action when that date arrives.<\/strong><\/p>\n\n<p>Whether you manage time-sensitive promotions, seasonal content, legal notices with review deadlines, or news articles that lose relevance, Teydea Content Expiry gives you the tools to handle content lifecycle directly within WordPress.<\/p>\n\n<p><strong>Key benefits:<\/strong><\/p>\n\n<ul>\n<li>Automatically move expired content to draft, private, or trash - no manual cleanup needed.<\/li>\n<li>Get notified by email before and after content expires, so nothing slips through the cracks.<\/li>\n<li>Show visitors countdown timers and timed content blocks that respond to expiry dates.<\/li>\n<li>Manage expiring content at scale with bulk edit, quick edit, and a dashboard widget.<\/li>\n<\/ul>\n\n<p>Teydea Content Expiry works with posts, pages, and custom post types. It integrates with both the Block Editor (Gutenberg) and the Classic Editor.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>Expiry Date and Action<\/strong> - Set an expiry date and time on any supported post type, and choose what happens: Move to Draft, Make Private, or Move to Trash.<\/li>\n<li><strong>Block Editor Integration<\/strong> - Sidebar panel in Gutenberg for configuring expiry date, time, and action.<\/li>\n<li><strong>Classic Editor Integration<\/strong> - Metabox in the sidebar for configuring expiry on sites using the Classic Editor.<\/li>\n<li><strong>Posts List Column<\/strong> - Sortable expiry column in admin list tables showing scheduled or past expiry dates.<\/li>\n<li><strong>Expired Posts Filter<\/strong> - Dedicated \"Expired\" view in the posts list with a count of expired posts.<\/li>\n<li><strong>Quick Edit and Bulk Edit<\/strong> - Edit expiry settings inline or for multiple posts at once.<\/li>\n<li><strong>Dashboard Widget<\/strong> - \"Expiring Soon\" widget showing posts approaching their expiry date within a configurable time window.<\/li>\n<li><strong>Email Notifications<\/strong> - Get notified when content expires, with optional pre-expiry warnings (1, 3, or 7 days before).<\/li>\n<li><strong>Configurable Recipients<\/strong> - Send notifications to specific user roles or individual users.<\/li>\n<li><strong>Expiry Countdown Block<\/strong> - Display a live countdown timer or static date on the front end, with customizable colors and thresholds. Also available as a <code>[stalepilot_countdown]<\/code> shortcode.<\/li>\n<li><strong>Timed Content Block<\/strong> - Show or hide content based on a date, relative time from publish, or the post's expiry date. Also available as a <code>[stalepilot_timed_content]<\/code> shortcode.<\/li>\n<li><strong>Automatic Scheduling<\/strong> - Expiry is automatically canceled on trash\/delete and rescheduled on restore.<\/li>\n<li><strong>Developer Hooks<\/strong> - Extensible via actions and filters for custom integrations.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>stalepilot<\/code> directory to <code>\/wp-content\/plugins\/<\/code>, or install it directly through the WordPress plugin screen.<\/li>\n<li>Activate the plugin through the \"Plugins\" screen in WordPress.<\/li>\n<li>Go to <strong>Settings &gt; Content Expiry<\/strong> to choose which post types support expiry and configure default actions and notifications.<\/li>\n<li>Edit any post or page and use the \"Content Expiry\" panel in the sidebar to set an expiry date and action.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20post%20types%20are%20supported%3F\"><h3>Which post types are supported?<\/h3><\/dt>\n<dd><p>By default, Teydea Content Expiry is enabled for posts and pages. You can enable it for any public custom post type in the plugin settings under <strong>Settings &gt; Content Expiry<\/strong>.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20a%20post%20expires%3F\"><h3>What happens when a post expires?<\/h3><\/dt>\n<dd><p>The plugin performs the action you selected for that post: it moves the post to draft, makes it private, or moves it to trash. You can set a default action in the settings and override it per post.<\/p><\/dd>\n<dt id=\"can%20i%20display%20a%20countdown%20timer%20on%20the%20front%20end%3F\"><h3>Can I display a countdown timer on the front end?<\/h3><\/dt>\n<dd><p>Yes. The plugin includes an Expiry Countdown block (and a <code>[stalepilot_countdown]<\/code> shortcode) that displays either a live countdown timer or a static formatted date. You can customize colors, threshold warnings, and the expired message.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20restore%20a%20trashed%20post%20that%20had%20an%20expiry%20date%3F\"><h3>What happens if I restore a trashed post that had an expiry date?<\/h3><\/dt>\n<dd><p>If the expiry date is still in the future, the plugin automatically reschedules the expiry. If the expiry date has already passed, the stale expiry metadata is cleaned up.<\/p><\/dd>\n<dt id=\"where%20can%20i%20find%20the%20unminified%20source%20code%3F\"><h3>Where can I find the unminified source code?<\/h3><\/dt>\n<dd><p>All source ships with the plugin: the plugin's own JavaScript is in <code>src\/<\/code>, and the bundled <code>@teydeastudio\/components<\/code> and <code>@teydeastudio\/utils<\/code> libraries are in <code>deps\/js\/components\/src\/<\/code> and <code>deps\/js\/utils\/src\/<\/code>. To rebuild, install Node.js 20 and run <code>npm install &amp;&amp; npm run build<\/code> in the plugin directory.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0 (2026-08-28)<\/h4>\n\n<ul>\n<li>Plugin renamed to \"Teydea Content Expiry\", with a new icon and updated links<\/li>\n<li>Compatibility with WordPress 7.1 confirmed<\/li>\n<li>Fixed help text not being announced as the description of the field it belongs to on the settings and editor screens<\/li>\n<li>Fixed a successful settings save reporting itself as failed on WordPress 6.6<\/li>\n<li>Plugin banners and screenshots added to the WordPress.org listing<\/li>\n<li>Dependencies updated<\/li>\n<li>Code improvements<\/li>\n<\/ul>\n\n<h4>1.0.3 (2026-06-22)<\/h4>\n\n<ul>\n<li>Added the plugin icon<\/li>\n<li>Settings page tabs are now reflected in the URL, so a tab can be bookmarked and shared<\/li>\n<li>Added a clear admin notice for unmet server requirements (minimum PHP\/WordPress version, required extensions)<\/li>\n<li>Dependencies updated<\/li>\n<li>Code improvements<\/li>\n<\/ul>\n\n<h4>1.0.2 (2026-04-27)<\/h4>\n\n<ul>\n<li>An FAQ entry added to readme.txt, explaining where the unminified source code lives in the plugin and how to rebuild it from source<\/li>\n<\/ul>\n\n<h4>1.0.1 (2026-04-24)<\/h4>\n\n<ul>\n<li>The \"Pre-expiry warning\" and \"Dashboard widget window\" settings now accept any number of days within a reasonable range, with quick-set presets for common values<\/li>\n<li>Direct loading of wp-includes\/version.php in the WordPress version detection fallback removed<\/li>\n<\/ul>\n\n<h4>1.0.0 (2026-04-07)<\/h4>\n\n<ul>\n<li>The first stable release<\/li>\n<\/ul>","raw_excerpt":"Set expiry dates on posts and pages to automatically change status, notify editors, and display countdowns.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/299766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=299766"}],"author":[{"embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/teydeastudio"}],"wp:attachment":[{"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=299766"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=299766"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=299766"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=299766"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=299766"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/gl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=299766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}