Nominations for Core Team Reps: 2026 Edition

This post kicks off the formal election process with a call for nominations for the 2026 CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. Team Reps. For 2025, Francesca Marano (@francina), Jb Audras (@audrasjb) and Benjamin Zekavica (@benjamin_zekavica) have served as the elected Core Team Reps.

The Role

In the WordPress open-source project, each team has on average one or two representatives, abbreviated as reps.ย For the historians out there, the role go way back to 2012.

Historically with the Core team, the team repTeam Rep A Team Rep is a person who represents the Make WordPress team to the rest of the project, make sure issues are raised and addressed as needed, and coordinates cross-team efforts. duration was around a year, though some reps stuck around longer if there was a specific need.

Anyone who serves as a team rep is responsible for communicating on behalf of the Core team to the other contributor groups via weekly updates, as well as occasional cross-team chats. Reps are also consulted on Contributor DayContributor Day Contributor Days are standalone days, frequently held before or after WordCamps but they can also happen at any time. They are events where people get together to work on various areas of https://make.wordpress.org/ There are many teams that people can participate in, each with a different focus. https://2017.us.wordcamp.org/contributor-day/ https://make.wordpress.org/support/handbook/getting-started/getting-started-at-a-contributor-day/., where they help to find someone within the Core team who will be at an event who can lead a Core table.ย Full details on the Team Rep role can be found on the Team Update site.

It is not called team lead for a reason.ย  Itโ€™s an administrative role. While people elected as team reps will generally come from the pool of folks that people think of as experienced leaders, the team rep role is designed to change hands regularly.

This role has a time commitment of at least one or two hours a week.

The main tasks include:

  • Posting the weekly Dev Chat agenda, hosting the chats, and summarizing them (which can include writing and encouraging others to contribute to the summaries). More details on coordinating devchat are available in the Core handbook.
  • Keeping up with the current releases (mainly WordPress major and minors and GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses โ€˜blocksโ€™ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/ bi-weekly releases) and communicating updates.
  • Keeping a watch on the moving parts of the team to report for quarterly updates (example).

How the election works

Please nominate people in the comments of this post. Self-nominations are welcome. The deadline is January 31, 2026 at 23:59 UTC. If there are fewer than 2 nominees who have accepted their nominations, the deadline will be extended.

Once the nomination period expires, a poll will be opened for voting. It will stay open for two weeks. The new reps will start their role in February 2026.

Disclaimer: if you are nominated, please donโ€™t feel like you have to agree to say yes. The election poll will only include the names of the people who have agreed to be nominated. So feel free to reply with a โ€œThank you, but no thank youโ€.

If you have any questions, please feel free to ask in the comments or speak to the current team reps. Finally, for reference, these are the 2020, 2021, 2022, 2023, 2024, 2025 nomination posts.

Thanks to @francina for reviewing this post.

#team-reps

WordPress 7.0 Call for Volunteers

Planning is underway for WordPress 7.0! This post outlines the proposed schedule along with a call for volunteers to support the release process.

Following the typical cadence and accounting for holidays later in the year, the proposed final release date for 7.0 is Thursday, April 9, 2026.ย This proposed timeline remains flexible for the resulting Release Squad and adjustments can be made if necessary as they determine what timeline works best for their schedule.

Proposed Schedule

MilestoneDate
Alpha BeginsImmediately (7.0-alpha began in trunk on November 12th with [61222])
BetaBeta A pre-release of software that is given out to a large group of users to trial under real conditions. Beta versions have gone through alpha testing in-house and are generally fairly close in look, feel and function to the final product; however, design changes often occur as part of the process. 1Thursday, February 19
Beta 2Thursday, February 26
Beta 3Thursday, March 5
Beta 4Thursday, March 12
Release Candidaterelease candidate One of the final stages in the version release cycle, this version signals the potential to be a final release to the public. Also see alpha (beta). 1Thursday, March 19
Release Candidate 2Thursday, March 26
Release Candidate 3Thursday, April 2
Dry RunWednesday, April 8
Final ReleaseThursday, April 9

As always, all dates are subject to change based on development progress.


Call for Volunteers

Each WordPress release depends on contributors from across the project coming together to make it a success.ย 

As with the 6.7, 6.8, and 6.9 release cycles, WordPress 7.0 will continue the approach of forming a smaller, focused Release Squad with making based on feedback received.ย This streamlined structure places more emphasis on collaboration with the various Make Team Reps, who are encouraged to help coordinate efforts from within their respective teams.ย The goals are to reduce the overhead on the Release Squad while still ensuring each teamโ€™s contributions and priorities are represented throughout the cycle, and to reduce overlap between a Make Team RepTeam Rep A Team Rep is a person who represents the Make WordPress team to the rest of the project, make sure issues are raised and addressed as needed, and coordinates cross-team efforts. and that teamโ€™s Release Squad Leads.ย Noteworthy Contributors will be captured from Team Reps towards the end of the release cycle.

While the end goal is to publish the final release of WordPress 7.0 during Contributor DayContributor Day Contributor Days are standalone days, frequently held before or after WordCamps but they can also happen at any time. They are events where people get together to work on various areas of https://make.wordpress.org/ There are many teams that people can participate in, each with a different focus. https://2017.us.wordcamp.org/contributor-day/ https://make.wordpress.org/support/handbook/getting-started/getting-started-at-a-contributor-day/. at WordCampWordCamp WordCamps are casual, locally-organized conferences covering everything related to WordPress. They're one of the places where the WordPress community comes together to teach one another what theyโ€™ve learned throughout the year and share the joy. Learn more. Asia (which follows India Standard Time), traveling to or attending WordCamp Asia is not a requirement to serve on the release squad. All communication related to the release process will continue to take place in the #core SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/. channel.

If you are interested in helping lead WordPress 7.0 in one of the following roles, please comment below or reach out in the #7-0-release-leads Slack channel:

  • Release LeadRelease Lead The community member ultimately responsible for the Release. โ€“ Matt Mullenweg (@matt)
  • Release Coordination โ€“ helps manage timelines, cross-team collaboration, and status updates
  • Tech Leads โ€“ oversees coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. development (including GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses โ€˜blocksโ€™ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/), triagetriage The act of evaluating and sorting bug reports, in order to decide priority, severity, and other factors., and critical issues
  • Triage Lead โ€“ help monitor issues, shepherd patches, and guide contributors
  • Test Lead โ€“ coordinates testing efforts across the community and test reports

Whether you have led a release before or are looking to get involved for the first time, there are many ways to contribute.ย Volunteers of all backgrounds and experience levels are welcome!

If you are interested in volunteering, please leave a comment below noting your preferred area(s) by Friday, January 16th. @4thhubbard (or a designee), will review the nominations shortly after to confirm and announce the release squad as soon as possible.

Together we can make WordPress 7.0 the best one yet!

Props to @jeffpaul, @jorbin, and @4thhubbard for reviewing this post.

#7-0

Dev Chat Agenda โ€“ January 14, 2026

The next WordPress Developers Chat will take place on Wednesday, January 14, 2026, at 15:00 UTC in theย coreย channel onย Make WordPress Slack.

The live meeting will focus on the discussion for upcoming releases, and have an open floor section.

The various curated agenda sections below refer to additional items. If you haveย ticketticket Created for both bug reports and feature development on the bug tracker.ย requests for help, please continue to post details in the comments section at the end of this agenda or bring them up during the dev chat.

Announcements ๐Ÿ“ข

WordPress 7.0 Call for Volunteers

If you are interested in volunteering for WordPress 7.0, please comment here by January 16.

Nominations for CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. Team Reps 2026

The nomination process for Core Team Representatives for 2026 is now open. Please submit your nomination here.

Dropping support for PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher 7.2 and 7.3

Support for PHP 7.2 and 7.3 will be dropped in WordPress 7.0. Here you can find more information.

6.9 Release Retrospective

The 6.9 release retrospective is open to all contributors, not only release squad members.
Broader feedback helps improve future release processes. The form and comments will be open until January 15.

Discussions ๐Ÿ’ฌ

The discussion section of the agenda is for discussing important topics affecting the upcoming release or larger initiatives that impact the Core Team. To nominate a topic for discussion, please leave a comment on this agenda with a summary of the topic, any relevant links that will help people get context for the discussion, and what kind of feedback you are looking for from others participating in the discussion.

PHP Extensions List โ€“ filter

@sirlouen raised a question about setting the filter PHP extension as default. See the Hosting Team Handbook.

Open floor ย ๐ŸŽ™๏ธ

Any topic can be raised for discussion in the comments, as well as requests for assistance on tickets. Tickets in the milestone for the next major or maintenance release will be prioritized.

Please include details of tickets / PRs and the links in the comments, and indicate whether you intend to be available during the meeting for discussion or will be async.

#7-0, #agenda, #core, #dev-chat

Dev Chat Agenda โ€“ January 7, 2026

The next WordPress Developers Chat will take place on Wednesday, January 7, 2026, at 15:00 UTC in theย coreย channel onย Make WordPress Slack.

The live meeting will focus on the discussion for upcoming releases, and have an open floor section.

The various curated agenda sections below refer to additional items. If you haveย ticketticket Created for both bug reports and feature development on the bug tracker.ย requests for help, please continue to post details in the comments section at the end of this agenda or bring them up during the dev chat.

Announcements ๐Ÿ“ข

Happy New Year!

The first Dev Chat meeting of the year will take place on January 7 at the usual time.

6.9 Release Retrospective

The 6.9 release retrospective is open to all contributors, not only release squad members.
Broader feedback helps improve future release processes.

Discussions ๐Ÿ’ฌ

The discussion section of the agenda is for discussing important topics affecting the upcoming release or larger initiatives that impact the CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. Team. To nominate a topic for discussion, please leave a comment on this agenda with a summary of the topic, any relevant links that will help people get context for the discussion, and what kind of feedback you are looking for from others participating in the discussion.

PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher Extensions List โ€“ filter

@sirlouen raised a question about setting the filter PHP extension as default. See the Hosting Team Handbook.

Open floor ย ๐ŸŽ™๏ธ

Any topic can be raised for discussion in the comments, as well as requests for assistance on tickets. Tickets in the milestone for the next major or maintenance release will be prioritized.

Please include details of tickets / PRs and the links in the comments, and indicate whether you intend to be available during the meeting for discussion or will be async.

#7-0, #agenda, #core, #dev-chat

Dropping support for PHP 7.2 and 7.3

Support for PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher 7.2 and 7.3 will be dropped in WordPress 7.0, currently scheduled for release in April 2026. The minimum recommended version of PHP will remain at 8.3, but the new minimum supported version of PHP will be 7.4.0.

The minimum supported version of PHP was last raised in July 2024 to 7.2.24. Since then usage of PHP 7.2 and 7.3 has dropped below 4% of monitored WordPress installations.

Historically, the project has used 5% as the baseline usage percentage that a PHP version must fall below before it can be considered for a well-earned retirement. Now that usage of PHP 7.2 and 7.3 combined has fallen well below that, the process to increase the minimum supported PHP version can proceed.

The goal of increasing the minimum supported version of PHP is to ensure the long-term maintainability of WordPress. The benefits to increasing the minimum supported PHP version manifest over time across multiple areas, including the pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party and theme ecosystem, tooling and libraries for AI, the long-term perception of the WordPress project, developer relations, and eventually within the WordPress codebase itself, including its developer tooling and automated testing infrastructure.

Discussion around this minimum version bump can be found here on the Trac ticket.

What about PHP 8 and higher?

WordPress coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. is fully compatible with PHP 8.0 to 8.3 and is beta compatible with PHP 8.4 and 8.5.

A full breakdown of which PHP versions are compatible with each version of WordPress can be found in the WordPress Core Handbook..

What about security support?

Sites that are running PHP 7.2 or 7.3 will remain on the 6.9 branchbranch A directory in Subversion. WordPress uses branches to store the latest development code for each major release (3.9, 4.0, etc.). Branches are then updated with code for any minor releases of that branch. Sometimes, a major version of WordPress and its minor versions are collectively referred to as a "branch", such as "the 4.0 branch". of WordPress once 7.0 is released. While only one branch officially receives security updates, fixes are backported down to WordPress 4.7 as a courtesy when possible.

What about the GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses โ€˜blocksโ€™ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/ plugin?

The minimum supported version of PHP will also be increased to 7.4 in the Gutenberg plugin.

Going forward

There are no plans to bump the minimum supported PHP version on a set schedule. The Core team will continue to monitor PHP version usage and work with the Hosting team to encourage users and hosting companies to upgrade their versions of PHP as swiftly as possible. The 5% usage threshold will continue to be used as the standard for the foreseeable future.

At the time of publishing, the PHP version usage is as follows:

  • 8.5: 0.23%
  • 8.4: 4.90%
  • 8.3: 16.74%
  • 8.2: 27.29%
  • 8.1: 15.39%
  • 8.0: 5.69%
  • 7.4: 22.20%
  • 7.3: 2.04%
  • 7.2: 1.81%

Update PHP today

If you need more information about PHP or how to update it,ย check out this support article that explains more, guides you through the process, and provides instructions for contacting your web hosting provider for assistance.

Props to all those that have contributed to this discussion recently. Thanks to @desrosj, @westonruter, and @jorbin for feedback and proof-reading this post.

#7-0, #dev-notes, #php

Coding Standard Proposal: Allow the use of the PHP short echo tag

Currently, the WordPress Coding Standard explicitly forbids the use of the PHP short echo tag (<?=) along with the PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher short tagtag A directory in Subversion. WordPress uses tags to store a single snapshot of a version (3.6, 3.6.1, etc.), the common convention of tags in version control systems. (Not to be confused with post tags.) (<?). This post proposes modifying this rule to allow the use of the short echo tag for single statements.

Motivation

Prior to PHP 5.4, it was possible to disable the PHP short echo tag (<?=) using the PHP short_open_tag ini directive. This meant that scripts using this tag could not be used in code that must work across different PHP installations, because the content within those tags may be printed instead of executed, which could lead to code exposure. For this reason, the WordPress Coding StandardsWordPress Coding Standards The Accessibility, PHP, JavaScript, CSS, HTML, etc. coding standards as published in the WordPress Coding Standards Handbook. May also refer to The collection of PHP_CodeSniffer rules (sniffs) used to format and validate PHP code developed for WordPress according to the PHP coding standards. forbid its use.

Since PHP 5.4, the short echo tag is always available, and changing the short_open_tag directive no longer affects it. WordPress dropped support for versions prior to PHP 5.6 in 2019, and since then raised the minimum supported PHP version to 7.2. Currently, according to WordPress.org stats, the percentage of active WP installs using PHP < 5.4 is 0.4% and the percentage of sites still using WP < 5.2 is 4.0%. Therefore, it is now safe to allow the use of short echo tags.

This tag is useful as it provides a more concise syntax for outputting values in template files. WordPress developers should be allowed to use it. An issue requesting this change is the most liked issue in the WPCSWordPress Community Support A public benefit corporation and a subsidiary of the WordPress Foundation, established in 2016. repository, indicating community support.

This proposal is about allowing the use of the short echo tag for single statements, not encouraging its use, so no immediate changes are required. In practice, this means that:

  • Existing open patches for CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. are not affected as either style is allowed.
  • Existing WP Core code and code in official WP themes should not be updated, as both styles are permitted. A patchpatch A special text file that describes changes to code, by identifying the files and lines which are added, removed, and altered. It may also be referred to as a diff. A patch can be applied to a codebase for testing. to enforce the use of short echo tags in all possible places will NOT be accepted.
  • However, a new official theme could choose to use short echo tags if desired.

Suggested change to the handbook

The suggestion is to modify the rule titled โ€œNo Shorthand PHP Tagsโ€ as follows:

New title: No PHP short open tag

Content:

Important: Never use the PHP short open tag (`<?`). Always use the full PHP open tag (`<?php`). Using the PHP short echo tag (`<?=`) is allowed, though short echo tag snippets should only contain a single statement.

Correct:

<?php โ€ฆ ?>
<?= esc_html( $var ); ?>

Incorrect:

<? โ€ฆ ?>

How to keep short echo tags forbidden in a given project

If this proposal is accepted, but a project wants to keep the short echo tag forbidden in its own codebase, it can do so by adding the following snippet to its PHPCSPHP Code Sniffer PHP Code Sniffer, a popular tool for analyzing code quality. The WordPress Coding Standards rely on PHPCS. configuration after the WordPress standard is included:

<rule ref="Generic.PHP.DisallowShortOpenTag.EchoFound">
    <severity>5</severity>
</rule>

References

#codingstandards, #php, #wpcs

Props @dingo_d, @garyj, and @jrf for reviewing this post.

Abilities API in WordPress 6.9

WordPress 6.9 introduces the Abilities APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways., a new foundational system that enables plugins, themes, and WordPress coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. to register and expose their capabilitiescapability Aย capabilityย is permission to perform one or more types of task. Checking if a user has a capability is performed by the current_user_can function. Each user of a WordPress site might have some permissions but not others, depending on theirย role. For example, users who have the Author role usually have permission to edit their own posts (the โ€œedit_postsโ€ capability), but not permission to edit other usersโ€™ posts (the โ€œedit_others_postsโ€ capability). in a standardized, machine-readable format. This API creates a unified registry of functionality that can be discovered, validated, and executed consistently across different contexts, including PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher, REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think โ€œphone appโ€ or โ€œwebsiteโ€) can communicate with the data store (think โ€œdatabaseโ€ or โ€œfile systemโ€) https://developer.wordpress.org/rest-api/. endpoints, and future AI-powered integrations.

The Abilities API is part of the broader AI Building Blocks for WordPress initiative, providing the groundwork for AI agents, automation tools, and developers to understand and interact with WordPress functionality in a predictable manner.

What is the Abilities API?

An ability is a self-contained unit of functionality with defined inputs, outputs, permissions, and execution logic. By registering abilities through the Abilities API, developers can:

  • Create discoverable functionality with standardized interfaces
  • Define permission checks and execution callbacks
  • Organize abilities into logical categories
  • Validate inputs and outputs
  • Automatically expose abilities through REST API endpoints

Rather than burying functionality in isolated functions or custom AJAX handlers, abilities are registered in a central registry that makes them accessible through multiple interfaces.

Core Components

The Abilities API introduces three main components to WordPress 6.9:

1. PHP API

A set of functions for registering, managing, and executing abilities:

Ability Management:

  • wp_register_ability() โ€“ Register a new ability
  • wp_unregister_ability() โ€“ Unregister an ability
  • wp_has_ability() โ€“ Check if an ability is registered
  • wp_get_ability() โ€“ Retrieve a registered ability
  • wp_get_abilities() โ€“ Retrieve all registered abilities

Ability CategoryCategory The 'category' taxonomy lets you group posts / content together that share a common bond. Categories are pre-defined and broad ranging. Management:

  • wp_register_ability_category() โ€“ Register an ability category
  • wp_unregister_ability_category() โ€“ Unregister an ability category
  • wp_has_ability_category() โ€“ Check if an ability category is registered
  • wp_get_ability_category() โ€“ Retrieve a registered ability category
  • wp_get_ability_categories() โ€“ Retrieve all registered ability categories

2. REST API Endpoints

When enabled, the Abilities API can automatically expose registered abilities through REST API endpoints under the wp-abilities/v1 namespace:

  • GET /wp-abilities/v1/categories โ€“ List all ability categories
  • GET /wp-abilities/v1/categories/{slug} โ€“ Get a single ability category
  • GET /wp-abilities/v1/abilities โ€“ List all abilities
  • GET /wp-abilities/v1/abilities/{name} โ€“ Get a single ability
  • GET|POST|DELETE /wp-abilities/v1/abilities/{name}/run โ€“ Execute an ability

3. HooksHooks In WordPress theme and development, hooks are functions that can be applied to an action or a Filter in WordPress. Actions are functions performed when a certain event occurs in WordPress. Filters allow you to modify certain functions. Arguments used to hook both filters and actions look the same.

New action hooks for integrating with the Abilities API:

Actions:

  • wp_abilities_api_categories_init โ€“ Fired when the ability categories registry is initialized (register categories here)
  • wp_abilities_api_init โ€“ Fired when the abilities registry is initialized (register abilities here)
  • wp_before_execute_ability โ€“ Fired before an ability executes
  • wp_after_execute_ability โ€“ Fired after an ability finishes executing

Filters:

  • wp_register_ability_category_args โ€“ Filters ability category arguments before registration
  • wp_register_ability_args โ€“ Filters ability arguments before registration

Registering Abilities

Abilities must be registered on the wp_abilities_api_init action hook. Attempting to register abilities outside of this hook will trigger a _doing_it_wrong() notice, and the Ability registration will fail.

Basic Example

Hereโ€™s a complete example of registering an ability category and an ability:

<?php
add_action( 'wp_abilities_api_categories_init', 'my_plugin_register_ability_categories' );
/**
 * Register ability categories.
 */
function my_plugin_register_ability_categories() {
    wp_register_ability_category(
        'content-management',
        array(
            'label'       => __( 'Content Management', 'my-plugin' ),
            'description' => __( 'Abilities for managing and organizing content.', 'my-plugin' ),
        )
    );
}

add_action( 'wp_abilities_api_init', 'my_plugin_register_abilities' );
/**
 * Register abilities.
 */
function my_plugin_register_abilities() {
    wp_register_ability(
        'my-plugin/get-post-count',
        array(
            'label'              => __( 'Get Post Count', 'my-plugin' ),
            'description'        => __( 'Retrieves the total number of published posts.', 'my-plugin' ),
            'category'           => 'content-management',
            'input_schema'       => array(
                'type'       => 'string',
                'description' => __( 'The post type to count.', 'my-plugin' ),
                'default'     => 'post',
            ),
            'output_schema'      => array(
                'type'       => 'integer',
                'description' => __( 'The number of published posts.', 'my-plugin' ),
            ),
            'execute_callback'   => 'my_plugin_get_post_count',
            'permission_callback' => function() {
                return current_user_can( 'read' );
            },
        )
    );
}

/**
 * Execute callback for get-post-count ability.
 */
function my_plugin_get_post_count( $input ) {
    $post_type = $input ?? 'post';

    $count = wp_count_posts( $post_type );

    return (int) $count->publish;
}

More Complex Example

Hereโ€™s an example with more advanced input and output schemas, input validation, and error handling:

<?php
add_action( 'wp_abilities_api_init', 'my_plugin_register_text_analysis_ability' );
/**
 * Register a text analysis ability.
 */
function my_plugin_register_text_analysis_ability() {
    wp_register_ability(
        'my-plugin/analyze-text',
        array(
            'label'              => __( 'Analyze Text', 'my-plugin' ),
            'description'        => __( 'Performs sentiment analysis on provided text.', 'my-plugin' ),
            'category'           => 'text-processing',
            'input_schema'       => array(
                'type'       => 'object',
                'properties' => array(
                    'text' => array(
                        'type'        => 'string',
                        'description' => __( 'The text to analyze.', 'my-plugin' ),
                        'minLength'   => 1,
                        'maxLength'   => 5000,
                    ),
                    'options' => array(
                        'type'       => 'object',
                        'properties' => array(
                            'include_keywords' => array(
                                'type'        => 'boolean',
                                'description' => __( 'Whether to extract keywords.', 'my-plugin' ),
                                'default'     => false,
                            ),
                        ),
                    ),
                ),
                'required' => array( 'text' ),
            ),
            'output_schema'      => array(
                'type'       => 'object',
                'properties' => array(
                    'sentiment' => array(
                        'type'        => 'string',
                        'enum'        => array( 'positive', 'neutral', 'negative' ),
                        'description' => __( 'The detected sentiment.', 'my-plugin' ),
                    ),
                    'confidence' => array(
                        'type'        => 'number',
                        'minimum'     => 0,
                        'maximum'     => 1,
                        'description' => __( 'Confidence score for the sentiment.', 'my-plugin' ),
                    ),
                    'keywords' => array(
                        'type'        => 'array',
                        'items'       => array(
                            'type' => 'string',
                        ),
                        'description' => __( 'Extracted keywords (if requested).', 'my-plugin' ),
                    ),
                ),
            ),
            'execute_callback'   => 'my_plugin_analyze_text',
            'permission_callback' => function() {
                return current_user_can( 'edit_posts' );
            },
        )
    );
}

/**
 * Execute callback for analyze-text ability.
 * 
 * @param $input
 * @return array
 */
function my_plugin_analyze_text( $input ) {
    $text = $input['text'];
    $include_keywords = $input['options']['include_keywords'] ?? false;

    // Perform analysis (simplified example)
    $sentiment = 'neutral';
    $confidence = 0.75;

    $result = array(
        'sentiment'  => $sentiment,
        'confidence' => $confidence,
    );

    if ( $include_keywords ) {
        $result['keywords'] = array( 'example', 'keyword' );
    }

    return $result;
}

Ability Naming Conventions

Ability names should follow these practices:

  • Use namespaced names to prevent conflicts (e.g., my-plugin/my-ability)
  • Use only lowercase alphanumeric characters, dashes, and forward slashes
  • Use descriptive, action-oriented names (e.g., process-payment, generate-report)
  • The format should be namespace/ability-name

Executing Abilities

To execute an Ability, first you need to fetch it, and then execute it. This is typically performing during the init action, or any action after it.

add_action( 'init', 'my_plugin_execute_ability' );
/**
 * Function which fetches and executes an ability.
 * 
 * @return void
 */
function my_plugin_execute_ability() {
    $get_post_count_ability = wp_get_ability( 'my-plugin/get-post-count' );
    $result = $get_post_count_ability->execute();
    // do something with $result
}

Categories

Abilities must be assigned to a category. Categories provide better discoverability and help organize related abilities. Categories must be registered before the abilities that reference them using the wp_abilities_api_categories_init hook.

JSONJSON JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML. Schema Validation

The Abilities API uses JSON Schema for input and output validation. WordPress implements a validator based on a subset of JSON Schema Version 4. The schemas serve two purposes:

  1. Automatic validation of data passed to and returned from abilities
  2. Self-documenting API contracts for developers

Defining schemas is mandatory when there is a value to pass or return.

Using REST API Endpoints

Developers can also enable Abilities to support the default REST API endpoints. This is possible by setting the meta.show_in_rest argument to true when registering an ability.

       wp_register_ability(
        'my-plugin/get-post-count',
        array(
            'label'              => __( 'Get Post Count', 'my-plugin' ),
            'description'        => __( 'Retrieves the total number of published posts.', 'my-plugin' ),
            'category'           => 'content-management',
            'input_schema'       => array(
                'type'       => 'string',
                'description' => __( 'The post type to count.', 'my-plugin' ),
                'default'     => 'post',
            ),
            'output_schema'      => array(
                'type'       => 'integer',
                'description' => __( 'The number of published posts.', 'my-plugin' ),
            ),
            'execute_callback'   => 'my_plugin_get_post_count',
            'permission_callback' => function() {
                return current_user_can( 'read' );
            },
            'meta'               => array(
                'show_in_rest' => true,
            )
        )
    );

Access to all Abilities REST API endpoints requires an authenticated user. The Abilities API supports all WordPress REST API authentication methods:

  • Cookie authentication (same-origin requests)
  • Application passwords (recommended for external access)
  • Custom authentication plugins

Once enabled, itโ€™s possible to list, fetch, and execute Abilities via the REST API endpoints:

List All Abilities:

curl -u 'USERNAME:APPLICATION_PASSWORD' \
  https://example.com/wp-json/wp-abilities/v1/abilities

Get a Single Ability:

curl -u 'USERNAME:APPLICATION_PASSWORD' \
https://example.com/wp-json/wp-abilities/v1/abilities/my-plugin/get-post-count

Execute an Ability:

curl -u 'USERNAME:APPLICATION_PASSWORD' \
  -X POST https://example.com/wp-json/wp-abilities/v1/abilities/my-plugin/get-post-count/run \
  -H "Content-Type: application/json" \
  -d '{"input": {"post_type": "page"}}'

The API automatically validates the input against the abilityโ€™s input schema, checks permissions via the abilityโ€™s permission callback, executes the ability, validates the output against the abilityโ€™s output schema, and returns the result as JSON.

Checking and Retrieving Abilities

You can check if an ability exists and retrieve it programmatically:

<?php
// Check if an ability is registered
if ( wp_has_ability( 'my-plugin/get-post-count' ) ) {
    // Get the ability object
    $ability = wp_get_ability( 'my-plugin/get-post-count' );

    // Access ability properties
    echo $ability->get_label();
    echo $ability->get_description();
}

// Get all registered abilities
$all_abilities = wp_get_abilities();

foreach ( $all_abilities as $ability ) {
    echo $ability->get_name();
}

Error Handling

Abilities should handle errors gracefully by returning WP_Error objects:

<?php
function my_plugin_delete_post( $input ) {
    $post_id = $input['post_id'];

    if ( ! get_post( $post_id ) ) {
        return new WP_Error(
            'post_not_found',
            __( 'The specified post does not exist.', 'my-plugin' ),
        );
    }

    $result = wp_delete_post( $post_id, true );

    if ( ! $result ) {
        return new WP_Error(
            'deletion_failed',
            __( 'Failed to delete the post.', 'my-plugin' ),
        );
    }

    return array(
        'success' => true,
        'post_id' => $post_id,
    );
}

Backward Compatibility

The Abilities API is a new feature in WordPress 6.9 and does not affect existing WordPress functionality. Plugins and themes can adopt the API incrementally without breaking existing code.

For developers who want to support both WordPress 6.9+ and earlier versions, check if the API functions exist before using them:

<?php
if ( function_exists( 'wp_register_ability' ) ) {
    add_action( 'wp_abilities_api_init', 'my_plugin_register_abilities' );
}

Or

if ( class_exists( 'WP_Ability' ) ) {
 add_action( 'wp_abilities_api_init', 'my_plugin_register_abilities' );
}

Further Resources

Props to @gziolo for pre-publish review.

#abilities-api, #6-9, #dev-notes, #dev-notes-6-9

More-reliable email in WordPress 6.9

Emails sent from WordPress will be more reliable in WordPress 6.9 thanks to a few updates and bugbug A bug is an error or unexpected result. Performance improvements, code optimization, and are considered enhancements, not defects. After feature freeze, only bugs are dealt with, with regressions (adverse changes from the previous version) being the highest priority.-fixes to the wp_mail() function.

The sender address is extensibly configured.

The sender address, also known as the Envelope-From, the MAIL FROM, the Return-Path (and even more), is the address where other email servers send โ€œbounce messagesโ€ when they canโ€™t deliver a message. Since WordPress 4.7.0 this value was being set by the outgoing mail server and would often end up misconfigured1. That doesnโ€™t sound like it should be a big problem โ€” a site may not receive those notifications from failed delivery โ€” but itโ€™s a bigger problem because of the Sender Policy Framework (SPF) and DMARC systems which help prevent the transmission of spam. They reject these emails entirely.

Thanks to the change in [61010], WordPress 6.9 sets the sender address in an extensibleExtensible This is the ability to add additional functionality to the code. Plugins extend the WordPress core software. way:

  • If a From email headerHeader The header of your site is typically the first thing people will experience. The masthead or header art located across the top of your page is part of the look and feel of your website. It can influence a visitorโ€™s opinion about your content and you/ your organizationโ€™s brand. It may also look different on different screen sizes. is present it uses the From address. Otherwise it defaults to wordpress@home_url(), where home_url() is โ€œthe URLURL A specific web address of a website or web page on the Internet, such as a websiteโ€™s URL www.wordpress.org for the current site where the front end is accessible.โ€
  • Plugins can then filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. the sender address via the wp_mail_from filter in the case the inferred or default address is incorrect2.

For those with custom email configurations it may be necessary to hook into the wp_mail_from filter. If your site was relying on a pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party to work around this issue before, or you relied on the phpmailer_init filter to do so, you may no longer need to do that. Otherwise, without any effort on your part, WordPress 6.9 should become more reliable out-of-the-box at sending emails.

The Encoding headers are protected between calls.

wp_mail() calls a $phpmailer global object to actually send emails, meaning that certain state is shared between calls for a given PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher request. Internal logic in the PHPMailer class looks for certain factors in a message that it uses to set or change the Encoding headers in outbound emails. Because this object is global, those encoding changes persisted and, in some cases, would apply to successive emails and cause problems when trying to read them.

In [61131] the internal encoding is reset before sending emails so that PHPMailer sends the appropriate encoding type for each email, based solely on the server configuration and specifics in that message.

Multipart messages are assigned the proper Content-Type.

For the past seventeen years there was a lurking bug in how WordPress interacts with PHPMailer for multipart messages. Ironically, the bug was introduced in a patchpatch A special text file that describes changes to code, by identifying the files and lines which are added, removed, and altered. It may also be referred to as a diff. A patch can be applied to a codebase for testing. meant to address this specific case, but an oversight left WordPress sending a corrupted ContentType to PHPMailer. In these cases, PHPMailer would further corrupt the outbound message because of this invalidinvalid A resolution on the bug tracker (and generally common in software development, sometimes also notabug) that indicates the ticket is not a bug, is a support request, or is generally invalid. content type. In rare cases this led to a duplicate Content-Type header, but the normative expression was corrupting the multipart boundaries.

This complicated interaction is resolved in [61201] which simplifies the previous fix by relying on PHPMailerโ€™s facilities for setting the content type rather than attempting (erroneously) to manually specify that header.

Acknowledgements

Props to @jorbin, @sirlouen, @stankea, and @westonruter for reviewing this post, and to @websupporter and @stankea for providing expertise knowledge on the interactions of the sender address and SPF/DMARC/DKIM.

  1. Many mail servers auto-generate a sender address from the system user running on the server and the local server hostname, such as www@node-14-dc3.example.com. โ†ฉ๏ธŽ
  2. This could be the case for sites with more advanced email setups, particularly those which send emails from a subdomain or different domain than on which the site is hosted. โ†ฉ๏ธŽ

#6-9, #dev-notes, #dev-notes-6-9, #email

Planning for 7.0

With 6.9 out in the world, our collective attention has already turned to 7.0. Core contributorsCore Contributors Core contributors are those who have worked on a release of WordPress, by creating the functions or finding and patching bugs. These contributions are done through Trac. https://core.trac.wordpress.org., together with Matt and Mary, had a call to discuss ideas and projects. There was shared excitement about this release, even if itโ€™s just another number. This post acts as a gathering point for contributors to share what they are starting to work on and to find known areas they can contribute to. There will be another more tactical follow up with release schedule and responsibilities, this one is about the initial scope.

How to interact with this post

Please do not use this as a spot to request folks to work on features. GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the โ€˜pull requestโ€™ where code changes done in branches by contributors can be reviewed and discussed before being merged be the repository owner. https://github.com/ and TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. are the best places to share feedback, talk about impact, and advocate for issues.ย 

Please use this post to share what you are working on, including areas youโ€™d like to help with that may be listed here, as well as areas that you are working on that are not. Items with TBD indicate areas where contributors are needed so please comment below if youโ€™re keen to work on those pieces.

If you were planning to work in an area listed below and donโ€™t see your name, please be sure to comment as well and itโ€™ll be updated. Itโ€™s intentional that this post is meant to be a place to shore up who is working on what out in the open at this early stage.

Also note this is neither comprehensive nor yet a commitment that all of these things will be part of 7.0, since many are in early stages and may not make this release. Items marked with โœ… mean the work is already merged in GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses โ€˜blocksโ€™ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/ or trunktrunk A directory in Subversion containing the latest development code in preparation for the next major release cycle. If you are running "trunk", then you are on the latest revision..

Collaborationย 

The project is getting deeper into Phase 3: Collaboration. Notes was a highlight feature in WP6.9 and thereโ€™s several improvements already planned to make it even more powerful and resilient.

Real time collaboration

  • Link: GitHub issue
  • Key considerations:
    • Thereโ€™s been a lot of progress in defining the UIUI User interface and the diffing mechanics for reconciling changes. Itโ€™s in very good shape and needs to be reviewed and tested diligently, especially around compatibility with third-party blocks and plugins.
    • This feature has a stronger dependency on server support and infrastructure than usual WordPress features, so there needs to be a definition of whatโ€™s the baseline experience shipping in WordPress (for example, peer-to-peer with 1 or 2 connections) and how it can be augmented, either by WP.org, hosting providers, or plugins.
  • Contributors: @acicovic, @aduth, @alecgeatches, @czarate, @ingeniumed, @jsnajdr, @maxschmelingkc, @paulkevan, @shekharnwagh, @youknowriad

Notes i2

  • Link: GitHub issue
  • Key considerations:
    • Support partial selection inside blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. rich text fields.
    • A โ€œsuggestionsโ€ mode and interface that allows Notes to refer to specific content within a block and apply the suggestions.
    • Support for multi-block notes.
    • Add rich text support in the comments.
    • Develop a dashboard widgetWidget A WordPress Widget is a small block that performs a specific function. You can add these widgets in sidebars also known as widget-ready areas on your web page. WordPress widgets were originally created to provide a simple and easy-to-use way of giving design and structure control of the WordPress theme to the user. for recent notes.
    • More notification options (responses, follow a note, mentions).
  • Contributors: @adamsilverstein, @jeffpaul, @mamadukaย 

Adminadmin (and super admin)

Improving screens across wp-admin

  • Link: TBD
  • Key considerations:
    • Explore CSS improvements that can modernize the look and feel. For example, consider making the โ€œmodernโ€ admin color scheme the default.
    • Admin bar and editor โ€œsite hubโ€ improvements. Make the W menu item filterable. Possibly start work as an experiment in Gutenberg.
    • Consider a โ€œThis time last yearโ€ widget for bloggers.
    • Bring grid layout customization to dashboard experience or other screens. (Possible widgets at the top of comments, etc).
  • Contributors: TBD, @fabiankaegy, @karmatosed, @mcsf

DataViews and DataForms iterations

  • Link: 7.0 iteration issue
  • Key considerations:
    • DataForms/QuickEdit/Document inspector design iterations.
    • Hierarchical post visualization.
    • Make DataViews screens extensibleExtensible This is the ability to add additional functionality to the code. Plugins extend the WordPress core software. in the site editor (templates, pages, etc).
  • Contributors: @oandregal

Design System

  • Link: GitHub issue
  • Key considerations:
    • Components are already being worked on in wordpress/ui.
    • โœ… Theming system with design tokens using wordpress/theme.
    • Start replacing key parts of the editor UI with improved components (tabs, flyout menus).
  • Contributors: @0mirka00, @aduth, @jsnajdr, @mciampini, @wildworks

Font library admin section

  • Link: Github issue
  • Key considerations:
    • โœ… Support for block themes.
    • Support for hybrid/classic themes.
  • Contributors: @youknowriad

RevisionsRevisions The WordPress revisions system stores a record of each saved draft or published update. The revision system allows you to see what changes were made in each revision by dragging a slider (or using the Next/Previous buttons). The display indicates what has changed in each revision.ย 

  • Link: GitHub issue
  • Key tasks:
    • Rethink the revisions interface to be more modern, intuitive, and work with blocks.
    • Show visual diffs.ย 
    • Bonus: potentially tie in with collaborative editing, suggestions, and undo management.
  • Contributors: @adamsilverstein

Customizable Keyboard Shortcuts

  • Link: Github issue
  • Key considerations:
    • Build with design system components.
  • Contributors: TBD

APIs

Abilities & Workflows APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways.

Upgrade to ReactReact React is a JavaScript library that makes it easy to reason about, construct, and maintain stateless and stateful user interfaces. https://reactjs.org/. 19

  • Link: Github issue
  • Key considerations:
    • Thereโ€™s a path for the block editor in the mobile apps that should remove this dependency blockerblocker A bug which is so severe that it blocks a release..
    • Ecosystem impact.
  • Contributors: @aduth @jsnajdr @mamaduka @ralucastnย @tyxla

Block API: Add validation levels

  • Links: Github issue with initial PRย 
  • Key considerations:
    • The scope of this issue is to drastically reduce the amount of times a user sees a โ€œthis block is brokenโ€ message.
    • Impact on block API.
  • Contributors: @matvebย @mcsf @youknowriad

Enforced iframed editor

  • Link: GitHub issue.
    • Backwards compatibility, extended testing.
    • โœ… MigrationMigration Moving the code, database and media files for a website site from one server to another. Most typically done when changing hosting companies. guide.
  • Contributors: @ellatrix, @wildworks

WP client AI API

  • Link: GitHub project
  • Key considerations:
    • An AI client and API for WordPress to communicate with any generative AI models of various capabilitiescapability Aย capabilityย is permission to perform one or more types of task. Checking if a user has a capability is performed by the current_user_can function. Each user of a WordPress site might have some permissions but not others, depending on theirย role. For example, users who have the Author role usually have permission to edit their own posts (the โ€œedit_postsโ€ capability), but not permission to edit other usersโ€™ posts (the โ€œedit_others_postsโ€ capability). using a uniform API.
    • Integration with Abilities API.
    • Strictly no providers included in coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress..
    • Decide nomenclature.
    • Ideally, the minimum PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher version has to be bumped from PHP 7.2.
  • Contributors: @flixos90 @jason_the_adams

Creating blocks and patterns on the server

  • Link: GitHub issue
  • Key considerations:
    • Most of the tools for a pretty straightforward PHP-only representation of blocks and patterns, including bindings, are ready.
    • Declarative block attributes and form components.
    • Pattern creation and syntax that allows easy construction of blocks and bindings.
  • Contributors: @priethor, TBD

wordpress/build and routing (site editor)

  • Link: GitHub issue; Scripts issue
  • Key considerations.
    • Add extensibility to site editor routing.
    • Dependency on standalone font library.
    • Refactor the site editor to allow pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party authors to add their pages there.
    • โœ… Opinionated build tool for plugins.
    • Update Gutenberg โ€“ Core backportbackport A port is when code from one branch (or trunk) is merged into another branch or trunk. Some changes in WordPress point releases are the result of backporting code from trunk to the release branch. flow.
  • Contributors: @youknowriadย 

Shortblocks

Block bindings iterations


A series of improvements were identified to simplify the navigation workflow and make the experience of managing menus more intuitive and straightforward.

Simpler navigation editing

Ability to customise โ€œmobileโ€ overlayย 

  • Link: GitHub issue
  • Key considerations:
    • Implemented as a template part.
    • Ability to customize when the overlay appears (breakpoint settings) just for navigation overlay.
  • Contributors: @get_dave, @jeryj

Customization

Over the past couple years weโ€™ve been iterating on a series of related systems with the hope of arriving at a more streamlined editing experience of composite blocks and design patterns. We have some solid directions sketched out that are looking promising.

Explore more intuitive page navigation in the site editor

  • Link: TBD
  • Key considerations:
    • Modify the title bar to display a pages dropdown instead of empty command palette. List the pages used in the primary menu with a link to โ€œbrowse all pagesโ€. Exploration.
    • Add next/previous page links in zoomed-out view, similar to a carousel. See a preview in a zoomed out state with arrows next to preview or title bar. Exploration.
  • Contributors: @ellatrix

Pattern Editing (aka ContentOnly)

Improve template management

Responsive editing mode

Block supports and design tools:ย ย 


Blocks

Keeping the momentum on adding new blocks and new block tools to expand the palette and expressiveness offered to theme builders and users. Thereโ€™s also some refinements to some fundamental aspects of blocks to make them more resilient and more consistent.

Group block attributes

  • Link: GitHub Issue
  • Key considerations:
    • Adding groups to InspectorControls (like BlockControls).
    • Add support for list representation to block API based on nav block work.
    • Implement content representation for media and rich text attributes. (Connected with contentOnly, bindings, and partially synced patterns work.)
  • Contributors: TBD

โœ… Cover block: video embeds

Modernize Code editor + Code block

Lazy load the Classic block

Leverage iAPI for instant search block & submit comments without full page refresh

Writing flow + drag and drop improvements

  • Link: GitHub issue
  • Key considerations:
    • Get to a place where the drag handle from the toolbar can be entirely removed due to improved drag and drop functionality.
    • Making multi selection work on touch devices.
    • Improvements to inline insertion and inline images.
  • Contributors: @ellatrix

โœ… Tabs blockย 

Release the Table of Contents blockย 

Playlist block

Slider block

Dialog block

โœ… Breadcrumb block

Add more dynamic URLs via block bindings to Buttons block and Image block

Icon block

  • Link: GitHub issue
  • Key considerations:
    • Ship with a default set made out of some wordpress/icons.
    • Allow extenders to register their own sets.
  • Contributors: @mcsf @welcher

Gallery block: add lightbox support with the ability to switch between images

Introduce heading levels as Heading block variations

  • Link: Github issue; https://github.com/WordPress/gutenberg/issues/42181
  • Key considerations:
    • Show up in search and slash inserter.
    • Easy toggling in sidebarSidebar A sidebar in WordPress is referred to a widget-ready area used by WordPress themes to display information that is not a part of the main content. It is not always a vertical column on the side. It can be a horizontal rectangle below or above the content area, footer, header, or any where in the theme. inspector and transforms.
  • Contributor: @matveb

Aim to stabilize grid block


Media

Client side media work

Media editor


Designers looking across all these projects: @fcoveram, @joen,ย @jameskoster, @mattmiklic.

#7-0, #phase-3

AI as a WordPress Fundamental

WordPress Fundamentals

Imagine WordPress without a database.

Not changing the kind of database. No database at all. WordPress without the ability to persist data. One could use the filesystem. But how would things like metaMeta Meta is a term that refers to the inside workings of a group. For us, this is the team that works on internal WordPress sites like WordCamp Central and Make WordPress. work? Some particularly clever minds might take this as a challenge and think of something, but WordPress would be fundamentally different.

The funny thing about this mental experiment is that your average WordPress user doesnโ€™t know what a database is, much less the fundamental role it plays within WordPress. Itโ€™s taken for granted. Of course posts save, comments can be made, and settings are stored. Why wouldnโ€™t they?

Even for pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party developers the presence of the database is assumed. No one checks if the database exists before using get_post_meta() or grabbing $wpdb. Entire products are built around the assumption that the database is present. Simpler products store things in meta while more complex products add custom tables. From simple to complex, products utilize the database to unlock incredible possibilities. Itโ€™s safe to say the vast majority of the impressive plugin ecosystem relies on the database.

AI as a Fundamental

What if this were true of AI?

What if, from the end-user to the plugin developer, they could take for granted that thereโ€™s an AI model accessible to me by virtue of being in WordPress? What kinds of things would people use it for? What amazing things would people create that are built on the reliable presence of a capable LLM?

Itโ€™s tempting to think of AI as a feature. Users look at products like ChatGPT or Claude Code and imagine a chat interface. So it may be tempting to imagine WordPress with a chat interface to a powerful LLM that does all sorts of cool things with and for the user. But the idea is not merely that; it is more than that.

Even with the database, there are certain features like saving a post that feel closely tied to the database. But when someone likes a post, theyโ€™re not thinking โ€œIโ€™m saving this likeโ€. They just did something and itโ€™s still there. Why wouldnโ€™t it be? With LLMs the chat interface feels close to the model because itโ€™s a direct interaction. But what about features like clicking a โ€œgenerate alt textโ€ button for an image that just fills in the alt text? In this case, itโ€™s creating an AI-powered feature without it being obvious. And so it should be! When one imagines AI as an engine, humming within WordPress that can be used for anything, then things get even more exciting.

AI Features at WordPress Scale

The most incredible thing about WordPress is its ecosystem. Every single day there are people creating and improving plugins that push the capabilitiescapability Aย capabilityย is permission to perform one or more types of task. Checking if a user has a capability is performed by the current_user_can function. Each user of a WordPress site might have some permissions but not others, depending on theirย role. For example, users who have the Author role usually have permission to edit their own posts (the โ€œedit_postsโ€ capability), but not permission to edit other usersโ€™ posts (the โ€œedit_others_postsโ€ capability). of WordPress further and further. Each day WordPress grows to be even better.

Imagine if every single developer was empowered with AI capabilities without having to handle the complexities of AI integration. What if the developer just did something like

$$image = Ai_Client::prompt( 'Create an image that beautifully reflects this post content' )
  ->with_text($post_content)
  ->generate_image();

Simple as that. Nothing more required to interact with the AI. One could build everything from simple interactive tools to powerful agents. If AI is fundamental to WordPress, and itโ€™s unleashed on the ecosystem, then thereโ€™s simply no competitor that can keep up. (As a note, this code isnโ€™t just an idea, this is real! Itโ€™s the WP AI Client and is proposed for WordPress 7.0!)

To be abundantly clear, this is the bedrock of this vision: In order for AI to truly be a cornerstone of WordPressโ€™ next wave of success, AI has to be a win for the entire ecosystem. To press it further, WordPress is what it is today because of its ecosystem, therefore adoption by the ecosystem is not a nice to have, itโ€™s the most necessary goal. No competitor can possibly keep up with the scale and speed of innovation in the WordPress ecosystem. That is our advantage, and AI can unlock the next stage of innovation.

An ushering strategy

The real challenge, therefore, is how to empower everyone with this capabilitycapability Aย capabilityย is permission to perform one or more types of task. Checking if a user has a capability is performed by the current_user_can function. Each user of a WordPress site might have some permissions but not others, depending on theirย role. For example, users who have the Author role usually have permission to edit their own posts (the โ€œedit_postsโ€ capability), but not permission to edit other usersโ€™ posts (the โ€œedit_others_postsโ€ capability).. At this moment, the most feasible method for integrating with LLMs is through cloud providers such as OpenAI, Google, and Anthropic, or through self-hosted means which is not for the faint of heart. So if a plugin adds a bunch of AI features then they need to either provide the service themselves (e.g. Elementorโ€™s Angie) or send the user off to generate an OpenAI (or whatever) key, come back, and paste it in. In either case thereโ€™s additional complexity and cost, the kinds of which drive away the majority of users. Again, imagine if it was also Bring Your Own Database?

What if hosts brought the AI like they do databases?

If databases were optional in WordPress, then hosts including a database as part of their managed hosting would be a huge competitive advantage. The capabilities and experience of the WordPress site would be substantial. If plugins included AI-powered features, then this same reasoning would flow into hosts that provide the AI model as part of the hosting plan. WordPress would work without AI (an important note), but to a noticeably lesser degree in terms of user value. Hosts even have the choice to determine how they want to solve that problem (proprietary model, proxy, etc.) to play with their own cost-to-value proposition and be competitive.

With this in place, plugin developers would be able to assume that a capable model exists which they can use to power their features. This eliminates the common and substantial pain point for each developer to figure out how to bring a model or get the user to bring their own. Not only does that reduce friction for the user, but it greatly lowers the necessary competency for the developer. Armed with the ability to simply run prompts any time and anywhere, the developer doesnโ€™t need to know more than how to do that and can get back to innovating.

Backwards Compatibility

This is WordPress, so itโ€™s important to acknowledge the need for backwards compatibility. Thereโ€™s a strategy thatโ€™s already in place for this. Within the WP AI Client, it has a system for finding the best model for a given prompt โ€” based on the needs of the prompt. Itโ€™s quite sophisticated! It also has methods that can be used to check if there is a model available to do the work. This is really important, because it allows the developer to check for the AI before making the assumption.

Imagine a โ€œGenerate Alt textโ€ button, for example. The developer can use the check methods to conditionally display the button โ€” present if thereโ€™s a supporting model, and hidden if not. This keeps the plugin working in a backwards compatible way.

As time goes on, ideally the need for these sorts of checks will be reduced, ultimately getting to the point now where databases are truly assumed to be present.

Where the vision meets us

This journey has already begun with the formation of the AI Team in WordPress and the AI Building Block for WordPress was created. For this to succeed, innovation and effort are needed from two communities within the WordPress community:

Developers

Adoption and innovation of the Abilities APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. (coming in WP 6.9), WP AI Client (proposed for WP 7.0), and MCP Adapter from developers is critical. Even if youโ€™re not sure about what AI features to make, just using Abilities will make other AI integrations even more capable. Otherwise, thinking outside the chat bot (though thatโ€™s great, too) and imagining what you could do by passing text, images, audios and so forth to AI, and getting back text, images, audios, videos, and embeddings. The upcoming Workflows API will then make it possible to chain together Abilities into truly powerful flows. Imagine publishing a post which triggers a workflow to use AI to summarize its content, send an AI generated email to an audience, and then note its completion in a SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/. post.

Really, just do what you do already and make amazing things! To learn more about how this connects to developers and what they can do, read AI for WordPress Developers.

Hosts

As already mentioned, hosts are critical in the distribution of AI models to the ecosystem. By introducing AI in hosting plans, WordPress becomes even more capable simply by including a model, giving a competitive advantage. Hosts can also use this AI within WordPress for doing things like interacting with the customerโ€™s account via MCP. Also think about developers and how to empower them to develop within your environment, possibly offering some access for developers to test their plugin on your platform to make sure it works as intended.

To learn more about how this connects to hosts and what they can do, read AI for WordPress Hosts.

Conclusion

There will be separate posts written specifically for developers and hosts to provide more specific information on what theyโ€™ll need to understand to get started. Youโ€™re encouraged to jump into the Making WordPress Slack and reach out in the #core-ai channel with any questions or needs that arise.

AI is an industry shift, quickly becoming a cornerstone of the next generation of technology. For WordPress to grow into the next phase itโ€™s critical that AI become a fundamental part of WordPress itself, and for this to succeed everyone has a role to fulfill.

Props to @annezazu, @jeffpaul for the pre-publish review