{"id":382561,"date":"2026-10-18T07:24:50","date_gmt":"2026-10-18T07:24:50","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sapphireit-editorial-workflow\/"},"modified":"2026-10-18T08:02:13","modified_gmt":"2026-10-18T08:02:13","slug":"sapphireit-editorial-workflow","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/sapphireit-editorial-workflow\/","author":21092833,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.3","requires":"6.8","requires_php":"7.4","requires_plugins":null,"header_name":"SapphireIT Editorial Workflow","header_author":"SapphireIT","header_description":"Adds an editorial approval workflow (Draft, Writing, Review, Needs Changes, Approved, Published) with reviewers, due dates, comments and activity history to posts, pages and custom post types.","assets_banners_color":"2f489c","last_updated":"2026-10-18 08:02:13","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":93,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"sapphireit","date":"2026-10-18 08:02:13","revision":3752724}},"upgrade_notice":{"1.0.0":"<p>First release. Activation creates the activity table and grants the workflow\ncapabilities to your existing roles; no existing content is modified.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3752666,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3752666,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3752724,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3752666,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3752666,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3752705,"resolution":"1","location":"assets","locale":"","width":1280,"height":960},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3752705,"resolution":"2","location":"assets","locale":"","width":1280,"height":960},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3752705,"resolution":"3","location":"assets","locale":"","width":1280,"height":960},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3752705,"resolution":"4","location":"assets","locale":"","width":1280,"height":960},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3752705,"resolution":"5","location":"assets","locale":"","width":1280,"height":960},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3752705,"resolution":"6","location":"assets","locale":"","width":1280,"height":960}},"screenshots":{"1":"The workflow sidebar in the block editor: status, reviewer, due date and the\ntransitions you are actually allowed to make.","2":"The activity timeline: every change, who made it and when.","3":"The workflow box in the classic editor.","4":"The admin dashboard, with server-side filtering, sorting and search.","5":"Bulk actions across a selection of posts.","6":"The settings screen, for choosing which post types have a workflow."}},"plugin_section":[],"plugin_tags":[277159,261154,96456,7143,6266],"plugin_category":[],"plugin_contributors":[284151],"plugin_business_model":[],"class_list":["post-382561","plugin","type-plugin","status-publish","hentry","plugin_tags-approval-workflow","plugin_tags-content-review","plugin_tags-editorial-workflow","plugin_tags-publishing","plugin_tags-reviewer","plugin_contributors-sapphireit","plugin_committers-sapphireit"],"banners":{"banner":"https:\/\/ps.w.org\/sapphireit-editorial-workflow\/assets\/banner-772x250.png?rev=3752666","banner_2x":"https:\/\/ps.w.org\/sapphireit-editorial-workflow\/assets\/banner-1544x500.png?rev=3752666","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/sapphireit-editorial-workflow\/assets\/icon.svg?rev=3752724","icon":"https:\/\/ps.w.org\/sapphireit-editorial-workflow\/assets\/icon.svg?rev=3752724","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sapphireit-editorial-workflow\/assets\/screenshot-1.png?rev=3752705","caption":"The workflow sidebar in the block editor: status, reviewer, due date and the\ntransitions you are actually allowed to make."},{"src":"https:\/\/ps.w.org\/sapphireit-editorial-workflow\/assets\/screenshot-2.png?rev=3752705","caption":"The activity timeline: every change, who made it and when."},{"src":"https:\/\/ps.w.org\/sapphireit-editorial-workflow\/assets\/screenshot-3.png?rev=3752705","caption":"The workflow box in the classic editor."},{"src":"https:\/\/ps.w.org\/sapphireit-editorial-workflow\/assets\/screenshot-4.png?rev=3752705","caption":"The admin dashboard, with server-side filtering, sorting and search."},{"src":"https:\/\/ps.w.org\/sapphireit-editorial-workflow\/assets\/screenshot-5.png?rev=3752705","caption":"Bulk actions across a selection of posts."},{"src":"https:\/\/ps.w.org\/sapphireit-editorial-workflow\/assets\/screenshot-6.png?rev=3752705","caption":"The settings screen, for choosing which post types have a workflow."}],"raw_content":"<!--section=description-->\n<p>SapphireIT Editorial Workflow adds a real editorial process on top of the posts\nyou already have. Every managed post gets a workflow status, an assigned\nreviewer, a due date, workflow comments and a complete activity history \u2014\nmanaged from a Gutenberg sidebar, a classic editor meta box and an admin\ndashboard.<\/p>\n\n<p><strong>Six statuses, one clear path:<\/strong> Draft \u2192 Writing \u2192 Review \u2192 Needs Changes \u2192\nApproved \u2192 Published, with explicit paths for sending content back and for\nre-editing something that is already live.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>A real state machine.<\/strong> Only the moves in the transition graph are possible.\nNobody jumps a draft straight to approved, whatever their role.<\/li>\n<li><strong>Server-side enforcement.<\/strong> Every transition is re-checked in PHP against the\ngraph, the capability map and the post's current stored status. The editor UI\nshows you what you can do; it does not decide it.<\/li>\n<li><strong>Six dedicated capabilities<\/strong>, granted to roles at activation and editable\nwith any capability-management plugin. No hard-coded role checks.<\/li>\n<li><strong>Reviewer assignment and due dates<\/strong>, with an \"overdue only\" filter computed\nin your site's timezone.<\/li>\n<li><strong>Workflow comments<\/strong> that stay in the editorial log and never appear on the\nfront end.<\/li>\n<li><strong>A complete activity history<\/strong> in a dedicated indexed table: who changed\nwhat, when.<\/li>\n<li><strong>Conflict protection.<\/strong> If two editors act on the same post at once, the\nsecond one is told the post moved instead of silently overwriting the first.<\/li>\n<li><strong>An admin dashboard<\/strong> with server-side search, filtering, sorting and\npagination, row actions, and bulk actions across up to 100 posts.<\/li>\n<li><strong>A documented REST API<\/strong> under <code>sit-cwm\/v1<\/code>. Everything the UI does is an\nendpoint you can call yourself.<\/li>\n<li><strong>Works with what you have.<\/strong> Posts, pages and any custom post type, through\npost meta. No custom post type of its own, and nothing to migrate.<\/li>\n<\/ul>\n\n<h4>What it deliberately does not do<\/h4>\n\n<p>Being straight about this matters more than a longer feature list:<\/p>\n\n<ul>\n<li><strong>It does not send email.<\/strong> Assigning a reviewer notifies nobody in version\n1.0.<\/li>\n<li><strong>It does not publish anything.<\/strong> Reaching the \"Published\" workflow status\nrecords that the editorial process finished \u2014 it does not touch the\nWordPress post status. Publishing stays a deliberate action by a human. The\ntwo are separate fields on purpose, so that scheduled posts keep their\nschedule and live content can be re-edited without being unpublished.<\/li>\n<li>No Slack, no editorial calendar, no multiple workflows, no rules engine. Those\nare on the roadmap, not hidden behind an upsell in this plugin.<\/li>\n<\/ul>\n\n<h4>Who can do what<\/h4>\n\n<ul>\n<li>Draft, Writing, Review \u2014 <code>sit_cwm_change_workflow<\/code><\/li>\n<li>Needs Changes \u2014 <code>sit_cwm_review_content<\/code><\/li>\n<li>Approved \u2014 <code>sit_cwm_approve_content<\/code><\/li>\n<li>Published \u2014 <code>sit_cwm_approve_content<\/code> plus WordPress <code>publish_post<\/code><\/li>\n<\/ul>\n\n<p>Every change also requires WordPress' own permission to edit that specific post.\nBy default administrators get everything, editors can review and approve,\nauthors and contributors can move their own content up to Review, and\nsubscribers get nothing.<\/p>\n\n<h4>Developers<\/h4>\n\n<p>The plugin is built as a thin React client over a PHP workflow engine, and fires\nactions and filters at every lifecycle point (<code>sit_cwm_status_changed<\/code>,\n    sit_cwm_can_transition, <code>sit_cwm_transition_map<\/code> and more) so it can be\nextended without editing its files.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>The plugin stores, in your own database: the user ID of whoever makes each\nworkflow change, the user ID of the assigned reviewer, the text of workflow\ncomments and the time of each action. This information is visible to users who\nhave the <code>sit_cwm_view_activity<\/code> capability. Nothing is sent off your site.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/sapphireit-editorial-workflow\/<\/code>, or\ninstall it through <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Activate it through the <strong>Plugins<\/strong> menu. Activation creates the activity\ntable and grants the workflow capabilities to your existing roles.<\/li>\n<li>Go to <strong>Editorial Workflow \u2192 Settings<\/strong> and choose which post types the\nworkflow applies to. Posts and pages are enabled by default.<\/li>\n<li>Open any post in the block editor and click the <strong>Editorial Workflow<\/strong> icon in\nthe top-right toolbar. In the classic editor, use the <strong>Editorial Workflow<\/strong>\nbox in the sidebar column instead.<\/li>\n<\/ol>\n\n<p>Deactivating or deleting the plugin keeps your workflow data by default. To\nremove everything when the plugin is deleted, tick <strong>Delete all workflow data\nwhen the plugin is deleted<\/strong> under <strong>Editorial Workflow \u2192 Settings<\/strong> first;\ndeleting the plugin then removes the activity table, the plugin's post meta, its\noptions and its capabilities.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20reaching%20%22published%22%20publish%20my%20post%3F\"><h3>Does reaching \"Published\" publish my post?<\/h3><\/dt>\n<dd><p>No, and that is deliberate. The workflow status and the WordPress post status\nare separate fields. Marking a post as Published in the workflow records that\nthe editorial process is complete; a human still hits Publish.<\/p>\n\n<p>Keeping them apart is what lets a scheduled post keep its schedule while it is\nbeing approved, and lets an already-live article go back through a round of\nedits without disappearing from your site.<\/p><\/dd>\n<dt id=\"does%20it%20send%20email%20when%20i%20assign%20a%20reviewer%3F\"><h3>Does it send email when I assign a reviewer?<\/h3><\/dt>\n<dd><p>Not in version 1.0. Notifications are on the roadmap. The\n    sit_cwm_reviewer_assigned action fires on every assignment, so a few lines in\na site plugin can send whatever you need today.<\/p><\/dd>\n<dt id=\"can%20i%20change%20who%20is%20allowed%20to%20approve%20content%3F\"><h3>Can I change who is allowed to approve content?<\/h3><\/dt>\n<dd><p>Yes. The plugin adds six ordinary WordPress capabilities (<code>sit_cwm_*<\/code>), so any\nrole or capability manager can move them around. For finer rules \u2014 \"only the\nassigned reviewer may approve\", say \u2014 the <code>sit_cwm_can_transition<\/code> filter has\nthe final word on every decision.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20statuses%20or%20the%20order%20they%20go%20in%3F\"><h3>Can I change the statuses or the order they go in?<\/h3><\/dt>\n<dd><p>The <code>sit_cwm_statuses<\/code> and <code>sit_cwm_transition_map<\/code> filters replace the status\nregistry and the transition graph. Both results are validated, so a mistake in\nyour code cannot leave the plugin in a broken state. There is no settings screen\nfor editing statuses or building multiple workflows in version 1.0.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20custom%20post%20types%3F\"><h3>Does it work with custom post types?<\/h3><\/dt>\n<dd><p>Yes. Any editorial content type (one with an admin UI, REST API support and the\neditor feature) can be enabled in the settings. Back-office types such as shop\norders and coupons are not offered; developers can change the list with the\n    sit_cwm_available_post_types filter. The plugin uses post meta, so there is\nnothing to migrate and nothing to convert.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20classic%20editor%3F\"><h3>Does it work with the classic editor?<\/h3><\/dt>\n<dd><p>Yes. In the classic editor the workflow controls appear in an <strong>Editorial\nWorkflow<\/strong> box in the sidebar column. Changes there save immediately,\nindependently of the Update button.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20deactivate%20it%3F\"><h3>What happens to my data if I deactivate it?<\/h3><\/dt>\n<dd><p>Deactivating changes nothing \u2014 your statuses, reviewers, due dates and history\nstay. Deleting the plugin keeps them too, unless you have ticked <strong>Delete all\nworkflow data when the plugin is deleted<\/strong> under <strong>Editorial Workflow \u2192\nSettings<\/strong>. With that option on, deleting the plugin permanently removes the\nactivity table, workflow post meta, settings and capabilities.<\/p><\/dd>\n<dt id=\"where%20are%20the%20workflow%20comments%3F\"><h3>Where are the workflow comments?<\/h3><\/dt>\n<dd><p>In the plugin's own activity table, shown in the timeline in the sidebar (or\nthe classic editor box). They are editorial notes, so they never appear on the front end and are not mixed in\nwith your readers' comments.<\/p><\/dd>\n<dt id=\"is%20there%20an%20api%3F\"><h3>Is there an API?<\/h3><\/dt>\n<dd><p>Yes, at <code>\/wp-json\/sit-cwm\/v1\/<\/code>. Eight documented endpoints, all authenticated,\nall with JSON schemas, and usable with application passwords.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20contact%20any%20external%20service%3F\"><h3>Does the plugin contact any external service?<\/h3><\/dt>\n<dd><p>No. It makes no remote requests, loads nothing from a CDN, sets no cookies of\nits own and collects no usage data. Everything stays in your WordPress\ndatabase.<\/p><\/dd>\n<dt id=\"where%20is%20the%20source%20code%20for%20the%20javascript%3F\"><h3>Where is the source code for the JavaScript?<\/h3><\/dt>\n<dd><p>The editor sidebar, classic editor box and dashboard ship as compiled files in\n    assets\/build\/. The human-readable React source is in the <code>src\/<\/code> directory of\nthe public repository at\nhttps:\/\/github.com\/rshalihin\/sapphireit-editorial-workflow. Run <code>npm install<\/code>\nand then <code>npm run build<\/code> to rebuild the compiled files.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Six-status editorial workflow with a validated transition graph and rollback\npaths.<\/li>\n<li>Server-side transition and permission enforcement; the UI never decides.<\/li>\n<li>Six dedicated capabilities with sensible default role grants.<\/li>\n<li>Reviewer assignment, due dates and an overdue filter.<\/li>\n<li>Workflow comments and a full activity history in a dedicated indexed table.<\/li>\n<li>Optimistic concurrency: conflicting edits are rejected, not silently merged.<\/li>\n<li>Gutenberg sidebar with an activity timeline.<\/li>\n<li>Classic editor support: the same workflow controls in an Editorial Workflow\nmeta box.<\/li>\n<li>Admin dashboard with server-side filtering, sorting, pagination, row actions\nand bulk actions.<\/li>\n<li>Settings screen for choosing workflow-enabled post types.<\/li>\n<li>REST API under <code>sit-cwm\/v1<\/code>, with actions and filters for extending the\nplugin.<\/li>\n<\/ul>","raw_excerpt":"Editorial approval workflow for posts, pages and custom post types: statuses, reviewers, due dates, comments and a full activity history.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/382561","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=382561"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sapphireit"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=382561"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=382561"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=382561"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=382561"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=382561"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=382561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}