Where do I find the plugin?
After activation, look for Content Expiry as a top-level item in the WordPress admin sidebar (clock icon). It contains two screens:
- Settings — defaults, post-type opt-in, capability gate, dashboard widget toggle, log retention, and the Audit Log tab.
- Scheduled Actions — a focused queue view showing only this plugin’s expiry jobs, with per-row Run Now / Cancel controls.
Who can manage expiry rules?
The Minimum Capability setting in Content Expiry > Settings decides who can see the meta box, Quick Edit and Bulk Edit fields and the Expiry column, and who can save, extend or run rules:
- Contributor and above ( edit_posts , the default)
- Author and above ( publish_posts )
- Administrator only ( manage_options )
Users also need permission to edit the specific post. Developers can override the capability with the smcexp_manage_capability filter.
What does “Hide from Visitors” do?
When the rule runs, the post stays published but visitors who cannot manage expiry rules get a 404 for it. It is also left out of front-end lists and search, the public REST API, oEmbed and sitemaps. Users who can manage expiry rules can still view it.
Does this work with custom post types?
Yes. Any public custom post type can be enabled in Content Expiry > Settings . Once enabled, the meta box, list-table column, Quick Edit, Bulk Edit, and front-end actions all work on that post type.
Developers can add private CPTs to the settings checkbox list via the smcexp_supported_post_types_choices filter, and override the runtime list via smcexp_supported_post_types .
Does this work with WooCommerce products?
Yes. Enable Products in Content Expiry > Settings and the Content Expiry meta box will appear in the WooCommerce product editor alongside the standard product fields. Quick Edit and Bulk Edit on the products list table work too.
How do I see what’s scheduled to expire?
Open Content Expiry > Scheduled Actions . The page lists every queued expiry job with the post title, action type (Move to Draft / Redirect / Swap / Hide), the time it fires (relative + absolute, in your WP timezone), and a colour-coded status pill. Pending jobs have Run now and Cancel buttons. Filter by Upcoming / Completed / Failed / Cancelled / All.
What happens if I deactivate the plugin?
Deactivating stops all expiry actions: redirects, hidden posts and swapped content go back to normal, and queued expiry jobs are cancelled. Your rules are kept. When you reactivate, every pending rule is queued again, and rules whose date has already passed run on the next queue run.
Does this work with caching plugins?
Yes, but full-page caching plugins may serve stale content briefly after an expiry action runs. The plugin fires a smcexp_cache_purge action that caching plugins can hook into.
Can I undo an expiry action?
Draft: re-publish the post. Redirect: clear the expiry rule. Swap Content: original content is never overwritten — clear the rule to restore it. Hide: clear the rule and the post becomes visible again immediately.
Does this require WooCommerce?
No. Action Scheduler is bundled directly with the plugin.
Is there a REST API or WP-CLI?
Yes. REST routes (namespace smcexp/v1 ):
- GET /wp-json/smcexp/v1/upcoming lists pending rules you can edit, soonest first. Parameters: post_type , limit (1-100, default 25), offset . Requires the Minimum Capability.
- GET /wp-json/smcexp/v1/log returns the audit log, newest first. Parameters: post_id , status , limit (1-100, default 25), offset . Requires manage_options .
- POST /wp-json/smcexp/v1/expire/<id> runs a pending rule now. Requires the Minimum Capability and permission to edit the post.
- POST /wp-json/smcexp/v1/extend/<id> with days (1-3650) moves a pending rule’s date later. Same permissions as expire .
WP-CLI commands:
- wp smcexp list [--status=<pending|expired|cancelled|failed|all>] [--post_type=<type>] [--before=<date>] [--after=<date>] [--format=<table|json|csv|yaml|count|ids>]
- wp smcexp expire <post_id> [--force] [--dry-run] runs a pending rule now. --force re-runs a rule that already ran, failed or was cancelled. Trashed posts are never touched.
- wp smcexp extend <post_id> --days=<days> moves a pending rule’s date later by 1-3650 days.
- wp smcexp log [--post_id=<id>] [--status=<status>] [--limit=<n>] [--format=<format>]
Run wp help smcexp <command> for details.