Description
Easy Labels is a comprehensive WordPress plugin for organizing and visualizing your content workflow. Create custom colored labels, add private notes, and gain insights through interactive dashboard widgets with pie charts, bar graphs, and statistics – all visible only in the backend for seamless team collaboration.
Main Features
- Customizable colored labels: Create labels with name and color of your choice
- Default labels: Manage special labels “All” and “No Label” with custom colors and borders
- Custom borders: Add borders to labels (solid, dashed, dotted, double) with custom colors
- Internal notes: Add private notes for each content, visible only in the backend
- Dashboard widgets: 5 visualization types (pie, donut, bar, list, stats) with click-to-filter
- Drag & drop ordering: Customize label order in widgets with intuitive drag & drop interface
- Interactive charts: Click on any chart segment or list item to filter content by that label
- Multi-select filtering: Toggle between single and multiple label selection with AND logic
- Backup & Restore: Export and import all plugin settings in JSON format
- Quick filters: Quickly filter content by label with drag & drop to reorder
- Label search: Integrated search field in popup to quickly find labels
- Real-time counts: Label counts update automatically without page refresh
- Multi-language: Support for 10 languages (IT, EN, FR, DE, ES, RU, ZH, JA, KO, HI)
- Granular permissions: Control who can view and edit labels and notes
- Custom Post Types: Enable the system for any content type
- Smart cache: Cache system for optimal performance
- 100% Backend: Labels and notes are visible only in the admin area
Ideal for
- Editorial teams who need to coordinate content management
- Sites with many posts that need internal organization
- Agencies managing content on behalf of clients
- Editorial offices using complex workflows
Screenshots

View of labels in the posts list 
Label configuration panel 
Meta box for assigning labels to content 
Quick filters with multi-select mode toggle and visual selection indicators 
Multi-select filtering with AND logic – filter posts with multiple labels together 
Permission management by role 
Dashboard widgets with pie/donut charts and click-to-filter 
Bar chart visualization with horizontal and vertical orientations 
Drag & drop interface for customizing label order in widgets 
Stats cards and list visualization types
Installation
- Upload the
redshape-easylabelsfolder to the/wp-content/plugins/directory - Activate the plugin from the WordPress ‘Plugins’ menu
- Go to Tools > Easy Labels to configure labels
- Start organizing your content!
FAQ
-
Are labels visible on the frontend?
-
No, labels and notes are visible only in the WordPress backend for internal content organization.
-
Can I use Easy Labels with Custom Post Types?
-
Yes, you can enable the system for any post type from the settings page.
-
Can I control who can see the labels?
-
Yes, you can configure permissions by user role from the Permissions settings section.
-
How many labels can I create?
-
There is no limit to the number of labels you can create.
-
Is the plugin translated into other languages?
-
Yes, the plugin ships with standard WordPress
.po/.motranslation files for 10 languages (IT, EN, FR, DE, ES, RU, ZH, JA, KO, HI). The files live in thelanguages/folder and follow the conventional namingredshape-easy-labels-{locale}.mo, making the plugin fully compatible with Loco Translate, GlotPress, WPML, WP-CLI i18n tools, and any other standard WordPress translation workflow. Translation files are also regenerated automatically on plugin activation. -
Can I transfer settings between different sites?
-
Yes, from the Backup & Restore section you can export all settings to a JSON file and import them on another site. The system automatically filters content types that don’t exist on the destination site.
-
How does multi-select filtering work?
-
Toggle the Multi switch in the quick filters to enable multi-select mode. Click label badges to apply filters immediately (AJAX) without page reload, and choose AND or OR mode. AND returns posts that match all selected labels, while OR returns posts that match at least one selected label.
Reviews
Contributors & Developers
“REDSHAPE Easy Labels” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “REDSHAPE Easy Labels” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.5.1
- Improvement: Settings page (Tools > Easy Labels) now always renders in the WordPress site language — the
plugin_languageoption now controls only the operational interface (content labels, filter bar, notes, modals, dashboard widgets) - Fix: Removed redundant
switch_to_locale()call inprepare_view_data()— post-type names on the settings page now correctly follow the WordPress site locale - Improvement: Updated Language tab description and i18n strings to accurately reflect the new two-locale behaviour (settings = WP locale, operational UI = plugin language)
- UI: Several layout and visual improvements to the settings page — all main tab containers (support, backup, language, permissions, post-types) set to full-width layout; post-types grid updated to a 3-column layout; intro card headers and descriptions standardised for consistent two-line appearance across all tabs
- UI: Label and widget editor cards are now collapsible — each card has a toggle arrow button next to the delete button; existing cards load collapsed by default, newly created cards start open
- UI: Post-type badges now appear to the right of the coloured label badge in the collapsed label card header, showing which content types the label is assigned to; badges update dynamically when checkboxes are changed
- UI: Widget editor card collapsed header now shows the configured content type and visualization type as info badges; badges update dynamically when the respective selects are changed
- UX: Clicking anywhere on the label or widget card header bar now toggles the collapsed state (the arrow button still works as before);
cursor: pointeradded to header bars for clarity - UI: All card/section hover effects across the settings page now use a consistent style — base border standardised to
1px solid #c3c4c7and hover border to1px solid #2271b1withbox-shadow: 0 4px 12px rgba(0,0,0,0.08); removedtransform: translateYanimations and non-standard border thicknesses/colours from post-type cards, language cards, support cards and setting sections - Fix: Extended
phpcs:disable/enableblock inredshape-easy-labels.phpto correctly suppressNonceVerification.Recommendedacross the multi-line$is_settings_pageexpression (reading-only$_GET['page']to determine admin context) - Fix: Renamed template variables in
admin-page.phpto use the$redshape_easylabels_plugin prefix, resolvingPrefixAllGlobalsPHPCS warnings - Improvement: Labels created via the quick-create modal (from post list or meta box) are now automatically configured to be visible only on the current content type (post type), instead of all types; the modal info text updated accordingly
- Version bump: 1.5.0 1.5.1
1.5.0
- Maintenance: Full sync with WordPress.org SVN repository — all plugin files correctly added and distributed
- Version bump: 1.4.4 1.5.0
1.4.4
- Maintenance: Full sync with WordPress.org repository — no code changes, version bump to ensure all files are correctly distributed
- Version bump: 1.4.3 1.4.4
1.4.3
- Fix: Fatal “Class not found” error when plugin is loaded with missing files after a partial deploy — the previous fix (1.4.2) placed the file check inside
class-redshape-easylabels.phpwhich caused an earlyreturnthat leftRedshape_Easylabelsundefined, thenplugins_loadedstill tried to instantiate it and crashed; check is now in the main entry fileredshape-easy-labels.phpso if any file is missing theplugins_loadedhook is never registered — WordPress shows a clear admin notice listing the missing files - Version bump: 1.4.2 1.4.3
1.4.2
- Fix: Fatal error on activation when any core class file is missing from a partial deploy (
class-redshape-easylabels-helpers.php, etc.) —class-redshape-easylabels.phpnow checks all 10 required files withfile_exists()before loading them; if any are missing a clear admin notice lists them and the plugin exits cleanly instead of crashing WordPress - Fix: PHPCS
NonPrefixedVariableFoundwarning — removed global variable$_redshape_easylabels_lang_geninredshape-easy-labels.php, replaced with an inlinefile_exists()call - Version bump: 1.4.1 1.4.2
1.4.1
- Fix: Fatal error on activation/update when
class-redshape-easylabels-language-generator.phpwas missing from a partial deploy —require_onceis now conditional onfile_exists(); all call-sites guarded withclass_exists('Redshape_Easylabels_Language_Generator') - Fix: Data loss after saving settings —
save_settings()accessed$current_options['default_labels']and$current_options['role_settings']withoutisset; on PHP 8 a missing key returnsnull, causingupdate_optionto overwrite labels and widgets with null/empty values; replaced with defensiveissetreads and added automatic migration from the legacylabelskey todefault_labels - Fix: Post type selector in “Add New Label” showed only
postandpage—enqueue_settings_page_scripts()read$settings['role_settings']['enabled_post_types']which is alwaysnullbecauseget_settings()flattensrole_settingskeys to root level; corrected to read$settings['enabled_post_types']directly - Fix: Dropdown close in post editor / Gutenberg — replaced jQuery
$(document).on('click')bubbling (ineffective inside Gutenberg’s iframe) and capture-phase attempt with a transparent full-screen backdrop div (z-index 99998) that intercepts any click outside the dropdown; added centralisedcloseAllDropdowns()helper used by all 8 close paths - Fix: Missing
'Label name is required'translation key in 8 non-Italian locales (fr_FR,de_DE,es_ES,ru_RU,zh_CN,ja_JP,ko_KR,hi_IN) — JS validation error was always displayed in English regardless of plugin language setting - New: Added “Check for updates” link in the plugin description row on the Plugins page — clicking it triggers a WordPress update check (
update-core.php?force-check=1) without leaving the admin - Version bump: 1.4.0 1.4.1
1.4.0
- Code: Refactored monolithic God Object (
class-redshape-easylabels.php, 4619 lines) into 8 focused single-responsibility classes —Redshape_Easylabels_Helpers(static shared utilities),Redshape_Easylabels_Admin_Columns,Redshape_Easylabels_Bulk_Actions,Redshape_Easylabels_Filter_Bar,Redshape_Easylabels_Meta_Box,Redshape_Easylabels_Ajax,Redshape_Easylabels_Dashboard_Widget,Redshape_Easylabels_Settings - Code: Main
Redshape_Easylabelsclass is now a lean coordinator that instantiates sub-classes and wires up shared hooks - Fix: Corrected hardcoded Italian strings in
admin.js(Clicca per rimuovere,Aggiungi etichetta,Errore critico. Ricarica la pagina.,Errore di elaborazione risposta) — all now routed through the__()JS helper using English keys; translations added for all 10 supported languages - Improvement: Migrated translation system from hardcoded PHP arrays to standard WordPress
.po/.mofiles — now fully compatible with Loco Translate, GlotPress, WPML, and WP-CLI i18n tools - New: Added
Redshape_Easylabels_Language_Generatorclass that builds.poand.mofiles from the existing translation data (pure PHP, no external dependencies) - New: Added
bin/generate-languages.phpCLI script to regenerate all language files from the command line during development - New:
load_textdomain()now loads the correct.mobased on the per-plugin language setting (plugin_languageoption), independently of the WordPress site locale - New: Language files are automatically regenerated on plugin activation and lazily on first use if missing
- Code: Removed dead-code duplicate
class-redshape-easylabels-content-i18n.php(\~2300 lines, \~70% identical to the main i18n class, never loaded, using a stale option keycontent_labels_options) - Improvement: Migrated label storage from a single serialized array (
_content_labels) to one post-meta row per label (_content_label) — meta queries now use exact-match=instead ofLIKE '%...%', enabling MySQL index usage - New:
maybe_upgrade_storage()one-time migration function converts existing data transparently on first admin load after update - New: Added
get_post_label_ids()andset_post_label_ids()private helpers to centralise all label read/write operations - Fix: All
filter_posts_by_label(),add_quick_filter_bar(), and counter queries updated to use the new storage format - Fix: Cache class (
Redshape_Easylabels_Cache) updated to use the new meta key and exact-match queries - Fix:
uninstall.phpnow cleans up both_content_label(new) and_content_labels(legacy) meta keys - Code: Separated logic from template in
admin-page.php— all DB reads, locale switching,wp_localize_script, and static data arrays extracted into a newprepare_view_data()private method inRedshape_Easylabels_Settings; the template is now pure display HTML/PHP with no business logic - Fix: Eliminated duplicate column hook registrations — only
manage_{$pt}_posts_columns/manage_{$pt}_posts_custom_columnare now registered (fires for all post types); the redundantmanage_{$pt}s_columns/manage_{$pt}s_custom_columnhooks that caused double-fire on built-in types have been removed, along with the workaround guards they required - Performance: Replaced per-label COUNT queries with a single
GROUP BY meta_valuequery inRedshape_Easylabels_Helpers::get_label_counts_for_post_type()— used by both the AJAX filter-count endpoint and the dashboard widget renderer; eliminates the N-query loop that previously ran oneSELECT COUNT(DISTINCT)per label; nomaybe_unserialize()needed since_content_labelstores flat string values - Code: Extracted ~65 lines of inline JS (bulk label selector) from a PHP string with manual
\'escaping into a proper fileassets/js/admin-bulk-actions.js; translated alert strings passed viawp_localize_scriptasredshapeEasylabelsBulk.i18n - Fix:
redshape_easylabels_cl_e()docblock now explicitly states it strips HTML; added companionredshape_easylabels_cl_html_e()that passes the translated string throughwp_kses()with a minimal inline-tag allowlist (strong,em,code,span,br,a) so legitimate markup in translations is preserved instead of silently entity-encoded - Fix:
Redshape_Easylabels_Cache::invalidate_all()— replaced the version-number trick (broken without persistent object cache: each PHP process starts with empty memory, so the counter was never shared between requests) withwp_cache_flush_group()(WP 6.1+ / Redis / Memcached) plus a per-label fallback for standard setups; also removed thecache_versionlookup fromgenerate_cache_key()which added an extrawp_cache_get()on every cache read/write - Fix:
initializeInlineLabels()inadmin.js— replacedsetTimeoutretry polling (two blind delays of 300–500 ms) with aMutationObserverthat watchesdocument.bodyand fires exactly once when.wp-list-table .row-titleappears, then disconnects; eliminates missed renders and unnecessary CPU wake-ups - Fix:
redshape_easylabels_deactivate()was empty; now callsRedshape_Easylabels_Cache::invalidate_all()on deactivation so stale label counts don’t persist in Redis / Memcached between sessions - Fix:
get_cache_stats()was reading from the wrong option key (labelsinstead ofdefault_labels) — always returnedtotal_labels: 0; removed stalecache_versionentry from the returned array (that key was deleted earlier in 1.4.0); loop now uses the associative key as label ID instead of$label['id'] - Fix:
ajax_add_label_to_post()now validates that the requested label ID exists in the plugin configuration before writing to post meta, preventing arbitrary strings from being stored via AJAX by any user withedit_postcapability - Fix:
get_all_post_labels()SQL query fetched all_content_labelrows across the entire database with no post-type filter; query now JOINswp_postsand filters bypost_type, significantly reducing data volume on multi-post-type sites - Fix: Two hardcoded Italian
__()keys ('Il nome dell\'etichetta è obbligatorio') in the Quick Create Label handlers inadmin.jsreplaced with the existing English key'Label name is required'so all 10 locales translate correctly - Fix:
DOMNodeInsertedevent (deprecated, removed in Chrome 124+) replaced with aMutationObserverthat watches for new.content-label-badgeelements and adds thedraggableclass on insertion - Fix:
initializeDragAndDrop()andinitFilterDragAndDrop()were started via 4 chainedsetTimeoutcalls (500 ms, 800 ms, 1500 ms, 3000 ms +$(window).on('load')); replaced with a single$(window).on('load')for the sortable initializer and aMutationObserverfor the filter container — eliminates blind waits and missed renders - Code: Corrected
@since 1.4.1tag to@since 1.4.0in all 9 class file docblocks (coordinator, helpers, ajax, settings, admin-columns, bulk-actions, filter-bar, meta-box, dashboard-widget) - Code: Removed redundant
!defined('ABSPATH')guard inuninstall.php— WordPress definesABSPATHandWP_UNINSTALL_PLUGINsimultaneously; the second check was unreachable dead code - Version bump: 1.3.0 1.4.0
1.3.0
- Maintenance: Version bump to 1.3.0
- Compatibility: Tested up to WordPress 6.9
- New: Multi-select filters now support AND/OR relation modes
- Enhancement: Quick filters now apply instantly via AJAX (no Apply button)
- Fix: Removed duplicated uninstall cleanup blocks (cache/meta/transient)
- Fix: Aligned cache post type source with role_settings[enabled_post_types] and backward-compatible fallback
- Fix: Removed duplicate initializeLabelEvents() call in admin JavaScript
1.2.0
- New: Multi-Select Filter Mode – Toggle between single and multiple label selection in quick filters
- New: Multi-select mode uses AND logic – filter posts that have ALL selected labels together
- New: Apply button for multi-select – apply multiple label filters at once
- New: Visual selection indicators – green checkmarks on selected labels in multi-select mode
- New: State persistence – multi-select mode and selections maintained via URL parameters
- New: Dashboard Widgets – Create unlimited custom widgets with 5 visualization types
- New: Pie Chart visualization with interactive legend and click-to-filter functionality
- New: Donut Chart visualization with center stats display
- New: Bar Chart with horizontal/vertical orientation and multiple display modes (percentage, numeric, both)
- New: List visualization with clickable items for content filtering
- New: Stats Cards showing key metrics with click-to-filter (max 3 per row for optimal layout)
- New: Drag & Drop Label Ordering – Customize label sequence in each widget independently
- New: Click-to-Filter – Click any chart segment, bar, list item, or stat card to filter content by that label
- New: Widget Configuration – Select post type, visualization type, labels, and display options per widget
- New: “No Label” Support – Include posts without labels in widgets with custom positioning in sort order
- Enhancement: Bar charts display proportional heights based on total count with accurate pixel scaling
- Enhancement: Bar charts include left-side scale for easy value reading
- Enhancement: All default label names (including “No Label”) now use customized names from settings
- Enhancement: Widgets Settings tab with intuitive drag & drop interface for label reordering
- Enhancement: Debug mode – Console logs now only active when WP_DEBUG is enabled
- Enhancement: WordPress Coding Standards compliance for all variable naming conventions
- Fix: Label order now properly saved and persisted across page reloads
- Fix: Sortable list visibility maintained after save operations
- Fix: “No Label” positioning now respects custom order in all chart types
- Fix: Focus outlines removed from interactive chart elements for cleaner UI
- Fix: Stats cards layout limited to 3 per row for better visual balance
- Enhancement: Multi-select toggle hides “All” badge when active
- Enhancement: Toggle and Apply button only show when labels exist
- Enhancement: Vertical separators between quick filter sections for better visual organization
- Enhancement: Multi-select mode translations for all 10 supported languages
1.1.0
- New: Quick Create Label – Create new labels directly from content editor without going to settings
- New: Universal modal for label creation works in both post list and meta box
- New: Quick Create button always visible, even when no labels exist yet
- New: Post type names translation – Post types (Posts, Pages, Products, etc.) now display in plugin’s language for all 10 supported languages
- Enhancement: Streamlined workflow for content organization
- Enhancement: Auto-assign option when creating labels from content
- Enhancement: Improved multilingual support with custom post type name mapping
- Enhancement: Direct database queries for real-time counters to ensure accuracy on production sites
- Enhancement: Debounced counter updates to prevent multiple simultaneous requests
- Fix: Post type names now consistent with plugin language settings in all admin pages
- Fix: Real-time counter accuracy on live sites with persistent cache systems (Redis, Memcached)
- Fix: Counter increments now properly synchronized across multiple UI contexts (table, inline, metabox)
- Fix: Dropdown state properly restored after closing Quick Create modal without creating label
- Fix: PHPCS compliance for intentional direct database queries in counter calculations
1.0.1
- Fix: Added index.php files to all directories to prevent directory listing on misconfigured servers
- Fix: Replaced wp_redirect() with wp_safe_redirect() for enhanced security
- Fix: Added plugin prefix to all global variables in admin-page.php and uninstall.php to comply with WordPress Coding Standards
- Fix: Renamed helper functions cl__() and cl_e() to redshape_easylabels_cl__() and redshape_easylabels_cl_e() for proper namespacing
- Fix: Bulk action “Apply label” now correctly applies labels to selected posts
- Fix: Metabox label display – labels now show correctly with name and color immediately after assignment
- Fix: Metabox label removal – resolved permission errors when removing labels without page refresh
- Fix: Dropdown refresh – label dropdown now correctly updates after adding or removing labels in metabox
- Fix: Notes auto-save – each note field now has independent timeout to prevent data loss when editing multiple notes
- Fix: Notes persistence – all pending notes are now saved before page unload to prevent loss of unsaved changes
- Security: Enhanced directory protection following WordPress.org best practices
1.0.0
- First public release
- Colored labels system with automatic key generation from label name
- Customizable default labels (“All” and “No Label”)
- Custom borders for labels (5 styles: solid, dashed, dotted, double, none)
- Search field in label popup for quick label finding
- Drag & drop to reorder filters
- Real-time counts without page refresh
- Internal notes for content
- Quick filters and search
- Backup & Restore: export/import settings in JSON
- Multi-language support (10 languages: IT, EN, FR, DE, ES, RU, ZH, JA, KO, HI)
- Optimized cache system
- Granular permission management
- Custom Post Types support
- System tab with plugin information
- Smart label filtering: dropdown shows only unassigned labels
- Improved popup positioning without visual jumps
- WordPress.org compliance: all inline scripts/styles converted to wp_enqueue
- Code comments translated to English for international standards
