alleyinteractive / wp-curate
Plugin to curate homepages and other landing pages
Package info
github.com/alleyinteractive/wp-curate
Type:wordpress-plugin
pkg:composer/alleyinteractive/wp-curate
Requires
- php: ^8.2
- alleyinteractive/composer-wordpress-autoloader: ^1.0
- alleyinteractive/traverse-reshape: ^2.0
- alleyinteractive/wp-match-blocks: ^4.2
- alleyinteractive/wp-type-extensions: ^4.0 || ^5.0
- mantle-framework/support: ^1.12
Requires (Dev)
- alleyinteractive/alley-coding-standards: ^2.0
- mantle-framework/testkit: ^1.12
- szepeviktor/phpstan-wordpress: ^2.0
- wpackagist-plugin/wp-graphql: 2.12.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
- dev-develop
- v3.5.0
- v3.4.1
- v3.4.0
- v3.3.0
- v3.2.3
- v3.2.2
- v3.2.1
- v3.2.0
- v3.1.0
- v3.0.0
- v2.7.2
- v2.7.1
- v2.7.0
- v2.6.4
- v2.6.3
- v2.6.2
- v2.6.1
- v2.6.0
- v2.5.0
- v2.4.11
- v2.4.10
- v2.4.9
- v2.4.8
- v2.4.7
- v2.4.6
- v2.4.5
- v2.4.4
- v2.4.3
- v2.4.2
- v2.4.1
- v2.4.0
- v2.3.3
- v2.3.2
- v2.3.1
- v2.3.0
- v2.2.3
- v2.2.2
- v2.2.1
- v2.2.0
- v2.1.0
- v2.0.2
- v2.0.1
- v2.0.0
- v1.10.0
- v1.9.1
- v1.9.0
- v1.8.2
- v1.8.1
- v1.8.0
- v1.7.1
- v1.7.0
- v1.6.3
- v1.6.2
- v1.6.1
- v1.6.0
- v1.5.1
- v1.5.0
- v1.4.5
- v1.4.4
- v1.4.3
- v1.4.2
- v1.4.1
- v1.4.0
- v1.3.0
- v1.2.0
- v1.1.0
- 1.0.0
- dev-develop-built
- dev-release/3.5.0
- dev-add-filter-for-deduplication
- dev-feature/channels
- dev-fix/issue-451/nested-opacity
- dev-fix/multi-type-entity-raw-attributes
- dev-fix/issue-489/wordpress-7-buttons-move-bug
- dev-fam-built
- dev-fam
- dev-feature/add-support-for-search-by-url
- dev-fix/425-update-block-editor-types
- dev-feature/TECH-311/default-to-date-limiting-backfill-queries
- dev-feature/FAM-3249/reusable-curation-blocks
- dev-feature/backfill-date-limit-default
- dev-hotfix/fix-graphql-php-security-advisory
- dev-fix/issue-240/subquery-move-post-drag-drop
- dev-feature/issue-354/swap-query-params-select-posts
- dev-fix/issue-356/downgrade-react-dom-to-18
- dev-feature/168-tests-again
- dev-feature/168-tests
- dev-feature/TECH-208/add-real-layouts
- dev-feature/tech-216/editor-placeholder
- dev-feature/issue-400/filter-query-block-template
- dev-filter-for-unique-pinned-posts
- dev-feature/rest-api-endpoint-change
- dev-feature/issue-203/drag-drop-posts-editor-sidebar-sort
- dev-my-branch
- dev-release/v1.4.0-10
- dev-release/v1.3.0-8
- dev-release/v1.3.0-7
- dev-release/v1.1.0-4
- dev-release/v1.1.0-3
- dev-feature/changesets
- dev-feature/precompiled-results
- dev-first-attempt
This package is auto-updated.
Last update: 2026-11-02 20:57:47 UTC
README
A plugin for WordPress to build flexible, curatable layouts for homepages and landing pages.
WP Curate provides a new query block, which is a more powerful version of the Query Loop block available in WordPress's full site editor that is available on all pages, not just templates edited by the full site editor. Notable improvements include:
- The ability to include more than one post type in the results
- The ability to curate (pin) posts to any location in the results
- The ability to deduplicate posts across multiple query blocks on the same page
By using multiple query blocks on the same page, it is possible to create complex layouts featuring curated posts, recent posts, posts in specific categories, and more, all while ensuring that no post is repeated across multiple blocks.
Features
Curation
When adding a WP Curate Query block, editors can choose the number of posts to display, and can optionally select specific posts to appear in any of those locations. This is particularly useful if you have a section on the homepage that you want to retain full editorial control over, where you want to ensure that specific posts appear in specific locations.
Automatic Backfill
By specifying post types and taxonomy terms, any WP Curate Query block can automatically display the latest posts that meet those criteria, whether curated posts are part of the block or not. This is useful for creating sections that display the latest posts in a specific category, tag, or custom taxonomy. Posts that are backfilled will be previewed in the editor, but will be grayed out to indicate that they are not curated. As new posts are published that meet the query criteria for backfill, they will automatically be displayed without having to edit the homepage or landing page again.
Deduplication
WP Curate Query blocks can be set to deduplicate posts across multiple blocks on the same page. This ensures that no post is repeated across multiple blocks, even if it meets the criteria for multiple blocks.
The wp-curate.dedupe hook
Requests a page-wide deduplication pass over every Query and Subquery block in the post.
import { doAction } from '@wordpress/hooks'; doAction( 'wp-curate.dedupe' );
The wp_curate_deduplication_enabled filter
Filters whether deduplication is enabled for a Query or Subquery block. The default value is false, unless the current post or page has the wp_curate_deduplication post meta enabled. A block with its deduplication attribute set to never also starts as false. The filter runs after those checks, so its return value always takes precedence.
Parameters:
$dedupe(bool) - Whether deduplication is enabled for the block.$post_id(int|null) - The ID of the queried post, ornullwhen the main query is not a single post or the posts page.$parsed_block(array) - The parsed block.
Return a bool. Other values are cast to bool.
// Deduplicate every block on the site, including blocks set to "never". add_filter( 'wp_curate_deduplication_enabled', '__return_true' );
The wp_curate_history_seed filter
Filters the object that supplies the initial post IDs for the deduplication history. Posts in the seed count as already used, so Query and Subquery blocks with deduplication enabled exclude them. The filter runs once per request.
By default, the seed is a Pinned_In_Post_Content object, which implements the Alley\WP\Types\Post_IDs interface. It supplies the IDs of posts pinned in the content of the queried post. It returns IDs only when the post is a single post and has both the wp_curate_deduplication and wp_curate_unique_pinned_posts post meta enabled.
The object's post_ids() method can be called many times in a request. Do any expensive work inside that method, and cache or memoize the result so the work happens once.
Parameters:
$seed(Post_IDs) - The seed for the history of post IDs.
A filter callback must return an object that implements Alley\WP\Types\Post_IDs. For a fixed list of IDs, Post_IDs_Envelope is an easy way to build one.
use Alley\WP\Post_IDs\Post_IDs_Envelope; // Treat these posts as already used, so blocks with deduplication enabled skip them. add_filter( 'wp_curate_history_seed', fn () => new Post_IDs_Envelope( [ 123, 456 ] ) );
Flexible Templates
WP Curate Query blocks use the same Post Template block that the main Query Loop block uses, allowing for a wide range of layout options. This includes the ability to show or hide featured images, authors, excerpts, dates, and more.
Parse.ly Support
WP Curate supports integration with Parse.ly for showing posts based on a Parse.ly popular posts query. This allows you to show popular posts on your homepage or landing page without having to manually curate them. As data is updated in Parse.ly, the posts displayed in the WP Curate Query block will automatically update.
Screenshots
For an up-to-date gallery of screenshots of the plugin in action, see the screenshots page on the WP Curate wiki.
Requirements
WP Curate requires PHP 8.2+. It is developed for use on WordPress 6.9+.
Changelog
Please see CHANGELOG for more information on what has changed recently.
Credits
This project is actively maintained by Alley.
Like what you see? Come work with us.
License
The GNU General Public License (GPL) license. Please see License File for more information.