{"id":321415,"date":"2026-06-03T18:04:18","date_gmt":"2026-06-03T18:04:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/creotec-content-expiration-manager\/"},"modified":"2026-06-03T18:03:57","modified_gmt":"2026-06-03T18:03:57","slug":"creotec-content-expiration-manager","status":"publish","type":"plugin","link":"https:\/\/kaa.wordpress.org\/plugins\/creotec-content-expiration-manager\/","author":15270099,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Creotec Content Expiration Manager","header_author":"Creotec Limited - Michael Gbadebo","header_description":"Adds expiration dates and lifecycle actions (draft, private, redirect, replace, banner, trash) to posts, pages, and public custom post types.","assets_banners_color":"b3d2e7","last_updated":"2026-06-03 18:03:57","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/sowandnurture.com\/","header_plugin_uri":"","header_author_uri":"https:\/\/creotec.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":38,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"nativebreed","date":"2026-06-03 18:03:57"}},"upgrade_notice":{"1.0.0":"<p>Initial public release<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3559847,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3559847,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3559857,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3559847,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3559847,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Expiration meta box in the editor.","2":"Expiration admin overview (Expiring Soon).","3":"Expiration admin overview (Already Expired).","4":"Post type settings under Settings &gt; Post Expiration."}},"plugin_section":[],"plugin_tags":[1946,19855,727,20954,74927],"plugin_category":[],"plugin_contributors":[],"plugin_business_model":[],"class_list":["post-321415","plugin","type-plugin","status-publish","hentry","plugin_tags-expiration","plugin_tags-expire-posts","plugin_tags-redirect","plugin_tags-scheduled-content","plugin_tags-unpublish","plugin_committers-nativebreed"],"banners":{"banner":"https:\/\/ps.w.org\/creotec-content-expiration-manager\/assets\/banner-772x250.jpg?rev=3559847","banner_2x":"https:\/\/ps.w.org\/creotec-content-expiration-manager\/assets\/banner-1544x500.jpg?rev=3559847","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/creotec-content-expiration-manager\/assets\/icon.svg?rev=3559857","icon":"https:\/\/ps.w.org\/creotec-content-expiration-manager\/assets\/icon.svg?rev=3559857","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Creotec Content Expiration Manager adds simple content lifecycle management to WordPress:<\/p>\n\n<ul>\n<li>Add an expiration date\/time to posts, pages, and public custom post types.<\/li>\n<li>Choose what happens when content expires:\n\n<ul>\n<li>Change status to Draft<\/li>\n<li>Make Private\/Password Protect (unpublish)<\/li>\n<li>Redirect to another URL (301 or 302)<\/li>\n<li>Replace content with a custom \"expired\" message<\/li>\n<li>Display an \"Expired\" banner at the top of the post<\/li>\n<li>Move content to the bin\/trash<\/li>\n<\/ul><\/li>\n<li>Optional pre-expiration reminder email to the site admin address.<\/li>\n<li>Reliable processing:\n\n<ul>\n<li>Runs on WP-Cron every 10 minutes<\/li>\n<li>Includes a lightweight fallback check on normal WordPress requests (throttled)<\/li>\n<\/ul><\/li>\n<li>Admin overview page:\n\n<ul>\n<li>Expiring Soon (next 30 days)<\/li>\n<li>Already Expired<\/li>\n<li>Bulk actions (extend date, disable expiration)<\/li>\n<\/ul><\/li>\n<li>Reusable templates for redirect, banner, and replacement-content actions.<\/li>\n<li>Per-post-type enabling\/disabling under Settings &gt; Post Expiration.<\/li>\n<li>List-table indicator icons show which posts have expiration enabled.<\/li>\n<\/ul>\n\n<p>No external services, no analytics, no licensing system.<\/p>\n\n<h3>Usage<\/h3>\n\n<ol>\n<li>Edit any supported post type.<\/li>\n<li>In the \"Expiration\" box:\n\n<ul>\n<li>Check \"Enable expiration\".<\/li>\n<li>Set an \"Expiration date &amp; time\" (site timezone).<\/li>\n<li>Optionally choose a reminder email (1\/3\/7 days before).<\/li>\n<li>Choose what happens when it expires.<\/li>\n<\/ul><\/li>\n<li>Update\/publish the post.<\/li>\n<\/ol>\n\n<p>To manage expirations site-wide:\n* Go to WP Admin &gt; Expirations\n  * Use tabs:\n    * Expiring Soon (next 30 days)\n    * Already Expired\n  * Use bulk actions:\n    * Extend by 7 days\n    * Extend by 30 days\n    * Disable expiration<\/p>\n\n<p>To choose which post types support expiration:\n* Go to Settings &gt; Expirations.<\/p>\n\n<p>To create reusable expiration templates:\n* Go to Settings &gt; Expirations.\n* Create templates for redirects, banners, or replacement content.\n* When editing a post, choose a template in the relevant expiration action. Template edits are reflected anywhere that template is selected.<\/p>\n\n<h3>Restore original content (Replace action)<\/h3>\n\n<p>When the action is \"Replace content with a message\", the plugin saves the original content when the expiration is processed.\nAfter that, a \"Restore original content\" button appears in the Expiration meta box, allowing you to restore the saved content and disable expiration for that item.<\/p>\n\n<h3>Expiration processing &amp; reliability<\/h3>\n\n<p>This plugin does not rely solely on WP-Cron.<\/p>\n\n<ul>\n<li>Primary: WP-Cron runs every 10 minutes to process reminders and expirations.<\/li>\n<li>Fallback: A lightweight check runs on WordPress requests (throttled via transient) to ensure expirations still trigger even if cron is delayed.<\/li>\n<\/ul>\n\n<p>Notes about caching:\n* Some full-page caches may serve pages without executing PHP. In those cases, expirations will still process when WordPress runs (admin requests, REST requests, cron, etc.).\n* On expiration, the plugin triggers an action hook so caching plugins\/site code can purge caches:\n      do_action( 'creocem_post_expired', $post_id, $action );<\/p>\n\n<h3>Hooks<\/h3>\n\n<ul>\n<li><code>creocem_post_expired<\/code> - Fires after a post is processed as expired.\n\n<ul>\n<li>Parameters: (int) $post_id, (string) $action<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h3>License<\/h3>\n\n<p>This plugin is free software: you can redistribute it and\/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 2 of the License, or\n(at your option) any later version.<\/p>\n\n<p>This plugin is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.<\/p>\n\n<h3>Credits<\/h3>\n\n<p>Developed and maintained by <a href=\"https:\/\/www.creotec.com\/\">Michael Gbadebo @ Creotec Limited<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>creotec-content-expiration-manager<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install via the WordPress Plugins screen.<\/li>\n<li>Activate the plugin through the \"Plugins\" screen in WordPress.<\/li>\n<li>Edit a post\/page (or enabled custom post type), open the \"Expiration\" box in the sidebar, and configure the expiration.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20with%20custom%20post%20types%3F\"><h3>Does it work with custom post types?<\/h3><\/dt>\n<dd><p>Yes. It supports all public post types. You can enable\/disable per post type under Settings &gt; Post Expiration.<\/p><\/dd>\n<dt id=\"does%20it%20require%20wp-cron%3F\"><h3>Does it require WP-Cron?<\/h3><\/dt>\n<dd><p>It uses WP-Cron, but also includes a fallback check on normal requests (throttled) so expiration still triggers if cron is late.<\/p><\/dd>\n<dt id=\"what%20happens%20for%20redirects%3F\"><h3>What happens for redirects?<\/h3><\/dt>\n<dd><p>The post remains accessible in WordPress, but visitors are redirected on the frontend when the content is expired. Choose 301 or 302.<\/p><\/dd>\n<dt id=\"can%20i%20reuse%20redirect%2C%20banner%2C%20or%20replacement%20content%3F\"><h3>Can I reuse redirect, banner, or replacement content?<\/h3><\/dt>\n<dd><p>Yes. Create templates under Settings &gt; Expirations, then select a template from the post Expiration box. Templates in use cannot be deleted.<\/p><\/dd>\n<dt id=\"does%20%22replace%20content%22%20permanently%20overwrite%20my%20content%3F\"><h3>Does \"Replace content\" permanently overwrite my content?<\/h3><\/dt>\n<dd><p>No. The plugin filters the frontend output for expired content to show the \"expired\" message. It also stores the original content snapshot on first processing so you can restore it.<\/p><\/dd>\n<dt id=\"can%20i%20restore%20the%20original%20content%20after%20%22replace%22%3F\"><h3>Can I restore the original content after \"Replace\"?<\/h3><\/dt>\n<dd><p>Yes. Once the post has been processed as expired with the Replace action, the Expiration box shows a \"Restore original content\" button.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<\/ul>","raw_excerpt":"Add expiration dates and lifecycle actions to posts, pages, and public custom post types.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/321415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=321415"}],"author":[{"embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/nativebreed"}],"wp:attachment":[{"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=321415"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=321415"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=321415"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=321415"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=321415"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kaa.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=321415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}