"""
WooCommerce Plugin - E-commerce Management
Split from WordPress Core in Phase D.1.
Provides 28 tools for WooCommerce store management.
Uses shared WordPress handlers for implementation.
"""
from typing import Any
from plugins.base import BasePlugin
from plugins.wordpress.client import WordPressClient
from plugins.wordpress.handlers import (
CouponsHandler,
CustomersHandler,
OrdersHandler,
ProductsHandler,
ReportsHandler,
get_coupons_specs,
get_customers_specs,
get_orders_specs,
get_products_specs,
get_reports_specs,
)
class WooCommercePlugin(BasePlugin):
"""
WooCommerce E-commerce Plugin.
Provides comprehensive WooCommerce management capabilities:
- Products (12 tools): CRUD, categories, tags, attributes, variations
- Orders (5 tools): list, get, create, update_status, delete
- Customers (4 tools): list, get, create, update
- Coupons (4 tools): list, create, update, delete
- Reports (3 tools): sales, top_sellers, customer_report
Total: 28 tools
"""
@staticmethod
def get_plugin_name() -> str:
"""Return plugin type identifier"""
return "woocommerce"
@staticmethod
def get_required_config_keys() -> list[str]:
"""Return required configuration keys"""
return ["url", "username", "app_password"]
def __init__(self, config: dict[str, Any], project_id: str | None = None):
"""
Initialize WooCommerce plugin with handlers.
Args:
config: Configuration dictionary containing:
- url: WordPress site URL
- username: WordPress username
- app_password: WordPress application password
project_id: Optional project ID (auto-generated if not provided)
"""
super().__init__(config, project_id=project_id)
# Create WordPress API client (WooCommerce uses WordPress REST API)
self.client = WordPressClient(
site_url=config["url"], username=config["username"], app_password=config["app_password"]
)
# Initialize WooCommerce handlers
self.products = ProductsHandler(self.client)
self.orders = OrdersHandler(self.client)
self.customers = CustomersHandler(self.client)
self.coupons = CouponsHandler(self.client)
self.reports = ReportsHandler(self.client)
@staticmethod
def get_tool_specifications() -> list[dict[str, Any]]:
"""
Return all tool specifications for ToolGenerator.
This method is called by ToolGenerator to create unified tools
with site parameter routing.
Returns:
List of tool specification dictionaries (28 tools)
"""
specs = []
# Products (12 tools)
specs.extend(get_products_specs())
# Orders (5 tools)
specs.extend(get_orders_specs())
# Customers (4 tools)
specs.extend(get_customers_specs())
# Coupons (4 tools)
specs.extend(get_coupons_specs())
# Reports (3 tools)
specs.extend(get_reports_specs())
return specs
async def health_check(self) -> dict[str, Any]:
"""
Check WooCommerce availability and health.
Returns:
Dict with health status and WooCommerce version
"""
try:
wc_status = await self.client.check_woocommerce()
if wc_status.get("available"):
return {
"healthy": True,
"message": "WooCommerce is available",
"version": wc_status.get("version", "unknown"),
"plugin_type": "woocommerce",
}
else:
return {
"healthy": False,
"message": "WooCommerce is not available on this site",
"plugin_type": "woocommerce",
}
except Exception as e:
return {
"healthy": False,
"message": f"Health check failed: {str(e)}",
"plugin_type": "woocommerce",
}
# ========================================
# Method Delegation to Handlers
# ========================================
# === Products ===
async def list_products(self, **kwargs):
return await self.products.list_products(**kwargs)
async def get_product(self, **kwargs):
return await self.products.get_product(**kwargs)
async def create_product(self, **kwargs):
return await self.products.create_product(**kwargs)
async def update_product(self, **kwargs):
return await self.products.update_product(**kwargs)
async def delete_product(self, **kwargs):
return await self.products.delete_product(**kwargs)
async def list_product_categories(self, **kwargs):
return await self.products.list_product_categories(**kwargs)
async def create_product_category(self, **kwargs):
return await self.products.create_product_category(**kwargs)
async def list_product_tags(self, **kwargs):
return await self.products.list_product_tags(**kwargs)
async def list_product_attributes(self, **kwargs):
return await self.products.list_product_attributes(**kwargs)
async def create_product_attribute(self, **kwargs):
return await self.products.create_product_attribute(**kwargs)
async def list_product_variations(self, **kwargs):
return await self.products.list_product_variations(**kwargs)
async def create_product_variation(self, **kwargs):
return await self.products.create_product_variation(**kwargs)
# === Orders ===
async def list_orders(self, **kwargs):
return await self.orders.list_orders(**kwargs)
async def get_order(self, **kwargs):
return await self.orders.get_order(**kwargs)
async def create_order(self, **kwargs):
return await self.orders.create_order(**kwargs)
async def update_order_status(self, **kwargs):
return await self.orders.update_order_status(**kwargs)
async def delete_order(self, **kwargs):
return await self.orders.delete_order(**kwargs)
# === Customers ===
async def list_customers(self, **kwargs):
return await self.customers.list_customers(**kwargs)
async def get_customer(self, **kwargs):
return await self.customers.get_customer(**kwargs)
async def create_customer(self, **kwargs):
return await self.customers.create_customer(**kwargs)
async def update_customer(self, **kwargs):
return await self.customers.update_customer(**kwargs)
# === Coupons ===
async def list_coupons(self, **kwargs):
return await self.coupons.list_coupons(**kwargs)
async def create_coupon(self, **kwargs):
return await self.coupons.create_coupon(**kwargs)
async def update_coupon(self, **kwargs):
return await self.coupons.update_coupon(**kwargs)
async def delete_coupon(self, **kwargs):
return await self.coupons.delete_coupon(**kwargs)
# === Reports ===
async def get_sales_report(self, **kwargs):
return await self.reports.get_sales_report(**kwargs)
async def get_top_sellers(self, **kwargs):
return await self.reports.get_top_sellers(**kwargs)
async def get_customer_report(self, **kwargs):
return await self.reports.get_customer_report(**kwargs)