{"id":1212,"date":"2026-04-20T15:00:00","date_gmt":"2026-04-20T15:00:00","guid":{"rendered":"https:\/\/computercoursesonline.com\/?p=1212"},"modified":"2026-04-30T21:16:00","modified_gmt":"2026-04-30T21:16:00","slug":"whats-in-wordpress-7-0","status":"publish","type":"post","link":"https:\/\/computercoursesonline.com\/index.php\/2026\/04\/20\/whats-in-wordpress-7-0\/","title":{"rendered":"What\u2019s in WordPress 7.0"},"content":{"rendered":"
WordPress 7.0 brings several major changes for developers, site owners, and content teams.<\/p>\n
This release adds real-time collaboration, extends the Gutenberg editor<\/a>, introduces new AI infrastructure, and changes a few long-standing WordPress conventions.<\/p>\n Here\u2019s what is coming and what to prepare for.<\/p>\n The centerpiece of WordPress 7.0 is real-time collaboration (RTC)<\/a><\/strong>.<\/p>\n Multiple users can edit the same post simultaneously, with changes syncing instantly across all editors. You\u2019ll see cursors, selections, and edits from other users in real time.<\/p>\n It handles conflict resolution gracefully so when two people edit the same paragraph, changes merge intelligently rather than overwriting each other.<\/p>\n No.<\/strong><\/p>\n For security and compatibility reasons, real-time collaboration is opt-in<\/strong> rather than enabled by default. Site administrators must explicitly enable it for their sites.<\/p>\n For multisite networks, network administrators can control whether real-time collaboration is available to site administrators through network settings.<\/p>\n Once enabled, you\u2019ll see collaboration features appear in the block editor. You\u2019ll need at least two user accounts with editing permissions to test the collaborative features properly.<\/p>\n WordPress 7.0 removes a major barrier for developers who want to build blocks without a JavaScript-heavy workflow.<\/p>\n You can now register blocks using only PHP<\/strong>, without needing React, Node.js, or a build toolchain. This removes a major barrier for traditional PHP WordPress developers who have avoided block development because of the JavaScript complexity.<\/p>\n With PHP-only block registration, you write your block in PHP and WordPress automatically generates the inspector controls (the settings panel in the editor sidebar) for you. This is perfect for blocks that don\u2019t need complex client-side interactivity.<\/p>\n Here\u2019s a basic example of registering a block with PHP:<\/p>\n For more complex blocks, you can still mix PHP registration with JavaScript for the editor interface. But for simple content blocks, PHP-only registration means faster development, lighter plugins, and no build toolchain headaches.<\/p>\n WordPress 7.0 introduces the Connectors API<\/a><\/strong>.<\/p>\n This is a new framework for registering and managing connections to external services, providing standardized API key management, provider discovery, and admin UI for configuring services.<\/p>\n The Connectors API works hand-in-hand with the built-in AI Client. It automatically discovers AI providers from the WP AI Client registry and creates connectors with proper metadata. Plugins using the AI Client do not need to handle credentials directly. They describe what they need, and WordPress routes requests to configured providers.<\/p>\n Plugins can register custom connectors or override existing ones using the Here\u2019s a basic example of registering a custom connector:<\/p>\n The API provides three main functions for developers:<\/p>\n API keys can be provided via environment variables, PHP constants, or database settings.<\/p>\n WordPress already ships with an example Connectors implementation, which you can find under Settings > Connectors<\/strong> in the admin.<\/p>\n This API is designed to expand beyond AI providers to support payment gateways, social media integrations, and other external services in future releases. That should make it easier for more plugins to plug into the same connection model.<\/p>\n WordPress 7.0 includes a built-in AI Client that provides a provider-agnostic PHP API for plugins to send prompts to AI models and receive results through a consistent interface. This is the engine that powers AI features across WordPress, working hand-in-hand with the Connectors API.<\/p>\n The AI Client handles provider communication, model selection, and response normalization. Your plugin describes what it needs and how it needs it. WordPress handles routing the request to a suitable model from a provider the site owner has configured.<\/p>\n Every interaction starts with the The AI Client supports multiple modalities, for example, image generation:<\/p>\n Before showing AI-powered UI, check whether the feature can work:<\/p>\n These checks use deterministic logic to match the builder\u2019s configuration against the capabilities of available models. They don\u2019t make API calls, so they\u2019re fast and cost nothing. If you want a related developer-facing example of how WordPress is exposing structured capabilities, the WordPress Abilities API<\/a> is a useful companion.<\/p>\n Keep in mind that the AI Client architecture consists of two layers<\/strong>:<\/p>\n WordPress Core doesn\u2019t bundle any AI providers directly. Instead, they\u2019re developed and maintained as plugins, which allows for more flexible and rapid iteration. The WordPress project has developed three initial flagship implementations:<\/p>\n For developers who have been using the WordPress 7.0 breaks with tradition.<\/strong><\/p>\n There will be no \u201cTwenty Twenty-Six\u201d<\/strong> default theme. The focus shifts to improving existing block themes like Twenty Twenty-Five through the Site Editor and Phase 3 collaboration tools.<\/p>\n This change signals a maturing approach to WordPress theming. The goal is to show users that you don\u2019t need a new theme every year. You can evolve the one you have using the Site Editor<\/a>.<\/p>\n This reflects a broader trend in WordPress development. Moving from rigid, theme-controlled designs to flexible, user-customizable layouts. With the Site Editor, users can modify templates, create custom patterns, and adjust styles without touching code. A new default theme each year becomes less necessary when users have these tools at their fingertips.<\/p>\n Real-time collaboration introduces significant compatibility requirements that plugin and theme developers must address.<\/p>\n WordPress 7.0 raises the minimum supported PHP version to 7.4, dropping support for PHP 7.2 and 7.3. This change is necessary to support modern libraries required for collaboration features and AI APIs.<\/p>\n The WordPress core team recommends PHP 8.2 or 8.3 for best performance and security. If your sites run PHP 7.2 or 7.3, you need to upgrade before installing WordPress 7.0. Test the upgrade thoroughly in a staging environment<\/a> first. Check for deprecated functions, incompatible plugins, and theme issues.<\/p>\n Here\u2019s how to check your current PHP version and prepare for the upgrade:<\/p>\n Most hosting providers offer PHP version selection in their control panels. If you\u2019re on shared hosting, check your provider\u2019s documentation for how to switch PHP versions. Some hosts may automatically update sites to compatible versions, but it\u2019s better to test first.<\/p>\n This is likely the biggest compatibility issue in WordPress 7.0 for many existing plugins.<\/p>\n The real-time collaboration feature is automatically disabled when classic meta boxes are present on a post<\/strong>. Since the system can\u2019t sync classic meta box content, it turns off collaboration entirely when meta boxes are detected.<\/p>\n This affects thousands of plugins that still use the traditional meta box approach for custom fields and settings. If your plugin adds meta boxes, users won\u2019t be able to use real-time collaboration on posts where those meta boxes appear.<\/p>\n The solution is to migrate from meta boxes to registered post meta with Here\u2019s an example of migrating from a traditional meta box to registered post meta:<\/p>\n The Block Editor Handbook has a complete migration guide<\/a> that walks through the process in detail.<\/p>\n Beyond meta boxes, plugins need to follow specific patterns to work correctly with real-time collaboration. Custom meta field interfaces must use the WordPress data store via Here\u2019s the difference between the wrong approach (local state) and the right approach (useSelect):<\/p>\n The key difference is that Blocks with side effects on insertion need special consideration too. Since block content syncs immediately to all collaborators, auto-opening modals or triggering animations on insertion will affect everyone editing the post. The recommendation is to use placeholders with explicit user actions instead of automatic behaviors.<\/p>\n WordPress 7.0 represents a bold step forward for the platform.<\/p>\n Real-time collaboration transforms WordPress from a tool for an individual blogger into a platform for a team. The architectural changes required to make this work will have ripple effects through the plugin and theme ecosystem, but the result is a more modern, capable content management system.<\/p>\n As you prepare for WordPress 7.0, focus on meta box migration first<\/strong>. For many plugins, that is the most immediate compatibility issue. Then test your interfaces in collaborative mode<\/strong> to catch synchronization problems.<\/p>\n These extra efforts now will ensure your site works seamlessly when it\u2019s finally used in WordPress 7.0.<\/p>\n <\/p>\n The post What’s in WordPress 7.0<\/a> appeared first on Hongkiat<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":" WordPress 7.0 brings several major changes for developers, site owners, and content teams. This release adds real-time collaboration, extends the Gutenberg editor, introduces new AI infrastructure, and changes a few long-standing WordPress conventions. Here\u2019s what is coming and what to prepare for. 1. Real-time collaboration in the block editor The centerpiece of WordPress 7.0 is…<\/p>\n","protected":false},"author":1,"featured_media":1214,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[15],"tags":[],"_links":{"self":[{"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/posts\/1212"}],"collection":[{"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/comments?post=1212"}],"version-history":[{"count":3,"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/posts\/1212\/revisions"}],"predecessor-version":[{"id":1218,"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/posts\/1212\/revisions\/1218"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/media\/1214"}],"wp:attachment":[{"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/media?parent=1212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/categories?post=1212"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/computercoursesonline.com\/index.php\/wp-json\/wp\/v2\/tags?post=1212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}1. Real-time collaboration in the block editor<\/h2>\n
Is it enabled by default?<\/h3>\n
\n

\n <\/figure>\n
\n <\/figure>\n2. PHP-only block registration<\/h2>\n
\r\nadd_action( 'init', function() {\r\n register_block_type( __DIR__ . '\/build\/my-block', array(\r\n 'api_version' => 3,\r\n 'title' => __( 'My Custom Block', 'my-plugin' ),\r\n 'description' => __( 'A simple block registered with PHP.', 'my-plugin' ),\r\n 'category' => 'widgets',\r\n 'icon' => 'smiley',\r\n 'supports' => array(\r\n 'html' => false,\r\n ),\r\n 'attributes' => array(\r\n 'content' => array(\r\n 'type' => 'string',\r\n 'default' => '',\r\n ),\r\n 'alignment' => array(\r\n 'type' => 'string',\r\n 'default' => 'none',\r\n ),\r\n ),\r\n 'render_callback' => function( $attributes, $content, $block ) {\r\n $classes = array( 'my-custom-block' );\r\n if ( ! empty( $attributes['alignment'] ) ) {\r\n $classes[] = 'has-text-align-' . $attributes['alignment'];\r\n }\r\n \r\n return sprintf(\r\n '<div class=\"%s\">%s<\/div>',\r\n esc_attr( implode( ' ', $classes ) ),\r\n wp_kses_post( $attributes['content'] )\r\n );\r\n },\r\n ) );\r\n} );\r\n<\/pre>\n3. Introducing the Connectors API<\/h2>\n
wp_connectors_init<\/code> action hook.<\/p>\n\r\nadd_action( 'wp_connectors_init', function ( $registry ) {\r\n $connector = array(\r\n 'name' => 'My Custom Service',\r\n 'description' => 'Connect to my custom API service.',\r\n 'type' => 'custom_provider',\r\n 'authentication' => array(\r\n 'method' => 'api_key',\r\n 'credentials_url' => 'https:\/\/example.com\/api-keys',\r\n 'setting_name' => 'connectors_custom_my_service_api_key',\r\n ),\r\n 'plugin' => array(\r\n 'file' => 'my-custom-service\/plugin.php',\r\n ),\r\n );\r\n \r\n $registry->register( 'my_custom_service', $connector );\r\n} );\r\n<\/pre>\n\r\n\/\/ Check if a connector is registered\r\nif ( wp_is_connector_registered( 'anthropic' ) ) {\r\n \/\/ The Anthropic connector is available\r\n}\r\n\r\n\/\/ Get a single connector's data\r\n$connector = wp_get_connector( 'anthropic' );\r\nif ( $connector ) {\r\n echo $connector['name']; \/\/ 'Anthropic'\r\n}\r\n\r\n\/\/ Get all registered connectors\r\n$connectors = wp_get_connectors();\r\nforeach ( $connectors as $id => $connector ) {\r\n printf( '%s: %s', $connector['name'], $connector['description'] );\r\n}\r\n<\/pre>\n
\n <\/figure>\n4. Unified AI interface<\/h2>\n
wp_ai_client_prompt()<\/code> function:<\/p>\n\r\n\/\/ Basic text generation\r\n$text = wp_ai_client_prompt( 'What is the capital of France?' )\r\n ->using_temperature( 0.8 )\r\n ->generate_text();\r\n\r\nif ( is_wp_error( $text ) ) {\r\n \/\/ Handle error\r\n return;\r\n}\r\n\r\necho wp_kses_post( $text );\r\n<\/pre>\n\r\n$image_file = wp_ai_client_prompt( 'A futuristic WordPress logo in neon style' )\r\n ->generate_image();\r\n\r\nif ( is_wp_error( $image_file ) ) {\r\n return;\r\n}\r\n\r\necho '<img src=\"' . esc_url( $image_file->getDataUri() ) . '\" alt=\"\">';\r\n\r\n\/\/ JSON-structured responses.\r\n$schema = array(\r\n 'type' => 'array',\r\n 'items' => array(\r\n 'type' => 'object',\r\n 'properties' => array(\r\n 'plugin_name' => array( 'type' => 'string' ),\r\n 'category' => array( 'type' => 'string' ),\r\n ),\r\n 'required' => array( 'plugin_name', 'category' ),\r\n ),\r\n);\r\n\r\n$json = wp_ai_client_prompt( 'List 5 popular WordPress plugins with their primary category.' )\r\n ->as_json_response( $schema )\r\n ->generate_text();\r\n<\/pre>\n\r\n$builder = wp_ai_client_prompt( 'test' )\r\n ->using_temperature( 0.7 );\r\n\r\nif ( $builder->is_supported_for_text_generation() ) {\r\n \/\/ Safe to show text generation UI\r\n}\r\n<\/pre>\nAI Provider Plugins<\/h3>\n
\n
WP_AI_Client_Prompt_Builder<\/code> class wraps the PHP AI Client with WordPress conventions: snake_case methods, WP_Error<\/code> returns, and integration with WordPress HTTP transport, the Abilities API, the Connectors infrastructure, and the WordPress hooks system.<\/li>\n<\/ol>\n\n
wordpress\/php-ai-client<\/code> or wordpress\/wp-ai-client<\/code> packages, the simplest path is to update your plugin\u2019s \u201cRequires at least\u201d header to 7.0 and replace any AI_Client::prompt()<\/code> calls with wp_ai_client_prompt()<\/code>.<\/p>\n5. No new default theme<\/h2>\n
Breaking changes and compatibility requirements<\/h2>\n
1. Minimum PHP version bump to 7.4<\/h3>\n
\r\nphp -v\r\n<\/pre>\n
2. Meta boxes disable collaboration<\/h3>\n
show_in_rest: true<\/code>. This allows the data to sync through the WordPress REST API, which the collaboration system can track.<\/p>\n\r\n\/\/ OLD: Traditional meta box approach (breaks collaboration)\r\nadd_action( 'add_meta_boxes', function() {\r\n add_meta_box(\r\n 'my_custom_field',\r\n 'Custom Field',\r\n 'render_my_custom_field',\r\n 'post',\r\n 'side',\r\n 'high'\r\n );\r\n} );\r\n\r\nfunction render_my_custom_field( $post ) {\r\n $value = get_post_meta( $post->ID, '_my_custom_field', true );\r\n echo '<input type=\"text\" name=\"my_custom_field\" value=\"' . esc_attr( $value ) . '\" \/>';\r\n}\r\n\r\nadd_action( 'save_post', function( $post_id ) {\r\n if ( isset( $_POST['my_custom_field'] ) ) {\r\n update_post_meta( $post_id, '_my_custom_field', sanitize_text_field( $_POST['my_custom_field'] ) );\r\n }\r\n} );\r\n\r\n\/\/ NEW: Registered post meta (works with collaboration)\r\nadd_action( 'init', function() {\r\n register_post_meta( 'post', '_my_custom_field', array(\r\n 'type' => 'string',\r\n 'single' => true,\r\n 'show_in_rest' => true, \/\/ REQUIRED for collaboration\r\n 'auth_callback' => function() {\r\n return current_user_can( 'edit_posts' );\r\n }\r\n ) );\r\n} );\r\n\r\n\/\/ Use in block editor with useSelect\r\nimport { useSelect } from '@wordpress\/data';\r\nimport { store as coreStore } from '@wordpress\/core-data';\r\n\r\nfunction MyCustomFieldComponent() {\r\n const metaValue = useSelect( ( select ) => {\r\n return select( coreStore ).getEditedEntityRecord( 'postType', 'post', postId )?.meta?._my_custom_field || '';\r\n }, [ postId ] );\r\n \r\n \/\/ Render your field component\r\n}\r\n<\/pre>\n3. Plugin architecture requirements<\/h3>\n
useSelect<\/code> instead of local React state. If you copy store data into component state, your UI won\u2019t update when other collaborators make changes.<\/p>\n\r\n\/\/ WRONG: Local state breaks collaboration\r\nimport { useState, useEffect } from '@wordpress\/element';\r\n\r\nfunction WrongComponent( { postId } ) {\r\n const [metaValue, setMetaValue] = useState( '' );\r\n \r\n \/\/ This only loads once and won't update when collaborators change the value\r\n useEffect( () => {\r\n apiFetch( { path: `\/wp\/v2\/posts\/${postId}` } ).then( ( post ) => {\r\n setMetaValue( post.meta._my_custom_field || '' );\r\n } );\r\n }, [postId] );\r\n \r\n return <div>{metaValue}<\/div>;\r\n}\r\n\r\n\/\/ RIGHT: useSelect enables real-time updates\r\nimport { useSelect } from '@wordpress\/data';\r\nimport { store as coreStore } from '@wordpress\/core-data';\r\n\r\nfunction RightComponent( { postId } ) {\r\n \/\/ This automatically updates when any collaborator changes the value\r\n const metaValue = useSelect( ( select ) => {\r\n const post = select( coreStore ).getEditedEntityRecord( 'postType', 'post', postId );\r\n return post?.meta?._my_custom_field || '';\r\n }, [ postId ] );\r\n \r\n return <div>{metaValue}<\/div>;\r\n}\r\n<\/pre>\nuseSelect<\/code> subscribes to the WordPress data store, which is synchronized across all collaborators. Local state only reflects the initial value and won\u2019t update when others make changes.<\/p>\nWhat\u2019s Next?<\/h2>\n