Descriere
Bracket Post Order gives you complete control over how your content is sorted — directly from the native WordPress admin screens you already use. No new interfaces to learn, no separate reorder pages. Just drag and drop.
A key feature is per-term post ordering: the ability to define a different post order for each individual category, tag, or custom taxonomy term. Show your products in one order on „Summer Collection” and a completely different order on „Best Sellers” — each term maintains its own independent sort.
Three Types of Ordering
1. Global Post Ordering
Drag-and-drop to reorder posts, pages, and custom post types on the standard admin list table. The new order is saved to menu_order and automatically applied on the front end.
2. Per-Term Post Ordering
Filter your admin list by a category or taxonomy term, and the interface switches to per-term mode. Drag posts into the order you want for that specific term. Assign the same post to multiple categories — each one keeps its own sort. New posts added to a term automatically appear first (newest on top).
3. Taxonomy Term Ordering
Reorder categories, tags, and custom taxonomy terms themselves via drag-and-drop on the native edit-tags.php screen. The new term order is applied to get_terms() queries and navigation menus on the front end.
Key Features
- Reset Order — Reset post order by date or title with one click. Most requested feature across all ordering plugins.
- Undo — „Order saved. [Undo]” link appears for 8 seconds after every reorder. Click to revert instantly.
- Mobile/Touch Support — Full touch drag-and-drop on phones and tablets via jQuery UI Touch Punch.
- Keyboard Accessibility — Tab to a row, Enter to activate, Arrow keys to move, Enter to save, Escape to cancel. WCAG compliant.
- Order Column — „#” column shows each post’s position number at a glance.
- WPML & Polylang Support — Per-term ordering works correctly across languages.
- Admin Bar Indicator — Shows current ordering mode (Global or Per-Term) in the admin bar.
- Settings Link — Quick access from the Plugins page.
How It Works
- Go to Settings > Bracket Post Order
- Toggle on the post types you want to reorder
- Toggle on taxonomies for per-term post ordering
- Toggle on taxonomies for term reordering
- Visit your admin list pages and start dragging
Changes save automatically via AJAX — no page refresh needed.
Built for WordPress, Not Against It
- Works directly inside native admin list tables (
edit.phpandedit-tags.php) - Uses standard
menu_orderfor global ordering — compatible with any theme - Uses
term_orderfor taxonomy terms — the same column WordPress defines - Per-term order stored as term meta — clean, portable, conflict-free
- Front-end queries are modified transparently via
pre_get_postsandposts_clauses - Explicit
orderbyparameters (date, title, etc.) are never overridden
Works With
- Any public custom post type (portfolios, team members, testimonials, events, FAQs, services)
- WooCommerce products and product categories
- Any registered taxonomy with a UI
- Page builders that use standard
WP_Query(Elementor, Divi, Beaver Builder) - Themes that follow WordPress template hierarchy
- WPML and Polylang multilingual plugins
For Developers
Bracket Post Order provides hooks so you can extend or control its behavior:
// Filter: skip per-term ordering for a specific query
add_filter( 'bracket_po_apply_term_post_order', function( $apply, $term_id, $query ) {
// Return false to skip
return $apply;
}, 10, 3 );
// Filter: modify the retrieved term post order
add_filter( 'bracket_po_get_term_post_order', function( $ordered_ids, $term_id ) {
return $ordered_ids;
}, 10, 2 );
// Actions: fired after order is saved via drag-and-drop
do_action( 'bracket_po_global_order_updated', $post_ids );
do_action( 'bracket_po_term_post_order_updated', $term_id, $post_ids );
do_action( 'bracket_po_term_order_updated', $term_ids );
// Actions: fired after order is reset
do_action( 'bracket_po_global_order_reset', $post_type, $sort_by );
do_action( 'bracket_po_term_post_order_reset', $term_id );
To apply per-term order in custom queries, set orderby to menu_order and include a tax_query with a single term:
$query = new WP_Query( [
'post_type' => 'product',
'orderby' => 'menu_order',
'order' => 'ASC',
'tax_query' => [ [
'taxonomy' => 'product-category',
'field' => 'term_id',
'terms' => 42,
] ],
] );
The plugin will automatically apply the saved per-term order via FIELD() SQL — ordered posts appear first, new/unordered posts appear last (sorted by date, newest on top).
Instalare
Automatic Installation
- In your WordPress admin, go to Plugins > Add New
- Search for „Bracket Post Order”
- Click Install Now, then Activate
- Go to Settings > Bracket Post Order to configure
Manual Installation
- Download the plugin ZIP file
- Upload the
bracket-post-orderfolder to/wp-content/plugins/ - Activate the plugin through the Plugins menu
- Go to Settings > Bracket Post Order to configure
Configuration
- Navigate to Settings > Bracket Post Order
- In the Post Types card, toggle on each post type you want to reorder
- In the Per-Term Post Ordering card, toggle on taxonomies (taxonomies appear automatically based on your enabled post types)
- In the Term Ordering card, toggle on taxonomies whose terms you want to reorder
- Click Save Changes
That’s it. Visit any enabled post type list and start dragging rows.
Întrebări frecvente
-
Does this work with custom post types?
-
Yes. Any post type with
show_ui => trueappears in the settings. This includes WooCommerce products, portfolio items, team members, testimonials, events, and any custom post type registered by your theme or plugins. -
How does per-term ordering work?
-
When you filter the admin post list by a taxonomy term (e.g., selecting a specific category from the dropdown), the plugin switches to per-term mode. An info notice appears confirming the mode. Drag posts into the order you want — that order is saved exclusively for that term.
The same post can belong to multiple terms, and each term maintains its own independent order.
-
Does the custom order appear on the front end?
-
Yes. The plugin hooks into
pre_get_postsandposts_clausesto automatically apply the saved order to front-end queries. For global ordering, it setsorderby => menu_order. For per-term ordering, it modifies the SQLORDER BYclause usingFIELD()so your saved order is respected while keeping pagination and other query parameters intact. -
What if I set an explicit orderby in my query?
-
The plugin never overrides explicit
orderbyparameters other thanmenu_order. If your query usesorderby => date,title,meta_value, or anything else, the plugin leaves it alone. This is by design — your code always takes priority. -
Does it work with WooCommerce?
-
Yes. Enable the „Products” post type and relevant product taxonomies in the settings. The plugin works with WooCommerce product categories and tags for both global and per-term ordering.
-
Yes. Enable term ordering for any taxonomy in the settings. Then go to that taxonomy’s admin page (e.g., Posts > Categories) and drag terms into your preferred order. The new order is applied to
get_terms()queries on the front end. -
How do I reset the order?
-
Click the „Reset Order” button above the post list table. Choose a sort method (Date newest/oldest, Title A-Z/Z-A) and confirm. For per-term mode, resetting removes the custom order for that term.
-
Does it work on mobile/tablet?
-
Yes. Version 1.1.0 includes full touch support. Drag-and-drop works on phones and tablets with properly sized touch targets.
-
Is it accessible via keyboard?
-
Yes. Tab to any row, press Enter or Space to activate reorder mode, use Arrow Up/Down to move the row, Enter to save, or Escape to cancel. Screen reader announcements are provided via ARIA live regions.
-
Does it work with WPML or Polylang?
-
Yes. The plugin automatically detects WPML and Polylang and maps per-term ordering to work correctly across languages.
-
Does clicking a column header disable drag-and-drop?
-
Yes. When you click a column header to sort by title, date, etc., the plugin detects the
orderbyURL parameter and disables drag-and-drop. Removing the sort (clicking the post type menu link again) re-enables it. -
Does it affect search results?
-
No. The plugin only applies its ordering to queries for enabled post types that don’t have an explicit
orderbyset. WordPress search queries use relevance-based sorting, which the plugin does not interfere with. -
Is it compatible with page builders?
-
Yes. Elementor, Divi, Beaver Builder, and other page builders that use standard
WP_Querywill respect the custom order. If the builder lets you setorderbytomenu_order, the per-term ordering also works automatically. -
What happens when I add a new post to a category that has a custom order?
-
New posts that aren’t part of the saved per-term order automatically appear last (sorted by date, newest on top). You can then go to the admin, filter by that term, and drag the new post into position.
-
Is it compatible with Simple Custom Post Order (SCPO)?
-
The plugin detects SCPO and displays an admin notice recommending deactivation. If both are active, Bracket Post Order dequeues SCPO’s scripts on pages where it is active to prevent conflicts. For best results, deactivate SCPO before using this plugin.
-
Does it support multisite?
-
Yes. The plugin works on individual sites within a multisite network. Each site maintains its own settings and post order.
Recenzii
Nu există nicio verificare pentru acest modul.
Contributori și dezvoltatori
„Bracket Post Order” este un software open-source. La acest modul au contribuit următoarele persoane.
ContributoriTradu „Bracket Post Order” în limba ta.
Te interesează dezvoltarea?
Răsfoiește codul, vezi depozitarul SVN, sau abonează-te la jurnalul de dezvoltare prin RSS.
Istoric modificări
1.2.5
- Fixed: Uninstall now removes the bracket_po_db_version option to prevent schema migration being skipped on reinstall
- Fixed: Deleted or trashed posts are now cleaned from per-term order meta, preventing stale data accumulation
- Fixed: Global order save now validates that posts belong to an enabled post type
- Fixed: Term order save now validates that terms belong to an enabled taxonomy
- Fixed: Term order reset now validates the term’s taxonomy is enabled before deleting order data
- Fixed: Strict comparison for term order deduplication zero-check
- Fixed: WPML compatibility no longer passes false to translation filter for deleted posts
- Improved: OR tax_query relation check now short-circuits before unnecessary term resolution
1.2.4
- Fixed: Fatal SQL error when term_order column is missing from wp_terms — now gracefully falls back
- Fixed: Global reset now also clears per-term ordering data to prevent stale order arrays
- Fixed: Per-term save no longer discards posts on other pages when list is paginated
- Fixed: SCPO conflict detection now dequeues the correct script handle (scporderjs)
- Fixed: sanitize_text_field before parse_str could corrupt serialized order data on some servers
- Fixed: Duplicate menu_order values now resolved to unique sequential values during save
- Fixed: New posts added to an ordered term now appear last (after ordered posts) instead of first
- Fixed: Refresh order no longer runs during AJAX requests, preventing mid-drag corruption
- Fixed: Autosaves and revisions no longer trigger unnecessary menu_order re-sequencing
- Fixed: Re-sequence sort is now deterministic with ID-based tiebreaker
- Fixed: WPML per-term ordering now uses actual taxonomy instead of hardcoded ‘category’
- Fixed: PHP usort stable tiebreaker for term_order on PHP < 8.0
- Fixed: Keyboard Escape handler maintains focus after cancel
- Improved: term_order column auto-created on admin_init if missing (handles FTP installs)
- Improved: Admin notice shown if ALTER TABLE fails during activation
- Improved: REST API queries are no longer affected by the plugin’s ordering hooks
- Improved: Per-term save validates that term belongs to an enabled taxonomy
1.2.3
- Fixed: New posts added to a term with per-term ordering now appear first instead of last
1.1.0
- New: Settings link on the Plugins page for quick access
- New: Admin bar indicator showing current ordering mode (Global or Per-Term)
- New: Order position „#” column on admin post list tables
- New: Reset Order button with sort options (Date DESC/ASC, Title A-Z/Z-A) for both global and per-term modes
- New: Undo last reorder — „Order saved. [Undo]” link with 8-second timeout
- New: Green highlight animation on rows after save
- New: Drag handle (vertical dots) visible on row hover
- New: Enhanced sortable placeholder and helper styles
- New: 800ms debounce on AJAX saves to prevent rapid drag spam
- New: Mobile/touch drag-and-drop support via jQuery UI Touch Punch
- New: Touch-friendly CSS — 48px min-height targets on coarse pointer devices
- New: Full keyboard accessibility — Enter/Space to activate, Arrow keys to move, Enter to save, Escape to cancel
- New: ARIA live region for screen reader announcements (WCAG compliance)
- New: WPML compatibility — per-term ordering works across languages
- New: Polylang compatibility — per-term ordering works across languages
- Performance: Optimized admin_init refresh — only recalculates menu_order when posts actually change (transient-based staleness detection)
- Improved: Sortable helper has larger shadow and subtle scale
- Improved: Focus ring styles for keyboard navigation
- Updated: uninstall.php cleans up transients
- Developer: New
bracket_po_global_order_resetaction - Developer: New
bracket_po_term_post_order_resetaction
1.0.2
- Fixed table layout during drag-and-drop on some environments
- Improved first-time post ordering initialization
- Auto-detection and repair of menu_order gaps
1.0.1
- Improved WordPress coding standards compliance
- Settings page UX improvements
- Minor code quality and compatibility fixes
1.0.0
- Initial release
- Global post ordering via
menu_orderwith drag-and-drop on admin list tables - Per-taxonomy-term post ordering — independent sort order for each category/tag/term
- Taxonomy term ordering via drag-and-drop on
edit-tags.php - Modern settings page with card layout and toggle switches
- Dynamic taxonomy visibility — toggling a post type instantly shows its taxonomies
- Transparent
WP_Queryintegration viapre_get_postsandposts_clauses - Per-term ordering uses SQL
FIELD()for native pagination support - Automatic conflict detection and script dequeuing for Simple Custom Post Order
- Developer hooks:
bracket_po_apply_term_post_order,bracket_po_get_term_post_order,bracket_po_global_order_updated,bracket_po_term_post_order_updated,bracket_po_term_order_updated - Clean uninstall — removes options and term meta on plugin deletion
- Full internationalization support with
.pottemplate