Last week a client pinged me, excited about WordPress 6.9 and its new AI features. His first question: “Ahmad, how do we get our custom CRM data integrated? Can the AI just… pull reports for me?” Everyone hears “AI” and expects magic. Those of us who build this stuff know it’s rarely that simple, especially with a feature like the WordPress AI Abilities API still finding its feet.
The core team is moving fast, which is good. But as agency devs building for the long haul, we have to be careful about how we integrate. My first instinct was to chuck every custom function we had into an ability registration call and see what stuck. That might work for a quick demo, but it’s a maintenance headache and a compatibility risk down the line. You end up with a huge list of capabilities the AI can call, most of them irrelevant to any given task. It’s like handing someone a phone book and asking them to find a recipe.
Why WordPress AI ability categories matter
The core team figured out quickly, and it’s worth paying attention to, that handing the AI one massive undifferentiated list of abilities is a dead end. Ability categories are the fix, and they matter for any real integration with the WordPress AI Abilities API.
The latest discussion, written up in the Core-AI Contributor Check-in, Oct 1st 2025, made it plain: categories are now a required part of registering an ability. This isn’t busywork. The goal is an “approachable, discoverable set of abilities” for the AI. Think of it as organizing your tools. You don’t dump every wrench, screwdriver, and hammer into one bin; you sort them so you can grab the right one. The AI needs that same structure to work efficiently.
Without categories, your carefully built custom abilities get lost in the noise. The AI won’t know when to use them, or even that it should consider them in a given context. You get slower responses and irrelevant suggestions, which defeats the point of adding AI in the first place.
Registering an ability with a category
So how do you do it? You register the ability and associate it with a category. Here’s a simplified example that defines and registers a custom CRM ability so it fits the new categorization:
<?php
/**
* Plugin Name: Bbioon CRM AI Abilities
* Description: Custom AI abilities for Bbioon CRM.
* Version: 1.0.0
* Author: Ahmad Wael - BbioonThemes
*/
// Ensure WordPress AI Abilities API is available.
add_action( 'plugins_loaded', 'bbioon_register_crm_abilities_init' );
function bbioon_register_crm_abilities_init() {
if ( ! function_exists( 'wp_register_ability' ) ) {
return; // AI Abilities API not available.
}
// First, define your ability category.
// This is a simplified representation. In reality, it's more complex with descriptions.
$category_slug = 'bbioon_crm';
$category_args = array(
'label' => __( 'CRM Functions', 'bbioon_crm_abilities' ),
'description' => __( 'Provides abilities related to managing customer data and interactions.', 'bbioon_crm_abilities' ),
);
// Placeholder for category registration.
// In a real scenario, you'd use a dedicated function if available,
// or ensure this category is registered via the Abilities API.
// For now, let's assume the category exists or is handled.
// Register a specific CRM ability: get_customer_data.
wp_register_ability(
'bbioon_get_customer_data',
array(
'label' => __( 'Get Customer Data', 'bbioon_crm_abilities' ),
'description' => __( 'Retrieves detailed information for a specific customer.', 'bbioon_crm_abilities' ),
'category' => $category_slug, // CRITICAL: Assign to a category.
'callback' => 'bbioon_ai_get_customer_data_callback',
'schema' => array(
'type' => 'object',
'properties' => array(
'customer_id' => array(
'type' => 'integer',
'description' => __( 'The ID of the customer.', 'bbioon_crm_abilities' ),
),
),
'required' => array( 'customer_id' ),
),
)
);
}
function bbioon_ai_get_customer_data_callback( $args ) {
$customer_id = $args['customer_id'] ?? 0;
// ... logic to retrieve customer data from your custom CRM ...
// Example:
$customer_data = array(
'id' => $customer_id,
'name' => 'John Doe',
'email' => 'john.doe@example.com',
'orders' => 5,
);
return wp_json_encode( $customer_data );
}
?>
Notice the 'category' => $category_slug, line. That’s the part that matters. Without it, your ability floats out there, less likely to get used by the AI. This modular approach, which came up in the contributor meetings, makes abilities easier to manage and keeps the API from turning into a monolithic mess.
So why bother with all this decoupling?
- Clarity for AI: Categories give the AI context so it can tell when an ability is relevant.
- Future-proofing: The core team chose an adapter approach (like the MCP Adapter) to insulate the Abilities API from outside protocol changes, so your categorized abilities keep working as those protocols shift.
- Developer experience: It makes you think about how your custom functionality fits the wider AI setup, which leads to cleaner, more deliberate integrations.
This stuff gets complicated fast. If you’re tired of debugging someone else’s mess and just want your site to work, drop my team a line. We’ve probably seen it before.