Spaces:
Sleeping
Sleeping
WordPress Developer Markdown Brain
Used by AI pipeline to plan, generate, and validate WordPress themes, plugins, REST API integrations.
WordPress REST API
Base URL
https://yoursite.com/wp-json/wp/v2/
Core Endpoints
| Resource | GET | POST | PUT | DELETE |
|---|---|---|---|---|
| Posts | /posts |
/posts |
/posts/{id} |
/posts/{id} |
| Pages | /pages |
/pages |
/pages/{id} |
/pages/{id} |
| Media | /media |
/media |
/media/{id} |
/media/{id} |
| Users | /users |
/users |
/users/{id} |
/users/{id} |
| Categories | /categories |
/categories |
β | β |
| Tags | /tags |
/tags |
β | β |
| Comments | /comments |
/comments |
/comments/{id} |
/comments/{id} |
| Menus | /menus |
β | β | β |
Authentication
# Application Password (WP 5.6+)
Authorization: Basic base64(username:app_password)
# JWT Plugin
Authorization: Bearer <jwt_token>
# Cookie + Nonce (frontend)
X-WP-Nonce: {nonce}
Query Parameters
?per_page=10 # items per page (max 100)
?page=2 # pagination
?search=keyword # full-text search
?status=publish # draft | publish | pending | private
?categories=1,2 # filter by category IDs
?tags=3,4 # filter by tag IDs
?author=1 # filter by author ID
?orderby=date # date | title | id | slug | modified
?order=desc # asc | desc
?_embed=true # include embedded resources
?_fields=id,title # return only specific fields
Create Post (POST /posts)
{
"title": "My Post Title",
"content": "<p>HTML content here</p>",
"excerpt": "Short summary",
"status": "publish",
"categories": [1, 2],
"tags": [3],
"featured_media": 42,
"slug": "my-post-title",
"meta": {
"custom_field": "value"
}
}
Response Shape
{
"id": 1,
"date": "2024-01-01T00:00:00",
"slug": "post-slug",
"status": "publish",
"title": { "rendered": "Post Title" },
"content": { "rendered": "<p>...</p>", "protected": false },
"excerpt": { "rendered": "<p>...</p>" },
"author": 1,
"featured_media": 0,
"categories": [1],
"tags": [],
"_links": { "self": [{"href": "..."}] }
}
WordPress Theme Structure
my-theme/
βββ style.css # Theme header + base styles
βββ index.php # Main template fallback
βββ functions.php # Theme setup, hooks, enqueue scripts
βββ header.php # <head> + nav
βββ footer.php # closing tags + scripts
βββ sidebar.php # widget areas
βββ single.php # single post
βββ page.php # static page
βββ archive.php # archive (category/tag/date)
βββ search.php # search results
βββ 404.php # not found
βββ front-page.php # homepage (if static front page)
βββ home.php # blog index
βββ functions/
β βββ enqueue.php # wp_enqueue_scripts
β βββ setup.php # add_theme_support
β βββ widgets.php # register_sidebar
β βββ custom-post-types.php
βββ template-parts/
β βββ content.php
β βββ content-single.php
β βββ content-none.php
βββ inc/
β βββ customizer.php
βββ assets/
β βββ css/
β βββ js/
β βββ images/
βββ screenshot.png # 1200x900 theme preview
style.css Header (Required)
/*
Theme Name: My Theme
Theme URI: https://example.com
Author: Dolor David Prince
Author URI: https://dolor3v.com
Description: A custom WordPress theme
Version: 1.0.0
License: GNU GPL v2
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: my-theme
Tags: custom, responsive, blog
*/
functions.php Essential Pattern
<?php
// Theme setup
function mytheme_setup() {
add_theme_support('title-tag');
add_theme_support('post-thumbnails');
add_theme_support('html5', ['search-form', 'comment-form', 'gallery']);
add_theme_support('custom-logo');
add_theme_support('customize-selective-refresh-widgets');
register_nav_menus([
'primary' => __('Primary Menu', 'my-theme'),
'footer' => __('Footer Menu', 'my-theme'),
]);
load_theme_textdomain('my-theme', get_template_directory() . '/languages');
}
add_action('after_setup_theme', 'mytheme_setup');
// Enqueue scripts and styles
function mytheme_scripts() {
wp_enqueue_style('mytheme-style', get_stylesheet_uri(), [], '1.0.0');
wp_enqueue_style('mytheme-main', get_template_directory_uri() . '/assets/css/main.css', [], '1.0.0');
wp_enqueue_script('mytheme-main', get_template_directory_uri() . '/assets/js/main.js', ['jquery'], '1.0.0', true);
// Pass data to JS
wp_localize_script('mytheme-main', 'mythemeData', [
'ajaxUrl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('mytheme_nonce'),
'siteUrl' => get_site_url(),
]);
}
add_action('wp_enqueue_scripts', 'mytheme_scripts');
// Register widget areas
function mytheme_widgets_init() {
register_sidebar([
'name' => __('Main Sidebar', 'my-theme'),
'id' => 'sidebar-1',
'description' => '',
'before_widget' => '<section id="%1$s" class="widget %2$s">',
'after_widget' => '</section>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
]);
}
add_action('widgets_init', 'mytheme_widgets_init');
WordPress Plugin Structure
my-plugin/
βββ my-plugin.php # Plugin header + bootstrap
βββ readme.txt # WordPress.org readme
βββ uninstall.php # Cleanup on delete
βββ includes/
β βββ class-plugin.php # Main plugin class
β βββ class-admin.php # Admin functionality
β βββ class-api.php # REST API extensions
β βββ class-cpt.php # Custom post types
βββ admin/
β βββ css/
β βββ js/
β βββ views/
βββ public/
β βββ css/
β βββ js/
β βββ views/
βββ languages/
Plugin Header
<?php
/**
* Plugin Name: My Plugin
* Plugin URI: https://dolor3v.com/my-plugin
* Description: Plugin description here.
* Version: 1.0.0
* Requires at least: 5.8
* Requires PHP: 7.4
* Author: Dolor David Prince
* Author URI: https://dolor3v.com
* License: GPL v2 or later
* Text Domain: my-plugin
*/
defined('ABSPATH') || exit;
define('MY_PLUGIN_VERSION', '1.0.0');
define('MY_PLUGIN_PATH', plugin_dir_path(__FILE__));
define('MY_PLUGIN_URL', plugin_dir_url(__FILE__));
Custom Post Type
function register_project_cpt() {
register_post_type('project', [
'labels' => [
'name' => 'Projects',
'singular_name' => 'Project',
'add_new_item' => 'Add New Project',
'edit_item' => 'Edit Project',
'view_item' => 'View Project',
'search_items' => 'Search Projects',
'not_found' => 'No projects found',
],
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_rest' => true, // Enable REST API
'rest_base' => 'projects',
'supports' => ['title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'],
'has_archive' => true,
'rewrite' => ['slug' => 'projects'],
'menu_icon' => 'dashicons-portfolio',
]);
}
add_action('init', 'register_project_cpt');
Custom REST Endpoint
add_action('rest_api_init', function() {
register_rest_route('my-plugin/v1', '/data', [
'methods' => 'GET',
'callback' => 'my_plugin_get_data',
'permission_callback' => '__return_true',
'args' => [
'id' => [
'validate_callback' => fn($v) => is_numeric($v),
'sanitize_callback' => 'absint',
],
],
]);
});
function my_plugin_get_data(WP_REST_Request $request) {
$id = $request->get_param('id');
// ... logic
return new WP_REST_Response(['data' => $result], 200);
}
Gutenberg Block (block.json)
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "my-plugin/hero",
"version": "1.0.0",
"title": "Hero Block",
"category": "layout",
"description": "A hero section block",
"supports": { "html": false, "align": ["wide", "full"] },
"attributes": {
"heading": { "type": "string", "default": "Hello World" },
"subtext": { "type": "string", "default": "" },
"backgroundColor": { "type": "string", "default": "#000" }
},
"editorScript": "file:./build/index.js",
"editorStyle": "file:./build/index.css",
"style": "file:./build/style-index.css"
}
WordPress Hooks Reference
Action Hooks
add_action('init', $cb); // After WP loads
add_action('wp_head', $cb); // Inside <head>
add_action('wp_footer', $cb); // Before </body>
add_action('save_post', $cb, 10, 3); // Post saved
add_action('wp_enqueue_scripts', $cb); // Enqueue assets
add_action('admin_init', $cb); // Admin init
add_action('admin_menu', $cb); // Register admin pages
add_action('rest_api_init', $cb); // Register REST routes
add_action('wp_ajax_{action}', $cb); // AJAX (logged in)
add_action('wp_ajax_nopriv_{action}', $cb); // AJAX (public)
Filter Hooks
add_filter('the_content', $cb); // Post content
add_filter('the_title', $cb); // Post title
add_filter('excerpt_length', $cb); // Excerpt word count
add_filter('wp_nav_menu_items', $cb, 10, 2);// Nav menu items
add_filter('body_class', $cb); // Body classes
add_filter('upload_mimes', $cb); // Allowed file types
add_filter('rest_post_query', $cb, 10, 2); // REST query args
WP-CLI Commands
wp post create --post_title="Title" --post_status=publish
wp post list --post_type=page
wp user create user@example.com --role=editor
wp plugin install woocommerce --activate
wp theme activate my-theme
wp db export backup.sql
wp search-replace 'old-url.com' 'new-url.com'
wp cron event run --due-now
wp cache flush