{"id":376106,"date":"2026-09-28T21:32:51","date_gmt":"2026-09-28T21:32:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/veridis-news-desk\/"},"modified":"2026-10-05T18:16:05","modified_gmt":"2026-10-05T18:16:05","slug":"veridis-news-desk","status":"publish","type":"plugin","link":"https:\/\/bcc.wordpress.org\/plugins\/veridis-news-desk\/","author":23574341,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.1.3","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Veridis News Desk","header_author":"Veridis","header_description":"A Veridis newsroom application inside WordPress admin.","assets_banners_color":"aeb2b2","last_updated":"2026-10-05 18:16:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/veridis.dev\/products\/news-desk\/","header_author_uri":"https:\/\/veridis.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":292,"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":"veridisdev","date":"2026-09-30 07:39:19","revision":3720564},"1.0.1":{"tag":"1.0.1","author":"veridisdev","date":"2026-10-05 17:08:04","revision":3729340},"1.0.2":{"tag":"1.0.2","author":"veridisdev","date":"2026-10-05 18:16:05","revision":3729438}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3717935,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3717935,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3717935,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3717935,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3729438,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=veridis-news-desk&vnd_view=newsroom&vnd_layout=board\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"features\":{\"networking\":false},\"login\":true,\"siteOptions\":{\"blogname\":\"Veridis News Desk \\u2014 Fictional Demo\"},\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"veridis-news-desk\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\n\\nif ( get_option( 'veridis_news_desk_playground_demo_version' ) ) {\\n\\treturn;\\n}\\n\\nif ( ! class_exists( '\\\\\\\\Veridis\\\\\\\\NewsDesk\\\\\\\\Editorial\\\\\\\\EditorialMetadataService' ) ) {\\n\\tthrow new RuntimeException( 'Veridis News Desk is not active.' );\\n}\\n\\nwp_set_current_user( 1 );\\nupdate_option( 'blogdescription', 'A fictional newsroom workspace for exploring Veridis News Desk.' );\\nupdate_option( 'timezone_string', 'UTC' );\\nupdate_option( 'date_format', 'M j, Y' );\\nupdate_option( 'time_format', 'H:i' );\\nupdate_option( 'show_avatars', 0 );\\n\\n\\\/\\\/ The relational Follow-ups table must exist before the demo services use it.\\n\\\\Veridis\\\\NewsDesk\\\\FollowUps\\\\FollowUpInstaller::install();\\n\\nfunction vnd_playground_expect( $result, string $context ) {\\n\\tif ( is_wp_error( $result ) ) {\\n\\t\\tthrow new RuntimeException( $context . ': ' . $result->get_error_message() );\\n\\t}\\n\\treturn $result;\\n}\\n\\nfunction vnd_playground_user( array $data ): int {\\n\\t$existing = username_exists( $data['user_login'] );\\n\\tif ( $existing ) {\\n\\t\\treturn (int) $existing;\\n\\t}\\n\\t$data['user_pass'] = wp_generate_password( 32, true, true );\\n\\treturn (int) vnd_playground_expect( wp_insert_user( $data ), 'Could not create demo user' );\\n}\\n\\nfunction vnd_playground_category( string $name, string $slug ): int {\\n\\t$existing = get_term_by( 'slug', $slug, 'category' );\\n\\tif ( $existing instanceof WP_Term ) {\\n\\t\\treturn (int) $existing->term_id;\\n\\t}\\n\\t$result = vnd_playground_expect( wp_insert_term( $name, 'category', array( 'slug' => $slug ) ), 'Could not create demo category' );\\n\\treturn (int) $result['term_id'];\\n}\\n\\nfunction vnd_playground_png_chunk( string $type, string $data ): string {\\n\\treturn pack( 'N', strlen( $data ) ) . $type . $data . pack( 'N', crc32( $type . $data ) );\\n}\\n\\nfunction vnd_playground_png( int $red, int $green, int $blue ): string {\\n\\t$width = 1200;\\n\\t$height = 675;\\n\\t$pixel = chr( $red ) . chr( $green ) . chr( $blue );\\n\\t$row = \\\"\\\\x00\\\" . str_repeat( $pixel, $width );\\n\\t$raw = str_repeat( $row, $height );\\n\\treturn \\\"\\\\x89PNG\\\\r\\\\n\\\\x1a\\\\n\\\"\\n\\t\\t. vnd_playground_png_chunk( 'IHDR', pack( 'NNCCCCC', $width, $height, 8, 2, 0, 0, 0 ) )\\n\\t\\t. vnd_playground_png_chunk( 'IDAT', gzcompress( $raw, 9 ) )\\n\\t\\t. vnd_playground_png_chunk( 'IEND', '' );\\n}\\n\\nfunction vnd_playground_image( string $name, string $title, array $color ): int {\\n\\t$file = wp_upload_bits( $name . '.png', null, vnd_playground_png( $color[0], $color[1], $color[2] ) );\\n\\tif ( ! empty( $file['error'] ) ) {\\n\\t\\tthrow new RuntimeException( 'Could not create demo image: ' . $file['error'] );\\n\\t}\\n\\t$attachment_id = vnd_playground_expect(\\n\\t\\twp_insert_attachment(\\n\\t\\t\\tarray(\\n\\t\\t\\t\\t'post_mime_type' => 'image\\\/png',\\n\\t\\t\\t\\t'post_title'     => $title,\\n\\t\\t\\t\\t'post_status'    => 'inherit',\\n\\t\\t\\t),\\n\\t\\t\\t$file['file']\\n\\t\\t),\\n\\t\\t'Could not register demo image'\\n\\t);\\n\\t$uploads = wp_upload_dir();\\n\\t$relative_file = ltrim( str_replace( $uploads['basedir'], '', $file['file'] ), '\\\/\\\\\\\\' );\\n\\twp_update_attachment_metadata(\\n\\t\\t$attachment_id,\\n\\t\\tarray( 'width' => 1200, 'height' => 675, 'file' => $relative_file, 'sizes' => array() )\\n\\t);\\n\\tupdate_post_meta( $attachment_id, '_wp_attachment_image_alt', $title . ' \\u2014 fictional demo illustration' );\\n\\treturn (int) $attachment_id;\\n}\\n\\nforeach ( array( 1, 2 ) as $default_id ) {\\n\\t$default = get_post( $default_id );\\n\\tif ( $default && in_array( $default->post_type, array( 'post', 'page' ), true ) ) {\\n\\t\\twp_delete_post( $default_id, true );\\n\\t}\\n}\\n\\n$users = array(\\n\\t'maya' => vnd_playground_user( array(\\n\\t\\t'user_login' => 'maya-chen',\\n\\t\\t'user_email' => 'maya.chen@example.org',\\n\\t\\t'display_name' => 'Maya Chen',\\n\\t\\t'first_name' => 'Maya',\\n\\t\\t'last_name' => 'Chen',\\n\\t\\t'role' => 'editor',\\n\\t\\t'description' => 'Fictional managing editor for the Playground demo.',\\n\\t) ),\\n\\t'jonah' => vnd_playground_user( array(\\n\\t\\t'user_login' => 'jonah-reed',\\n\\t\\t'user_email' => 'jonah.reed@example.org',\\n\\t\\t'display_name' => 'Jonah Reed',\\n\\t\\t'first_name' => 'Jonah',\\n\\t\\t'last_name' => 'Reed',\\n\\t\\t'role' => 'author',\\n\\t\\t'description' => 'Fictional infrastructure reporter for the Playground demo.',\\n\\t) ),\\n\\t'leila' => vnd_playground_user( array(\\n\\t\\t'user_login' => 'leila-morgan',\\n\\t\\t'user_email' => 'leila.morgan@example.org',\\n\\t\\t'display_name' => 'Leila Morgan',\\n\\t\\t'first_name' => 'Leila',\\n\\t\\t'last_name' => 'Morgan',\\n\\t\\t'role' => 'author',\\n\\t\\t'description' => 'Fictional public-services reporter for the Playground demo.',\\n\\t) ),\\n);\\n\\n$categories = array(\\n\\t'civic' => vnd_playground_category( 'Civic Affairs', 'demo-civic-affairs' ),\\n\\t'infrastructure' => vnd_playground_category( 'Infrastructure', 'demo-infrastructure' ),\\n\\t'policy' => vnd_playground_category( 'Public Policy', 'demo-public-policy' ),\\n\\t'services' => vnd_playground_category( 'Public Services', 'demo-public-services' ),\\n);\\n\\n$images = array(\\n\\t'blue' => vnd_playground_image( 'demo-transit-grid', 'Transit network planning graphic', array( 37, 99, 235 ) ),\\n\\t'green' => vnd_playground_image( 'demo-energy-grid', 'Energy planning graphic', array( 5, 150, 105 ) ),\\n\\t'amber' => vnd_playground_image( 'demo-recovery-grid', 'Recovery planning graphic', array( 217, 119, 6 ) ),\\n\\t'violet' => vnd_playground_image( 'demo-education-grid', 'Education facilities planning graphic', array( 124, 58, 237 ) ),\\n);\\n\\n$now = current_datetime();\\n$deadline = static function ( string $modifier, int $hour = 16, int $minute = 0 ) use ( $now ): string {\\n\\treturn $now->modify( $modifier )->setTime( $hour, $minute )->format( 'Y-m-d\\\\\\\\TH:i' );\\n};\\n$deadline_today = $now->setTime( 23, 59 )->format( 'Y-m-d\\\\\\\\TH:i' );\\n\\n$stories = array(\\n\\tarray(\\n\\t\\t'title' => 'Questions for the regional bus network redesign',\\n\\t\\t'status' => 'idea', 'wp_status' => 'draft', 'author' => 'jonah', 'assignee' => null,\\n\\t\\t'priority' => 'low', 'category' => 'infrastructure', 'deadline' => null,\\n\\t\\t'excerpt' => '', 'image' => null, 'photo_credit' => '',\\n\\t\\t'sources' => array(),\\n\\t\\t'notes' => 'Early pitch. Identify affected routes and request the consultation timetable.',\\n\\t),\\n\\tarray(\\n\\t\\t'title' => 'How the civic budget update changes neighborhood grants',\\n\\t\\t'status' => 'idea', 'wp_status' => 'draft', 'author' => 'leila', 'assignee' => 'maya',\\n\\t\\t'priority' => 'normal', 'category' => 'civic', 'deadline' => $deadline( '+5 days', 11, 0 ),\\n\\t\\t'excerpt' => 'A planned explainer will compare the revised grant timetable with the original public guidance.',\\n\\t\\t'image' => null, 'photo_credit' => '',\\n\\t\\t'sources' => array(\\n\\t\\t\\tarray( 'id' => 'budget-office', 'name' => 'Municipal budget office briefing', 'status' => 'contacted' ),\\n\\t\\t),\\n\\t\\t'notes' => 'Build a before-and-after table once the supporting schedule is available.',\\n\\t),\\n\\tarray(\\n\\t\\t'title' => 'Transit authority begins accessibility audit of central stations',\\n\\t\\t'status' => 'writing', 'wp_status' => 'draft', 'author' => 'jonah', 'assignee' => 'leila',\\n\\t\\t'priority' => 'high', 'category' => 'infrastructure', 'deadline' => $deadline( '-1 day', 15, 0 ),\\n\\t\\t'excerpt' => 'The fictional audit will review lifts, signage, platform access, and passenger assistance at twelve stations.',\\n\\t\\t'image' => 'blue', 'photo_credit' => 'Illustration: Veridis News Desk demo',\\n\\t\\t'sources' => array(\\n\\t\\t\\tarray( 'id' => 'transit-authority', 'name' => 'Regional transit authority project note', 'status' => 'confirmed' ),\\n\\t\\t\\tarray( 'id' => 'access-panel', 'name' => 'Passenger accessibility advisory panel', 'status' => 'contacted' ),\\n\\t\\t),\\n\\t\\t'notes' => 'Confirm whether the public feedback form will remain open through the full audit.',\\n\\t),\\n\\tarray(\\n\\t\\t'title' => 'Draft energy plan proposes efficiency standards for public buildings',\\n\\t\\t'status' => 'writing', 'wp_status' => 'draft', 'author' => 'leila', 'assignee' => 'jonah',\\n\\t\\t'priority' => 'urgent', 'category' => 'policy', 'deadline' => $deadline( '+1 day', 9, 30 ),\\n\\t\\t'excerpt' => 'The fictional proposal sets staged efficiency targets for offices, libraries, and community facilities.',\\n\\t\\t'image' => 'green', 'photo_credit' => 'Illustration: Veridis News Desk demo',\\n\\t\\t'sources' => array(\\n\\t\\t\\tarray( 'id' => 'energy-unit', 'name' => 'Public buildings energy unit', 'status' => 'waiting' ),\\n\\t\\t),\\n\\t\\t'notes' => 'Priority explainer. Separate mandatory standards from voluntary guidance.',\\n\\t),\\n\\tarray(\\n\\t\\t'title' => 'Flood recovery program moves into bridge inspection phase',\\n\\t\\t'status' => 'writing', 'wp_status' => 'draft', 'author' => 'jonah', 'assignee' => 'maya',\\n\\t\\t'priority' => 'normal', 'category' => 'infrastructure', 'deadline' => $deadline( '+3 days', 14, 0 ),\\n\\t\\t'excerpt' => 'Inspection teams in this fictional scenario are prioritizing crossings used by schools and emergency services.',\\n\\t\\t'image' => 'amber', 'photo_credit' => 'Illustration: Veridis News Desk demo',\\n\\t\\t'sources' => array(\\n\\t\\t\\tarray( 'id' => 'works-department', 'name' => 'Public works recovery bulletin', 'status' => 'confirmed' ),\\n\\t\\t),\\n\\t\\t'notes' => 'Ask for the criteria used to rank bridges and the expected publication date of results.',\\n\\t),\\n\\tarray(\\n\\t\\t'title' => 'Technology regulator outlines public-sector data review',\\n\\t\\t'status' => 'review', 'wp_status' => 'pending', 'author' => 'leila', 'assignee' => 'maya',\\n\\t\\t'priority' => 'high', 'category' => 'policy', 'deadline' => $deadline( '-1 day', 12, 0 ),\\n\\t\\t'excerpt' => 'A fictional review framework focuses on procurement records, retention periods, and independent oversight.',\\n\\t\\t'image' => null, 'photo_credit' => '',\\n\\t\\t'sources' => array(\\n\\t\\t\\tarray( 'id' => 'regulator-paper', 'name' => 'Technology regulator consultation paper', 'status' => 'confirmed' ),\\n\\t\\t\\tarray( 'id' => 'privacy-council', 'name' => 'Independent privacy council response', 'status' => 'confirmed' ),\\n\\t\\t),\\n\\t\\t'notes' => 'Copy edit complete; verify the definitions box before moving to Ready.',\\n\\t),\\n\\tarray(\\n\\t\\t'title' => 'County health offices test a shared appointment system',\\n\\t\\t'status' => 'review', 'wp_status' => 'pending', 'author' => 'jonah', 'assignee' => 'leila',\\n\\t\\t'priority' => 'normal', 'category' => 'services', 'deadline' => $deadline( '+2 days', 10, 0 ),\\n\\t\\t'excerpt' => '', 'image' => null, 'photo_credit' => '',\\n\\t\\t'sources' => array(\\n\\t\\t\\tarray( 'id' => 'health-admin', 'name' => 'County health administration project team', 'status' => 'contacted' ),\\n\\t\\t),\\n\\t\\t'notes' => 'Add a concise excerpt and obtain a response on accessibility testing.',\\n\\t),\\n\\tarray(\\n\\t\\t'title' => 'School renovation schedule adds ventilation and safety checks',\\n\\t\\t'status' => 'ready', 'wp_status' => 'draft', 'author' => 'leila', 'assignee' => 'maya',\\n\\t\\t'priority' => 'high', 'category' => 'services', 'deadline' => $deadline( '+1 day', 17, 0 ),\\n\\t\\t'excerpt' => 'The fictional works schedule groups ventilation, electrical, and accessibility checks into one summer program.',\\n\\t\\t'image' => 'violet', 'photo_credit' => 'Illustration: Veridis News Desk demo',\\n\\t\\t'sources' => array(\\n\\t\\t\\tarray( 'id' => 'education-facilities', 'name' => 'Education facilities program office', 'status' => 'confirmed' ),\\n\\t\\t\\tarray( 'id' => 'school-leaders', 'name' => 'School leaders working group', 'status' => 'confirmed' ),\\n\\t\\t),\\n\\t\\t'notes' => 'Editorial checks complete. Ready is an editorial state; the WordPress post remains a draft.',\\n\\t),\\n\\tarray(\\n\\t\\t'title' => 'Local councils agree a shared procurement timetable',\\n\\t\\t'status' => 'ready', 'wp_status' => 'pending', 'author' => 'jonah', 'assignee' => 'leila',\\n\\t\\t'priority' => 'urgent', 'category' => 'civic', 'deadline' => $deadline_today,\\n\\t\\t'excerpt' => 'The fictional timetable coordinates tender notices while leaving contract decisions with each council.',\\n\\t\\t'image' => 'blue', 'photo_credit' => 'Illustration: Veridis News Desk demo',\\n\\t\\t'sources' => array(\\n\\t\\t\\tarray( 'id' => 'council-secretariat', 'name' => 'Joint council secretariat minutes', 'status' => 'confirmed' ),\\n\\t\\t),\\n\\t\\t'notes' => 'Final legal wording checked. Await a human publishing decision in WordPress.',\\n\\t),\\n);\\n\\n$editorial_service = new \\\\Veridis\\\\NewsDesk\\\\Editorial\\\\EditorialMetadataService();\\n$content_service = new \\\\Veridis\\\\NewsDesk\\\\Articles\\\\ArticleContentService();\\n$post_ids = array();\\n\\nforeach ( $stories as $index => $story ) {\\n\\t$author_id = $users[ $story['author'] ];\\n\\t$published_at = $now->modify( '-' . ( $index + 2 ) . ' hours' );\\n\\t$body = '<!-- wp:paragraph --><p>' . esc_html( $story['excerpt'] ?: 'This is a fictional planning brief created only for the Veridis News Desk Playground preview.' ) . '<\\\/p><!-- \\\/wp:paragraph -->'\\n\\t\\t. '<!-- wp:heading {\\\"level\\\":2} --><h2 class=\\\"wp-block-heading\\\">Reporting checklist<\\\/h2><!-- \\\/wp:heading -->'\\n\\t\\t. '<!-- wp:list --><ul class=\\\"wp-block-list\\\"><li>Confirm the scope with the named source.<\\\/li><li>Check dates and supporting documents.<\\\/li><li>Record outstanding questions in Follow-ups.<\\\/li><\\\/ul><!-- \\\/wp:list -->'\\n\\t\\t. '<!-- wp:paragraph --><p><em>All organizations, events, and details in this preview are fictional.<\\\/em><\\\/p><!-- \\\/wp:paragraph -->';\\n\\t$post_id = vnd_playground_expect(\\n\\t\\twp_insert_post(\\n\\t\\t\\tarray(\\n\\t\\t\\t\\t'post_type' => 'post',\\n\\t\\t\\t\\t'post_status' => $story['wp_status'],\\n\\t\\t\\t\\t'post_title' => $story['title'],\\n\\t\\t\\t\\t'post_content' => $body,\\n\\t\\t\\t\\t'post_excerpt' => $story['excerpt'],\\n\\t\\t\\t\\t'post_author' => $author_id,\\n\\t\\t\\t\\t'post_category' => array( $categories[ $story['category'] ] ),\\n\\t\\t\\t\\t'post_date' => $published_at->format( 'Y-m-d H:i:s' ),\\n\\t\\t\\t\\t'post_date_gmt' => $published_at->setTimezone( new DateTimeZone( 'UTC' ) )->format( 'Y-m-d H:i:s' ),\\n\\t\\t\\t)\\n\\t\\t),\\n\\t\\t'Could not create demo story'\\n\\t);\\n\\n\\t$assignee_id = null === $story['assignee'] ? 0 : $users[ $story['assignee'] ];\\n\\t$editorial_result = $editorial_service->update(\\n\\t\\t(int) $post_id,\\n\\t\\tarray(\\n\\t\\t\\t'editorialStatus' => $story['status'],\\n\\t\\t\\t'assignedTo' => $assignee_id,\\n\\t\\t\\t'priority' => $story['priority'],\\n\\t\\t\\t'deadline' => $story['deadline'],\\n\\t\\t\\t'internalNotes' => $story['notes'],\\n\\t\\t\\t'sources' => $story['sources'],\\n\\t\\t)\\n\\t);\\n\\tvnd_playground_expect( $editorial_result, 'Could not add editorial metadata' );\\n\\n\\tif ( $story['image'] ) {\\n\\t\\tset_post_thumbnail( $post_id, $images[ $story['image'] ] );\\n\\t}\\n\\tif ( $story['photo_credit'] ) {\\n\\t\\tvnd_playground_expect(\\n\\t\\t\\t$content_service->update( (int) $post_id, array( 'photoCredit' => $story['photo_credit'] ) ),\\n\\t\\t\\t'Could not add photo credit'\\n\\t\\t);\\n\\t}\\n\\t\\\\Veridis\\\\NewsDesk\\\\Canonical\\\\ArticleIdentity::get_or_create( (int) $post_id );\\n\\t$post_ids[] = (int) $post_id;\\n}\\n\\n$followup_service = new \\\\Veridis\\\\NewsDesk\\\\FollowUps\\\\FollowUpService();\\n$followups = array(\\n\\tarray( 2, 'Request the station accessibility matrix', 'Ask for the audit criteria and a machine-readable station list.', 'leila', '-3 hours', 'open' ),\\n\\tarray( 3, 'Confirm consultation closing date', 'The project note and public notice show different dates.', 'jonah', '+1 day', 'open' ),\\n\\tarray( 4, 'Obtain bridge inspection map', 'Request a map suitable for publication and verify its reuse terms.', 'maya', '+3 days', 'open' ),\\n\\tarray( 5, 'Check retention-period definition', 'Confirm that the term is used consistently in the framework.', 'maya', 'today', 'open' ),\\n\\tarray( 6, 'Add accessibility testing response', 'Follow up with the appointment-system project team.', 'leila', null, 'open' ),\\n\\tarray( 7, 'Verify renovation totals', 'Cross-check the summary against the facilities spreadsheet.', 'maya', '-1 day', 'done' ),\\n\\tarray( 8, 'Prepare publication handoff note', 'Record the final checks without changing the WordPress post status.', 'leila', '+2 days', 'open' ),\\n);\\n\\nforeach ( $followups as $item ) {\\n\\t$due_at = null === $item[4]\\n\\t\\t? null\\n\\t\\t: ( 'today' === $item[4] ? $now->setTime( 23, 59 )->format( DATE_ATOM ) : $now->modify( $item[4] )->format( DATE_ATOM ) );\\n\\t$created = vnd_playground_expect(\\n\\t\\t$followup_service->create(\\n\\t\\t\\t$post_ids[ $item[0] ],\\n\\t\\t\\tarray(\\n\\t\\t\\t\\t'title' => $item[1],\\n\\t\\t\\t\\t'notes' => $item[2],\\n\\t\\t\\t\\t'assignedTo' => $users[ $item[3] ],\\n\\t\\t\\t\\t'dueAt' => $due_at,\\n\\t\\t\\t)\\n\\t\\t),\\n\\t\\t'Could not create demo follow-up'\\n\\t);\\n\\tif ( 'open' !== $item[5] ) {\\n\\t\\tvnd_playground_expect(\\n\\t\\t\\t$followup_service->update( (int) $created['id'], array( 'status' => $item[5] ) ),\\n\\t\\t\\t'Could not update demo follow-up'\\n\\t\\t);\\n\\t}\\n}\\n\\nupdate_option( 'veridis_news_desk_playground_demo_version', '1.0.0' );\\necho 'Veridis News Desk Playground demo created.';\\n\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3717952,"resolution":"1","location":"assets","locale":"","width":2880,"height":1253},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3717952,"resolution":"2","location":"assets","locale":"","width":2880,"height":1253},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3717952,"resolution":"3","location":"assets","locale":"","width":2880,"height":1253},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3717952,"resolution":"4","location":"assets","locale":"","width":2880,"height":1253},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3717952,"resolution":"5","location":"assets","locale":"","width":2880,"height":1253},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3717952,"resolution":"6","location":"assets","locale":"","width":2880,"height":1253},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3717952,"resolution":"7","location":"assets","locale":"","width":2880,"height":1253}},"screenshots":{"1":"Newsroom Dashboard with publishing activity, deadlines, Article Health, and follow-ups at a glance.","2":"Newsroom List for reviewing stories, assignments, priorities, deadlines, and editorial readiness.","3":"Editorial Board with stories organized across Idea, Writing, Review, and Ready to publish.","4":"Story Drawer with editorial details, sources, internal notes, follow-ups, and Article Health.","5":"Editor Mode brings assignment, deadline, priority, and workflow controls into the WordPress Block Editor.","6":"Follow-ups workspace for tracking callbacks, story developments, deadlines, and editorial revisits.","7":"New Story workflow with category, editorial status, assignee, priority, and optional deadline."}},"plugin_section":[],"plugin_tags":[46776,11916,96456,11913,8197],"plugin_category":[],"plugin_contributors":[283266],"plugin_business_model":[],"class_list":["post-376106","plugin","type-plugin","status-publish","hentry","plugin_tags-content-planning","plugin_tags-editorial-calendar","plugin_tags-editorial-workflow","plugin_tags-newsroom","plugin_tags-workflow","plugin_contributors-veridisdev","plugin_committers-veridisdev"],"banners":{"banner":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/banner-772x250.png?rev=3717935","banner_2x":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/banner-1544x500.png?rev=3717935","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/icon-128x128.png?rev=3717935","icon_2x":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/icon-256x256.png?rev=3717935","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/screenshot-1.png?rev=3717952","caption":"Newsroom Dashboard with publishing activity, deadlines, Article Health, and follow-ups at a glance."},{"src":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/screenshot-2.png?rev=3717952","caption":"Newsroom List for reviewing stories, assignments, priorities, deadlines, and editorial readiness."},{"src":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/screenshot-3.png?rev=3717952","caption":"Editorial Board with stories organized across Idea, Writing, Review, and Ready to publish."},{"src":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/screenshot-4.png?rev=3717952","caption":"Story Drawer with editorial details, sources, internal notes, follow-ups, and Article Health."},{"src":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/screenshot-5.png?rev=3717952","caption":"Editor Mode brings assignment, deadline, priority, and workflow controls into the WordPress Block Editor."},{"src":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/screenshot-6.png?rev=3717952","caption":"Follow-ups workspace for tracking callbacks, story developments, deadlines, and editorial revisits."},{"src":"https:\/\/ps.w.org\/veridis-news-desk\/assets\/screenshot-7.png?rev=3717952","caption":"New Story workflow with category, editorial status, assignee, priority, and optional deadline."}],"raw_content":"<!--section=description-->\n<p>Veridis News Desk adds a newsroom and editorial workflow layer to WordPress for teams managing stories from idea through review and publishing readiness.<\/p>\n\n<p>Plan and track stories, assign editors or writers, manage deadlines and priorities, verify sources, record follow-ups, and monitor editorial readiness without replacing the native WordPress editor.<\/p>\n\n<h4>Built for editorial teams and newsrooms<\/h4>\n\n<p>Veridis News Desk is designed for:<\/p>\n\n<ul>\n<li>Newsrooms coordinating stories across reporters and editors.<\/li>\n<li>Editorial teams managing assignments, deadlines, sources, and review stages.<\/li>\n<li>Online publications planning work from the first idea through publishing readiness.<\/li>\n<li>Multi-author WordPress sites that need a shared view of responsibility and progress.<\/li>\n<li>Content teams tracking priorities, follow-ups, and article readiness in one place.<\/li>\n<\/ul>\n\n<h4>A newsroom workflow around WordPress posts<\/h4>\n\n<p>Stories remain native WordPress posts, and teams continue writing and editing in Gutenberg. Veridis News Desk adds the planning and coordination layer around that familiar publishing process, helping teams organize editorial work before publication without replacing the WordPress editor.<\/p>\n\n<p>Editorial assignments are separate from the WordPress author or public byline. An assignee identifies the editor or writer currently responsible for moving a story forward, while the WordPress author identifies post authorship; the two roles remain distinct editorial concepts.<\/p>\n\n<p>\u201cReady to publish\u201d is an editorial workflow state. It signals that the newsroom considers a story ready for the next publishing decision, but it does not publish the post or bypass WordPress permissions, scheduling, or review.<\/p>\n\n<h4>Main editorial capabilities<\/h4>\n\n<ul>\n<li>Dashboard: See active stories, deadlines, follow-ups, and items that need editorial attention at a glance.<\/li>\n<li>Newsroom List: Search, filter, sort, and review story assignments, stages, priorities, and readiness in a focused list.<\/li>\n<li>Board \/ Kanban: Move stories through Idea, Writing, Review, and Ready to publish in a visual workflow.<\/li>\n<li>Story assignment: Give an editor or writer clear responsibility while keeping the assignment distinct from the WordPress author or byline.<\/li>\n<li>Deadlines and priorities: Set target dates, identify urgent work, and spot overdue stories.<\/li>\n<li>Editorial stages: Track each story from the initial idea through drafting, review, and publishing readiness.<\/li>\n<li>Structured source tracking: Record sources and their verification status alongside each story.<\/li>\n<li>Follow-ups: Keep callbacks, research tasks, updates, and post-publication actions connected to the relevant story.<\/li>\n<li>Article readiness: Check featured images, excerpts, source information, and photo credits before publication.<\/li>\n<li>Gutenberg Editor Mode: Review and update editorial details from the native WordPress Block Editor while working on the post.<\/li>\n<\/ul>\n\n<h4>Documentation &amp; Resources<\/h4>\n\n<ul>\n<li>Product Overview: https:\/\/veridis.dev\/products\/news-desk\/<\/li>\n<li>Documentation: https:\/\/veridis.dev\/products\/news-desk\/docs\/<\/li>\n<li>Support: https:\/\/veridis.dev\/products\/news-desk\/support\/<\/li>\n<li>Changelog: https:\/\/veridis.dev\/products\/news-desk\/changelog\/<\/li>\n<\/ul>\n\n<h4>Source Code &amp; Build Instructions<\/h4>\n\n<p>Veridis News Desk includes compiled and minified JavaScript and CSS bundles in <code>build\/assets\/<\/code>. The corresponding human-readable React, TypeScript, and CSS source code is publicly accessible at:\nhttps:\/\/github.com\/Veridis-Dev\/veridis-news-desk<\/p>\n\n<p>Production asset mapping:\n* <code>src\/AdminApp\/main.tsx<\/code> -&gt; <code>build\/assets\/app-*.js<\/code> and <code>build\/assets\/app-*.css<\/code> (Newsroom React workspace)\n* <code>src\/EditorApp\/main.ts<\/code> -&gt; <code>build\/assets\/editor-*.js<\/code> and <code>build\/assets\/editor-*.css<\/code> (Block Editor sidebar)\n* <code>build\/manifest.json<\/code> maps hashed Vite asset filenames for WordPress runtime loading<\/p>\n\n<p>Building from source requires Node.js (&gt;=22.12.0) and npm:<\/p>\n\n<ol>\n<li>Clone repository: git clone https:\/\/github.com\/Veridis-Dev\/veridis-news-desk.git<\/li>\n<li>Install dependencies: npm ci<\/li>\n<li>Generate production bundles: npm run build<\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>veridis-news-desk<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install the ZIP file via WordPress Admin Plugins -&gt; Add New -&gt; Upload Plugin.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Access the newsroom interface via the 'Veridis News' menu item in the WordPress admin sidebar.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20veridis%20news%20desk%20replace%20the%20wordpress%20editor%3F\"><h3>Does Veridis News Desk replace the WordPress editor?<\/h3><\/dt>\n<dd><p>No. It works alongside Gutenberg and standard WordPress publishing. The Newsroom organizes editorial planning and coordination, while the native WordPress editor remains the place where teams write and edit post content.<\/p><\/dd>\n<dt id=\"does%20ready%20to%20publish%20publish%20the%20post%3F\"><h3>Does Ready to publish publish the post?<\/h3><\/dt>\n<dd><p>No. Ready to publish is an editorial workflow state only. Publishing and scheduling remain controlled by WordPress and the user's existing permissions.<\/p><\/dd>\n<dt id=\"is%20the%20story%20assignee%20the%20same%20as%20the%20wordpress%20author%3F\"><h3>Is the story assignee the same as the WordPress author?<\/h3><\/dt>\n<dd><p>No. The assignee identifies who is currently responsible for the editorial work. The WordPress author identifies post authorship and the public byline; the two roles are distinct.<\/p><\/dd>\n<dt id=\"does%20it%20modify%20existing%20posts%3F\"><h3>Does it modify existing posts?<\/h3><\/dt>\n<dd><p>No. Veridis News Desk does not replace or rewrite your article title or body content. It adds editorial workflow information around your existing WordPress posts.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20data%20when%20the%20plugin%20is%20removed%3F\"><h3>What happens to data when the plugin is removed?<\/h3><\/dt>\n<dd><p>By default, Veridis News Desk preserves all editorial metadata, custom database tables, and settings upon plugin deletion. If you prefer a complete cleanup, you can disable the \"Preserve data on uninstall\" option in Settings prior to deleting the plugin.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Improved mobile responsiveness across editorial forms, drawers, sources, settings, and action groups.<\/li>\n<li>Fixed narrow-screen overflow in editorial details and related controls.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed mobile dashboard story rows collapsing at narrow screen widths.<\/li>\n<li>Improved responsive layout for story metadata and badges in the WordPress admin.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Added a newsroom Dashboard with publication totals, urgent work, deadline watch, Article Health, and Follow-ups at a glance.<\/li>\n<li>Added Newsroom List and Board views with search, filters, sorting, pagination, and compact story metadata.<\/li>\n<li>Added editorial statuses, assignees, priorities, deadlines, and clear overdue and due-today views.<\/li>\n<li>Added an explicit assignment workflow: ideas may remain unassigned, while active editorial work requires a responsible user.<\/li>\n<li>Separated the public WordPress author from the current workflow assignee; the first assignee establishes the byline and later reassignment preserves it.<\/li>\n<li>Added a Story Drawer for reviewing and editing editorial details, sources, Follow-ups, and Article Health actions.<\/li>\n<li>Added Article Health checks for featured images, excerpts, sources, and photo credits, with workflow-aware fixes.<\/li>\n<li>Added Follow-ups for tracking callbacks, updates, deadlines, status, and responsibility for each story.<\/li>\n<li>Added a focused Editor Mode with editorial controls, save protection, and a reliable return to the previous Newsroom context.<\/li>\n<li>Improved first-run and filtered empty states with clear paths to create the first story.<\/li>\n<li>Added English and Romanian interface localization through the WordPress user locale.<\/li>\n<li>Integrated access and assignee eligibility with standard WordPress roles and capabilities.<\/li>\n<li>Improved narrower-width Board navigation, metadata labels, validation timing, subdirectory URL handling, and other release-candidate interface details.<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>Canonical article model foundation.<\/li>\n<li>Settings and data-retention controls.<\/li>\n<li>Newsroom, editorial workflow, board, Follow-ups, Article Health, and Editor Mode foundations.<\/li>\n<\/ul>","raw_excerpt":"A newsroom and editorial workflow for managing stories, assignments, deadlines, sources, follow-ups, and publishing readiness in WordPress.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/376106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=376106"}],"author":[{"embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/veridisdev"}],"wp:attachment":[{"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=376106"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=376106"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=376106"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=376106"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=376106"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bcc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=376106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}