30+
August 18, 2026
February 25, 2026
Scheduled Posts Showcase lets you display your scheduled (future) posts on the frontend of your WordPress site without creating problematic links to unpublished content.
Unlike other solutions that link to scheduled posts and generate 404 errors for visitors, this plugin shows post information (title, date, excerpt, featured image, categories) without ever exposing the permalink or post ID.
Choose exactly which scheduled posts get listed:
Every filter starts on “any”, so nothing is filtered until you untick one and pick what you want. Filters can be set globally in the settings page and overridden on each widget, block and shortcode.
Choose who can see your scheduled posts:
Shortcode:
[scheduled-posts-showcase]
Without parameters it uses everything configured in Appearance Scheduled Posts. With parameters:
[scheduled-posts-showcase count="3" show_date="1" show_excerpt="1" container_style="card"]
Filtering by content:
[scheduled-posts-showcase post_type="post,event" categories="news,tutorials" authors="fernando" tax_mode="include"]
post_type – one slug, a comma-separated list, or all for every public post typecategories and tags – term IDs or slugs, comma-separated, or all to skip that filtertax_<taxonomy> – any other taxonomy, for example tax_genre="fiction,essay"authors – user IDs or nicenames, comma-separated, or all to skip that filtertax_mode – include (default) or excludeAttributes you do not write inherit the global settings, so [scheduled-posts-showcase categories="news"] keeps everything else as configured.
Widget:
Add the “Scheduled Posts Showcase” widget to any widget area from Appearance Widgets.
Gutenberg Block:
Search for “Scheduled Posts” in the block inserter and add the block to any post or page.
REST API:
GET /wp-json/scheduled-posts-showcase/v1/scheduled-posts
Parameters: per_page, fields, post_type (comma-separated or all), order, categories, tags, taxonomy, terms, authors, tax_mode. Term and author parameters also accept all to skip that filter.
GET /wp-json/scheduled-posts-showcase/v1/scheduled-posts?post_type=post,event&categories=news&authors=12
Existing plugins for displaying scheduled posts either:
Scheduled Posts Showcase solves all these problems with a modern, secure, and fully-featured solution.
The plugin provides semantic CSS classes for easy customization.
.sps-scheduled-posts – Main container.sps-style-card – Card style container.sps-style-minimal – Minimal style container.sps-scheduled-heading – Heading element.sps-scheduled-list – Posts list (ul).sps-list-dashicon – List with dashicon bullets.sps-list-theme – List with theme default bullets.sps-list-none – List with no bullets.sps-scheduled-item – Each post item (li).sps-scheduled-icon – Dashicon bullet.sps-scheduled-thumbnail – Featured image container.sps-scheduled-thumbnail--full-width – Added to the thumbnail container when the “Full width” image size is selected.sps-scheduled-title – Post title.sps-scheduled-date – Scheduled date.sps-scheduled-excerpt – Post excerpt.sps-scheduled-categories – Categories list.sps-scheduled-footer – Custom footer content.sps-no-scheduled – Empty state message/* Change font size for post titles */
.sps-scheduled-title {
font-size: 1.1em;
}
/* Add more padding to the card container */
.sps-style-card {
padding: 1.5em;
}
/* Custom color for the date */
.sps-scheduled-date {
color: #666;
font-style: italic;
}
You can target a specific widget, block or shortcode without writing a long selector by adding your own classes:
Per instance: each widget, block and shortcode has its own “Extra CSS class” field. These are appended to the global ones, never replace them.
/* Style a specific instance */
.sps-scheduled-posts.sidebar-cta {
background: #fffbe6;
padding: 1.5em;
}
The accent color is available as a CSS custom property:
/* Use the accent color in your custom styles */
.my-custom-element {
border-color: var(--sps-accent-color);
}<h3>Developer Hooks</h3>
The plugin provides filters and actions for developers to customize behavior without modifying plugin code.
spscase_query_args
Modify WP_Query arguments before fetching scheduled posts.
add_filter( 'spscase_query_args', function( $args ) {
// Only show posts from specific category
$args['cat'] = 5;
return $args;
} );
spscase_post_data
Modify the data array for each post before rendering.
add_filter( 'spscase_post_data', function( $post_data, $post ) {
// Add custom field to post data
$post_data['reading_time'] = get_post_meta( $post->ID, 'reading_time', true );
return $post_data;
}, 10, 2 );
spscase_post_html
Modify the HTML output for each individual post item.
add_filter( 'spscase_post_html', function( $html, $post_data ) {
// Add reading time after the title
if ( ! empty( $post_data['reading_time'] ) ) {
$badge = '<span class="reading-time">' . esc_html( $post_data['reading_time'] ) . ' min read</span>';
$html = str_replace( '</span class="sps-scheduled-title">', '</span>' . $badge, $html );
}
return $html;
}, 10, 2 );
spscase_output_html
Modify the complete rendered HTML output.
add_filter( 'spscase_output_html', function( $html, $posts, $settings ) {
// Wrap output in custom container
return '<div class="my-custom-wrapper">' . $html . '</div>';
}, 10, 3 );
spscase_rest_post_data
Modify post data in REST API responses.
add_filter( 'spscase_rest_post_data', function( $post_data, $post ) {
// Add author name to API response
$post_data['author'] = get_the_author_meta( 'display_name', $post->post_author );
return $post_data;
}, 10, 2 );
spscase_excerpt_length
Override the excerpt word count.
add_filter( 'spscase_excerpt_length', function( $length ) {
// Shorter excerpts for sidebar widgets
return 15;
} );
spscase_date_format
Override the date format (default: WordPress date_format option). The special value relative renders the distance to the publication date (“in 3 days”) and keeps the absolute date in the title attribute of the <time> element.
add_filter( 'spscase_date_format', function( $format ) {
// Show relative dates like "in 3 days"
return 'relative';
} );
spscase_post_types
Filter the available post types everywhere: settings page, widget, block, shortcode and REST API.
add_filter( 'spscase_post_types', function( $post_types ) {
// Remove 'page' from available post types
unset( $post_types['page'] );
return $post_types;
} );
spscase_filter_taxonomies
Filter which taxonomies are offered as content filters for a set of post types.
add_filter( 'spscase_filter_taxonomies', function( $taxonomies, $post_types ) {
// Do not offer tags as a filter
unset( $taxonomies['post_tag'] );
return $taxonomies;
}, 10, 2 );
spscase_term_taxonomies
Filter which taxonomies provide the terms displayed under each post.
add_filter( 'spscase_term_taxonomies', function( $taxonomies, $post ) {
// Show tags instead of categories
return array( 'post_tag' );
}, 10, 2 );
spscase_terms_limit
Maximum number of terms listed per taxonomy in the admin selectors (default: 200). Does not limit the query itself.
add_filter( 'spscase_terms_limit', function( $limit, $taxonomy ) {
return 'category' === $taxonomy ? 500 : $limit;
}, 10, 2 );
spscase_authors_limit
Maximum number of authors listed in the admin selectors (default: 200).
add_filter( 'spscase_authors_limit', function( $limit ) {
return 50;
} );
spscase_author_options
Filter the authors offered as a content filter.
add_filter( 'spscase_author_options', function( $authors ) {
// Only keep a given set of columnists
return array_intersect_key( $authors, array_flip( array( 3, 7, 12 ) ) );
} );
spscase_cache_expiration
Modify cache duration in seconds (default: 3600 = 1 hour).
add_filter( 'spscase_cache_expiration', function( $seconds ) {
// Cache for 6 hours on high-traffic sites
return 6 * HOUR_IN_SECONDS;
} );
spscase_allowed_footer_html
Modify allowed HTML tags for footer content.
add_filter( 'spscase_allowed_footer_html', function( $allowed_tags ) {
// Allow button element in footer
$allowed_tags['button'] = array(
'class' => true,
'type' => true,
);
return $allowed_tags;
} );
spscase_before_output
Fires before the scheduled posts list renders.
add_action( 'spscase_before_output', function( $posts, $settings ) {
// Track impressions
if ( function_exists( 'my_track_impression' ) ) {
my_track_impression( 'scheduled_posts_widget' );
}
}, 10, 2 );
spscase_after_output
Fires after the scheduled posts list renders.
add_action( 'spscase_after_output', function( $posts, $settings ) {
// Output additional content after the list
echo '<p class="sps-custom-note">Updated hourly</p>';
}, 10, 2 );<h3>Support</h3>
Need private support or custom development?
Do you need one-on-one help, priority troubleshooting, or a custom feature, integration, or tweak built specifically for your site? I offer private support and custom development. Just contact me and tell me what you need.
Need help or have suggestions?
Love the plugin? Please leave us a 5-star review and help spread the word!
We are specialists in WordPress security, SEO, AI and performance optimization plugins. We create tools that solve real problems for WordPress site owners while maintaining the highest coding standards and accessibility requirements.
/wp-content/plugins/scheduled-posts-showcase/ or install directly from the WordPress plugin repository.By design, this plugin never creates links to scheduled posts. Linking to unpublished content causes 404 errors for visitors, which is bad for user experience and SEO. Instead, the plugin shows post information to build anticipation without broken links.
Yes! Select any public post type from the settings page, or several at once, and specify them in the shortcode with post_type="your_post_type" or post_type="post,your_post_type".
Yes. The settings page has a “Content filters” section where you untick the “Any category” or “Any author” box and pick what you want, and decide whether the ticked terms are shown or hidden. Every widget, block and shortcode can override those filters with its own.
Each post type shows the terms of its own hierarchical taxonomies, and falls back to the flat ones when it has none. If you need a different set, use the spscase_term_taxonomies filter.
Yes. The cache is invalidated by versioning its key, so scheduling or publishing a post refreshes the list immediately with any object cache backend.
Use the settings page to configure global defaults for appearance. You can also override settings on individual instances (widget, block, shortcode). For advanced customization, use the CSS classes documented below.
The REST API respects the same visibility settings as the other display methods. If you restrict visibility to logged-in users or editors, the API will also require authentication.
Yes! The plugin provides extensive hooks for developers. See the Developer Hooks section below for all available filters and actions with usage examples.
categories, tags, tax_<taxonomy>, authors and tax_mode, and post_type now accepts a comma-separated list. Terms and authors can be written as IDs or as slugs, and any of them accepts “all” to skip that filter.categories, tags, taxonomy, terms, authors and tax_mode, and post_type now accepts a comma-separated list or “all”.spscase_filter_taxonomies, spscase_term_taxonomies, spscase_terms_limit, spscase_authors_limit and spscase_author_options filters.spscase_post_types filter now applies to every surface (settings, widget, block, shortcode and REST), not just to the settings dropdown.[scheduled-posts-showcase] now inherits what is configured in Appearance > Scheduled Posts, like the widget and the block already did, including the accent color.relative value documented for the spscase_date_format filter broke the output. It now renders “in 3 days” and keeps the absolute date in the title attribute of the time element.For older changelog entries, please check the changelog.txt file