Image

API Reference

Plain Classes Gutenberg provides extensive APIs for developers to integrate with and extend the plugin’s functionality. This documentation covers REST endpoints, PHP hooks, JavaScript APIs, and customization options.

🌐 REST API Endpoints

Authentication

All REST API endpoints require proper authentication:

  • WordPress nonce: X-WP-Nonce header
  • User capability: manage_options or appropriate permissions
  • License validation: Active license required for full functionality

Base URL

https://yoursite.com/wp-json/pcguten/v1/

📊 Class Management Endpoints

Get All Classes

GET /pcguten/v1/classes

Response:

{
  "success": true,
  "data": [
    {
      "id": 1,
      "name": "bg-blue-500",
      "type": "imported",
      "created_at": "2024-01-15T10:30:00Z"
    },
    {
      "id": 2,
      "name": "text-white",
      "type": "scanned",
      "created_at": "2024-01-15T11:15:00Z"
    }
  ],
  "total": 150
}

Add Classes

POST /pcguten/v1/classes
Content-Type: application/json

{
  "classes": ["new-class-1", "new-class-2"],
  "type": "imported"
}

Response:

{
  "success": true,
  "message": "2 classes added successfully",
  "data": {
    "added": 2,
    "duplicates": 0
  }
}

Delete Class

DELETE /pcguten/v1/classes/{id}

Response:

{
  "success": true,
  "message": "Class deleted successfully"
}

Delete All Classes

DELETE /pcguten/v1/classes/all

Response:

{
  "success": true,
  "message": "All classes deleted successfully",
  "deleted_count": 150
}

🔍 File Scanning Endpoints

Get Scan Paths

GET /pcguten/v1/scan-classes/paths

Response:

{
  "success": true,
  "data": {
    "paths": [
      {
        "id": 1,
        "path": "/wp-content/themes/my-theme/style.css",
        "type": "file",
        "enabled": true
      },
      {
        "id": 2,
        "path": "/wp-content/themes/my-theme/assets/",
        "type": "directory",
        "enabled": true
      }
    ]
  }
}

Add Scan Path

POST /pcguten/v1/scan-classes/paths
Content-Type: application/json

{
  "path": "/wp-content/themes/my-theme/css/",
  "type": "directory"
}

Clear Scan Paths

POST /pcguten/v1/scan-classes/paths/clear

Start File Scan

POST /pcguten/v1/scan-classes/scan

Response:

{
  "success": true,
  "message": "Scan completed successfully",
  "data": {
    "files_scanned": 15,
    "classes_found": 234,
    "new_classes": 45,
    "duration": "2.3s"
  }
}

🎛️ Settings Endpoints

Get Assistant Settings

GET /pcguten/v1/settings/assistant

Response:

{
  "success": true,
  "data": {
    "assistant_enabled": true,
    "breakpoints_enabled": true,
    "position": "top-left"
  }
}

Update Settings

POST /pcguten/v1/settings/assistant
Content-Type: application/json

{
  "assistant_enabled": true,
  "breakpoints_enabled": false
}

🔧 PHP Hooks & Filters

Action Hooks

Plugin Initialization

/**
 * Fired when Plain Classes Gutenberg is fully loaded
 */
do_action('pcguten_loaded');

/**
 * Fired before plugin initialization
 */
do_action('pcguten_before_init');

/**
 * Fired after plugin initialization
 */
do_action('pcguten_after_init');

Class Management

/**
 * Fired before classes are added to database
 * 
 * @param array $classes Array of class names
 * @param string $type Class type ('imported', 'scanned', 'gutenberg')
 */
do_action('pcguten_before_add_classes', $classes, $type);

/**
 * Fired after classes are added
 * 
 * @param array $classes Added classes
 * @param string $type Class type
 * @param array $result Addition result
 */
do_action('pcguten_after_add_classes', $classes, $type, $result);

/**
 * Fired before class deletion
 * 
 * @param int $class_id Class ID to delete
 */
do_action('pcguten_before_delete_class', $class_id);

/**
 * Fired after class deletion
 * 
 * @param int $class_id Deleted class ID
 */
do_action('pcguten_after_delete_class', $class_id);

File Scanning

/**
 * Fired before file scanning starts
 * 
 * @param array $file_paths Paths to scan
 */
do_action('pcguten_before_scan', $file_paths);

/**
 * Fired after scanning completes
 * 
 * @param array $found_classes Classes found during scan
 * @param array $file_paths Scanned paths
 */
do_action('pcguten_after_scan', $found_classes, $file_paths);

/**
 * Fired when async scan is triggered
 * 
 * @param int $post_id Post ID that triggered scan
 * @param string $post_title Post title
 */
do_action('pcguten_async_css_scan', $post_id, $post_title);

Filter Hooks

Core Configuration

/**
 * Enable/disable automatic scanning
 * 
 * @param bool $enabled Default: true
 * @return bool
 */
apply_filters('pcguten_enable_auto_scan', true);

/**
 * Post types that trigger automatic scanning
 * 
 * @param array $post_types Default: ['scorg']
 * @return array
 */
apply_filters('pcguten_auto_scan_post_types', ['scorg']);

/**
 * Modify plugin capabilities
 * 
 * @param string $capability Default: 'manage_options'
 * @return string
 */
apply_filters('pcguten_required_capability', 'manage_options');

Class Processing

/**
 * Filter classes before adding to database
 * 
 * @param array $classes Array of class names
 * @param string $type Class type
 * @return array
 */
apply_filters('pcguten_filter_classes', $classes, $type);

/**
 * Filter scanned classes from specific files
 * 
 * @param array $classes Found classes
 * @param string $file_path File being scanned
 * @return array
 */
apply_filters('pcguten_scanned_classes', $classes, $file_path);

/**
 * Filter gutenberg classes from post content
 * 
 * @param array $classes Extracted classes
 * @param int $post_id Post ID
 * @return array
 */
apply_filters('pcguten_gutenberg_classes', $classes, $post_id);

File Scanning

/**
 * Supported file extensions for scanning
 * 
 * @param array $extensions Default: ['.css', '.scss', '.js', '.php']
 * @return array
 */
apply_filters('pcguten_scan_file_extensions', ['.css', '.scss', '.js', '.php']);

/**
 * Regex patterns for class detection
 * 
 * @param array $patterns Array of regex patterns
 * @return array
 */
apply_filters('pcguten_scan_class_patterns', $patterns);

/**
 * Scan timeout in seconds
 * 
 * @param int $timeout Default: 180
 * @return int
 */
apply_filters('pcguten_scan_timeout', 180);

/**
 * Memory limit for scanning
 * 
 * @param string $limit Default: '256M'
 * @return string
 */
apply_filters('pcguten_scan_memory_limit', '256M');

UI Customization

/**
 * Customize frontend assistant position
 * 
 * @param string $position Default: 'top-left'
 * @return string Options: 'top-left', 'top-right', 'bottom-left', 'bottom-right'
 */
apply_filters('pcguten_assistant_position', 'top-left');

/**
 * Assistant keyboard shortcuts
 * 
 * @param array $shortcuts Default shortcuts array
 * @return array
 */
apply_filters('pcguten_assistant_shortcuts', $shortcuts);

/**
 * Autocomplete suggestions limit
 * 
 * @param int $limit Default: 50
 * @return int
 */
apply_filters('pcguten_autocomplete_limit', 50);

🎯 JavaScript APIs

Global Objects

Window.PlainClasses

// Access class data
window.plain_classes = {
  winden_classes: "...", // JSON string of classes
  // Other class sources
};

// Debug autocomplete data
console.log('Plain Classes:', window.plain_classes);

PCGUTEN_assistant

// Assistant configuration
window.PCGUTEN_assistant = {
  breakpoints: {...},
  breakpoints_html: "...",
  // Assistant settings
};

Frontend Assistant API

Element Selection

// Get currently selected element
const selectedElement = PCGUTEN.getSelectedElement();

// Select element programmatically
PCGUTEN.selectElement(document.querySelector('.my-element'));

// Element navigation
PCGUTEN.navigateToParent();
PCGUTEN.navigateToChild();
PCGUTEN.navigateToNext();
PCGUTEN.navigateToPrevious();

Class Management

// Get element classes
const classes = PCGUTEN.getElementClasses(element);

// Set element classes
PCGUTEN.setElementClasses(element, 'bg-blue-500 text-white p-4');

// Add classes to element
PCGUTEN.addClasses(element, ['new-class-1', 'new-class-2']);

// Remove classes from element
PCGUTEN.removeClasses(element, ['old-class']);

Assistant Control

// Show/hide assistant
PCGUTEN.showAssistant();
PCGUTEN.hideAssistant();

// Move assistant position
PCGUTEN.setPosition('top-right');

// Toggle breakpoint mode
PCGUTEN.toggleBreakpoints(true);

Block Editor Integration

Autocomplete API

// Access autocomplete data in block editor
const classes = wp.data.select('pcguten/classes').getClasses();

// Filter classes by type
const importedClasses = classes.filter(c => c.type === 'imported');

// Add classes programmatically
wp.data.dispatch('pcguten/classes').addClasses(['new-class'], 'imported');

Block Enhancement

// Enhance existing blocks with Plain Classes
import { addFilter } from '@wordpress/hooks';

addFilter(
  'editor.BlockEdit',
  'pcguten/add-plain-classes',
  (BlockEdit) => {
    return (props) => {
      // Add Plain Classes functionality
      return <BlockEdit {...props} />;
    };
  }
);

🛠️ Custom Development

Creating Extensions

Plugin Structure

<?php
/**
 * Plugin Name: Plain Classes Extension
 * Description: Custom extension for Plain Classes Gutenberg
 */

class PCG_Extension {
    public function __construct() {
        add_action('pcguten_loaded', [$this, 'init']);
    }

    public function init() {
        // Extension initialization
        add_filter('pcguten_filter_classes', [$this, 'filterClasses'], 10, 2);
    }

    public function filterClasses($classes, $type) {
        // Custom class processing
        return $classes;
    }
}

new PCG_Extension();

Custom Class Sources

/**
 * Add custom class source
 */
add_action('pcguten_after_init', function() {
    // Register custom class provider
    add_filter('pcguten_class_sources', function($sources) {
        $sources['custom'] = [
            'name' => 'Custom Framework',
            'classes' => get_custom_framework_classes(),
            'color' => '#ff6b35'
        ];
        return $sources;
    });
});

function get_custom_framework_classes() {
    // Return array of custom classes
    return ['custom-btn', 'custom-card', 'custom-grid'];
}

Database Schema

Classes Table

CREATE TABLE wp_pcguten_classes (
    id int(11) NOT NULL AUTO_INCREMENT,
    name varchar(255) NOT NULL,
    type enum('imported','scanned','gutenberg') NOT NULL,
    created_at datetime DEFAULT CURRENT_TIMESTAMP,
    updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY name_type (name, type),
    KEY idx_type (type),
    KEY idx_name (name)
);

Scan Paths Table

CREATE TABLE wp_pcguten_scan_paths (
    id int(11) NOT NULL AUTO_INCREMENT,
    path text NOT NULL,
    type enum('file','directory') NOT NULL,
    enabled tinyint(1) DEFAULT 1,
    created_at datetime DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_enabled (enabled)
);

📋 Error Handling

Common Error Codes

Code Description Solution
PCG_001 Invalid license Activate valid license
PCG_002 Insufficient permissions Check user capabilities
PCG_003 Database error Check database connection
PCG_004 File not found Verify file paths
PCG_005 Scan timeout Reduce scan scope
PCG_006 Memory limit exceeded Increase PHP memory
PCG_007 Invalid class format Check class name format

Error Response Format

{
  "success": false,
  "code": "PCG_003",
  "message": "Database connection failed",
  "data": {
    "error_details": "...",
    "suggested_action": "Check database configuration"
  }
}

🔐 Security Considerations

Input Validation

// Always validate and sanitize input
$class_name = sanitize_html_class($_POST['class_name']);
$file_path = sanitize_text_field($_POST['file_path']);

// Validate file paths
if (!$this->isAllowedPath($file_path)) {
    wp_die('Invalid file path');
}

Capability Checks

// Check user permissions
if (!current_user_can('manage_options')) {
    wp_die('Insufficient permissions');
}

// Check nonce for AJAX requests
check_ajax_referer('pcguten-nonce', 'nonce');

File Access Control

// Validate file access
private function isAllowedPath($path) {
    $allowed_dirs = [
        ABSPATH . 'wp-content/themes/',
        ABSPATH . 'wp-content/plugins/',
        // Add other allowed directories
    ];

    foreach ($allowed_dirs as $dir) {
        if (strpos(realpath($path), realpath($dir)) === 0) {
            return true;
        }
    }

    return false;
}

📊 Performance Guidelines

Best Practices

  • Batch Operations: Process multiple classes at once
  • Caching: Use transients for expensive operations
  • Async Processing: Use WordPress cron for heavy tasks
  • Memory Management: Monitor memory usage during scans
  • Database Optimization: Use proper indexes and queries

Monitoring

// Performance monitoring
add_action('pcguten_after_scan', function($classes, $paths) {
    $memory = memory_get_peak_usage(true);
    $time = microtime(true) - $start_time;

    error_log("PCG Scan: {$memory} bytes, {$time}s");
});