This plugin gives editors one focused screen (Tools → Category Post Order) to: Choose a content type (posts or any custom post type) and either its global order or one category, tag or custom taxonomy term . Arrange posts as visual cards, or pin a few to the top and let the rest sort automatically (
PricingFree downloadThe WordPress.org download is free. Pro versions, add-ons or external services may cost extra.
CompatibilityRequires WordPress 6.6 and PHP 7.4.
SourceWordPress plugins · Nov 15, 2026
01 / Source details
Aboutthistool.
This plugin gives editors one focused screen (Tools → Category Post Order) to:
01Choose a content type (posts or any custom post type) and either its global order or one category, tag or custom taxonomy term .
02Arrange posts as visual cards, or pin a few to the top and let the rest sort automatically (newest, oldest, title A–Z or Z–A).
03Preview the numbered order, then Save . Discard, Undo and conflict detection keep edits safe.
04See where the order applies and check the integration when a listing does not follow it.
Each term keeps its own order per content type. The same post can be 2nd in “Residential” and 9th in “Commercial”. The global order is stored separately and never mixed with term orders.
What it changes, and what it never changes
It only replaces the ORDER BY of queries that are meant to use it. It never changes which posts a query returns, so visibility rules, drafts, private posts, pagination and post counts are untouched.
Nothing changes on your site until you save an order and a listing uses it, through native archive integration (opt-in), a Query Loop block set to a curated order, or a custom query that passes the jdcpo argument.
Search results, feeds, REST API responses, admin lists and other secondary queries are never reordered unless they opt in explicitly.
When a listing selects several terms, the plugin does not guess. It keeps the normal order unless the developer names the ordering term.
No external services, tracking, accounts or page builder required.
Using a saved order
1. Native archives
Enable them in Settings. The main query of an enabled archive uses the saved order unless:
the request asks for another sort (for example ?orderby=title , or a theme’s pre_get_posts sets orderby )
Select a Query Loop block and open Curated post order in the block sidebar. Choose Global order or A term’s order… and pick the term. The editor preview and the published page use the same order. (Query Loops set to “Use default query / inherit” follow the archive integration instead.)
3. Custom PHP queries
Pass the jdcpo argument to WP_Query , or use the helper jdcpo_query_args() , which also sets suppress_filters => false (required for get_posts() ).
Accepted values: true / 'auto' , 'global' , 'term:123' , or an array with term (ID or slug), taxonomy (required for slugs), post_type , fallback ( 'global' or 'none' ).
4. AJAX “load more”
Use the same arguments on every page request. Pagination stays correct because only the ORDER BY changes.
Important: requests to admin-ajax.php run with is_admin() === true , where WordPress includes drafts in queries without an explicit status. Always set post_status => 'publish' in public AJAX handlers. That is standard WordPress practice, not something this plugin changes.
Debugging
Check integration (on the Arrange screen) lists what is configured for the selected scope and common reasons an order may not apply.
While logged in as an Editor or Administrator, open any listing on your site. The Post order toolbar menu reports each relevant query on that page and why it did or did not use a curated order, for example “This listing sorts by title and has not opted into curated ordering.”
In code: jdcpo_explain_query( $query ) returns the same plain-language reason.
Hooks for developers
jdcpo_loaded (action): fires after the plugin has loaded. Add-ons hook in here.
jdcpo_order_config (filter): ( array $config, Scope $scope, WP_Query $query ) . Adjust pins or positions for one query just before ORDER BY is built. It cannot change which posts are returned.
jdcpo_order_saved (action): ( Scope $scope, array $config ) . Fires after an order is saved or undone on the Arrange screen.
jdcpo_available_post_types (filter): ( WP_Post_Type[] $types ) . The content types that can be enabled in Settings.
jdcpo_scope_capability (filter): ( string $cap, Scope $scope ) . Who can arrange a scope.
Known limitations
One order per term per content type: up to 5,000 arranged and 200 pinned posts per scope. The admin screen loads 50 cards at a time and can load up to 2,000 for “Move to bottom”. Positions beyond the loaded range keep their saved order.
Ordering is applied with a CASE expression on post IDs. That is fast for typical collections (hundreds to a few thousand arranged posts). Very large catalogues have not been benchmarked.
Listings that mix several content types, or several terms without a named ordering term, keep their normal order by design.
WordPress sticky posts are ignored on a curated blog index (pins replace them).
get_posts() skips query filters by default. Pass suppress_filters => false , or use jdcpo_query_args() .
Page caches may serve an older copy of a listing after you save. Clear your cache.
Theme template files that contain a Query Loop are not scanned by “Where this applies”; only content saved in the database is.
Multilingual plugins (WPML, Polylang), WooCommerce product sorting and third-party page builders (Elementor, Divi, etc.) need separate compatibility verification. Translated terms are separate terms, so each language’s term has its own order. Builder widgets that run their own queries need the jdcpo argument.
See it in action
Screenshots & previews.
The Arrange screen: a separate order for each category, shown as cards you can drag, move with buttons or the keyboard, with an ordering preview.Pinned-first mode: a few posts pinned to the top, the rest sorted automatically.Settings: choose content types, taxonomies and which archives use a saved order.
02 / Source details
Gettingstarted.
01Upload the jdr-category-post-order folder to /wp-content/plugins/ or install the ZIP via Plugins → Add New → Upload Plugin.
02Activate JDR Category Post Order & Pinned Posts .
03Go to Tools → Category Post Order → Settings (administrators): Tick the content types to arrange, and for each one the taxonomies that should have per-term orders. Posts + Categories are enabled by default.
04Optionally turn on native archives : the blog/post-type archive uses the global order; selected taxonomy archives use the term’s order.
05Choose what a term archive does when the term has no saved order: keep the theme order (default) or use the global order.
06Go to Tools → Category Post Order → Arrange , choose a content type and a term, arrange or pin, and click Save order .
Who can arrange: users who can edit others’ posts of that content type (Editors and Administrators by default). Change it with the jdcpo_scope_capability filter. Only Administrators see Settings.
03 / Source details
Frequently asked questions.
Does it use menu_order?
No. menu_order is one number per post, so it cannot hold different positions in different categories. The plugin stores an ordered list per term and content type (term meta) and a global list per content type (an option).
What happens to new posts?
In Manual mode they appear first or last (your choice), newest first, until you arrange them. In Pinned-first mode they join the automatically sorted remainder.
What if a post leaves a category or is deleted?
It simply stops appearing in that listing. Its stale entry is removed the next time the order is saved.
Do drafts show up on my site?
No. Drafts, scheduled and private posts are listed on the Arrange screen so you can position them in advance, but the plugin never changes which posts a visitor’s query returns.
Does it work with WooCommerce products?
Not yet. Products can be enabled in Settings, but WooCommerce shop and category pages use WooCommerce’s own sorting, so they don’t follow a saved order. WooCommerce support is being considered: if you need it, say so in the support forum .
Is my data deleted when I deactivate?
No. Data is kept on deactivation and on deletion, unless you tick “Delete all saved orders and settings when the plugin is deleted” in Settings.
FinderPress Media Auditor helps site administrators scan for broken images, missing Media Library files, unreachable media URLs, and other media issues across WordPress content. Use it to audit images, video, audio, PDFs, featured images, and attachment files without sending scan data to an external
The Accepted Payment Methods plugin is a straightforward, lightweight solution that enhances your website by displaying visually appealing icons of the payment methods you accept. This plugin is ideal for a variety of websites, including e-commerce platforms, service-oriented websites, and informati