{"id":319465,"date":"2026-05-29T14:09:18","date_gmt":"2026-05-29T14:09:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/content-expiry-md\/"},"modified":"2026-05-29T17:36:13","modified_gmt":"2026-05-29T17:36:13","slug":"monkeydesign-content-expiry","status":"publish","type":"plugin","link":"https:\/\/en-au.wordpress.org\/plugins\/monkeydesign-content-expiry\/","author":23502824,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"MonkeyDesign Content Expiry","header_author":"MonkeyDesign","header_description":"Automatically expire posts, pages, and custom post types on a set date. Lightweight, secure, and PRO-ready.","assets_banners_color":"6460bc","last_updated":"2026-05-29 17:36:13","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/monkeydesign.hu\/en\/products\/content-expiry","header_author_uri":"https:\/\/monkeydesign.hu","rating":0,"author_block_rating":0,"active_installs":0,"downloads":28,"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":"monkeydesign2026","date":"2026-05-29 14:08:53"},"1.1.0":{"tag":"1.1.0","author":"monkeydesign2026","date":"2026-05-29 17:36:13"}},"upgrade_notice":{"1.0.0":"<p>Initial release \u2014 no upgrade needed.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3553647,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3553647,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3553647,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3553647,"resolution":"772x250","location":"assets","locale":"","width":771,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3553647,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3553647,"resolution":"2","location":"assets","locale":"","width":1280,"height":800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3553647,"resolution":"3","location":"assets","locale":"","width":1280,"height":800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3553647,"resolution":"4","location":"assets","locale":"","width":1280,"height":800}},"screenshots":{"1":"The Post Expiration meta box in the block editor sidebar \u2014 set expiration date, time, and action per post.","2":"The Posts list with the Expires column showing scheduled expiration date and action.","3":"The Expires column highlighted in red for posts expiring within 24 hours.","4":"The Settings page \u2014 configure supported post types, default action, and system status."}},"plugin_section":[],"plugin_tags":[242796,264955,242017,9502,19853],"plugin_category":[],"plugin_contributors":[264956],"plugin_business_model":[],"class_list":["post-319465","plugin","type-plugin","status-publish","hentry","plugin_tags-auto-draft","plugin_tags-auto-trash","plugin_tags-content-scheduling","plugin_tags-expiry","plugin_tags-post-expiration","plugin_contributors-monkeydesign2026","plugin_committers-monkeydesign2026"],"banners":{"banner":"https:\/\/ps.w.org\/monkeydesign-content-expiry\/assets\/banner-772x250.png?rev=3553647","banner_2x":"https:\/\/ps.w.org\/monkeydesign-content-expiry\/assets\/banner-1544x500.png?rev=3553647","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/monkeydesign-content-expiry\/assets\/icon-128x128.png?rev=3553647","icon_2x":"https:\/\/ps.w.org\/monkeydesign-content-expiry\/assets\/icon-256x256.png?rev=3553647","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/monkeydesign-content-expiry\/assets\/screenshot-1.png?rev=3553647","caption":"The Post Expiration meta box in the block editor sidebar \u2014 set expiration date, time, and action per post."},{"src":"https:\/\/ps.w.org\/monkeydesign-content-expiry\/assets\/screenshot-2.png?rev=3553647","caption":"The Posts list with the Expires column showing scheduled expiration date and action."},{"src":"https:\/\/ps.w.org\/monkeydesign-content-expiry\/assets\/screenshot-3.png?rev=3553647","caption":"The Expires column highlighted in red for posts expiring within 24 hours."},{"src":"https:\/\/ps.w.org\/monkeydesign-content-expiry\/assets\/screenshot-4.png?rev=3553647","caption":"The Settings page \u2014 configure supported post types, default action, and system status."}],"raw_content":"<!--section=description-->\n<p><strong>Content Expiry<\/strong> lets you set an expiration date on any post, page, or custom post type. When the date arrives, the plugin automatically changes the content's status \u2014 no manual monitoring required.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li>Set expiration date and time on any post or page (date\/time picker included)<\/li>\n<li>Three built-in expiry actions: <strong>change to Draft<\/strong>, <strong>move to Trash<\/strong>, or <strong>make Private<\/strong><\/li>\n<li>Works with any custom post type<\/li>\n<li>Configurable default action per site<\/li>\n<li>Admin list column shows expiration date at a glance<\/li>\n<li>Lightweight \u2014 no bloat, no external requests, no tracking<\/li>\n<li>WP-Cron based scheduling \u2014 reliable, no server cron required<\/li>\n<\/ul>\n\n<h4>PRO features (coming soon)<\/h4>\n\n<ul>\n<li><strong>Email notifications<\/strong> \u2014 get notified X days before expiry (admin, author, or custom email)<\/li>\n<li><strong>Redirect action<\/strong> \u2014 301 redirect expired content to any URL (SEO-friendly)<\/li>\n<li><strong>Content replacement<\/strong> \u2014 keep the post published but swap the content with a \"this offer has expired\" message<\/li>\n<li><strong>Expiry dashboard<\/strong> \u2014 see what expires in the next 7 \/ 30 days, filterable by post type<\/li>\n<li><strong>Bulk expiry management<\/strong> \u2014 set expiration on multiple posts at once from the list screen<\/li>\n<li><strong>Recurring expiry<\/strong> \u2014 auto-reschedule expiry after it triggers (great for seasonal content)<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>content-expiry-md<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress<\/li>\n<li>Go to <strong>Content Expiry<\/strong> in the WordPress admin menu to configure supported post types and the default action<\/li>\n<li>Edit any post or page and look for the <strong>Post Expiration<\/strong> meta box in the sidebar<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20custom%20post%20types%3F\"><h3>Does this work with custom post types?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>Settings \u2192 Content Expiry<\/strong> and check the post types you want to enable expiry for.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20a%20post%20expires%3F\"><h3>What happens when a post expires?<\/h3><\/dt>\n<dd><p>Depending on the action you chose, the post is either changed to Draft, moved to Trash, or made Private. The change happens automatically in the background via WP-Cron.<\/p><\/dd>\n<dt id=\"will%20this%20slow%20down%20my%20site%3F\"><h3>Will this slow down my site?<\/h3><\/dt>\n<dd><p>No. The plugin uses WP-Cron and runs only when WordPress is already handling a request. There are no external API calls and no frontend JavaScript.<\/p><\/dd>\n<dt id=\"what%20if%20wp-cron%20is%20disabled%20on%20my%20server%3F\"><h3>What if WP-Cron is disabled on my server?<\/h3><\/dt>\n<dd><p>You can use a real server cron to trigger <code>wp-cron.php<\/code>. See the WordPress documentation on <a href=\"https:\/\/developer.wordpress.org\/plugins\/cron\/hooking-wp-cron-into-the-system-task-scheduler\/\">alternative cron setups<\/a>.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20compatible%20with%20the%20block%20editor%20%28gutenberg%29%3F\"><h3>Is the plugin compatible with the block editor (Gutenberg)?<\/h3><\/dt>\n<dd><p>Yes. The expiry settings appear in the sidebar meta box, which works in both the classic and block editors.<\/p><\/dd>\n<dt id=\"can%20i%20schedule%20the%20same%20post%20to%20expire%20multiple%20times%3F\"><h3>Can I schedule the same post to expire multiple times?<\/h3><\/dt>\n<dd><p>Not in the free version \u2014 once a post expires and the action triggers, the expiration date is cleared. Recurring expiry is a PRO feature.<\/p><\/dd>\n<dt id=\"where%20is%20my%20data%20stored%3F\"><h3>Where is my data stored?<\/h3><\/dt>\n<dd><p>The expiration date and action are stored as post meta (<code>_mdce_expiration_date<\/code> and <code>_mdce_expiration_action<\/code>). Plugin settings are stored in <code>wp_options<\/code> under <code>mdce_settings<\/code>. Nothing is sent off-site.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added Freemius SDK integration for upgrade flow, license management, and account page.<\/li>\n<li>Added PRO upgrade prompt in the admin menu.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Date\/time picker (Flatpickr) for expiration scheduling.<\/li>\n<li>Three built-in actions: Draft, Trash, Private.<\/li>\n<li>Admin list column with expiration date.<\/li>\n<li>Settings page: supported post types, default action.<\/li>\n<li>WP-Cron based scheduling.<\/li>\n<li>Nonce validation, capability checks, input sanitization, and output escaping throughout.<\/li>\n<\/ul>","raw_excerpt":"Automatically expire posts, pages, and custom post types on a set date. Lightweight and secure.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/319465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=319465"}],"author":[{"embeddable":true,"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/monkeydesign2026"}],"wp:attachment":[{"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=319465"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=319465"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=319465"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=319465"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=319465"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-au.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=319465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}