# WordPress Hooks & Filters

## Filters

### `ajaxpress_is_license_active`

Override the license active check. Return `true` to treat the license as active regardless of stored state.

```php
add_filter('ajaxpress_is_license_active', function ($is_active) {
    return true; // Force premium features on
});
```

**Type:** `bool`  
**Default:** Result of checking `ajaxpress_license` option

---

### `ajaxpress_default_options`

Modify the default settings values before they are merged with database values.

```php
add_filter('ajaxpress_default_options', function ($defaults) {
    $defaults['enable_prefetch'] = true;
    return $defaults;
});
```

**Type:** `array`  
**Default:** Full defaults array from `Options::get_default_settings()`

---

### `ajaxpress_navigation`

Control whether SPA navigation is active for the current request. Return `false` to disable navigation for specific conditions.

```php
add_filter('ajaxpress_navigation', function ($enabled) {
    if (is_singular('product')) {
        return false; // Disable on WooCommerce products
    }
    return $enabled;
});
```

**Type:** `bool`  
**Default:** Value of `enable_navigation` setting

---

## Actions Registered

AjaxPress hooks into the following WordPress actions:

### Frontend

| Hook | Class | Method | Priority |
|------|-------|--------|----------|
| `wp_enqueue_scripts` | `Enqueues` | `enqueue_scripts()` | default |
| `wp_footer` | `Templates` | `load_templates()` | default |

### Admin

| Hook | Class | Method | Priority |
|------|-------|--------|----------|
| `admin_menu` | `Admin\Hooks` | `register_admin_menu()` | default |
| `admin_enqueue_scripts` | `Admin\Enqueues` | `enqueue_scripts()` | default |
| `admin_enqueue_scripts` | `Admin\Enqueues` | `enqueue_admin_spa()` | default |
| `admin_enqueue_scripts` | `Admin\Deactivate_Feedback` | `enqueue_scripts()` | default |
| `rest_api_init` | `Admin\REST` | `register_rest_endpoints()` | default |
| `plugin_action_links_*` | `Admin\Hooks` | `plugin_action_links()` | default |
| `plugin_row_meta` | `Admin\Hooks` | `plugin_row_meta()` | default |
| `current_screen` | `Admin\Hooks` | `maybe_add_footer_filters()` | default |

### Cloudflare Auto-Purge

These hooks are registered only when auto-purge is enabled and Cloudflare is connected:

| Hook | Class | Method | Priority |
|------|-------|--------|----------|
| `save_post` | `Cloudflare\Hooks` | `on_post_save()` | 20 |
| `delete_post` | `Cloudflare\Hooks` | `on_post_delete()` | 20 |
| `trashed_post` | `Cloudflare\Hooks` | `on_post_delete()` | 20 |
| `transition_post_status` | `Cloudflare\Hooks` | `on_status_change()` | 20 |
| `edited_term` | `Cloudflare\Hooks` | `on_term_edit()` | 20 |
| `delete_term` | `Cloudflare\Hooks` | `on_term_delete()` | 20 |
| `comment_post` | `Cloudflare\Hooks` | `on_comment()` | 20 |
| `edit_comment` | `Cloudflare\Hooks` | `on_comment_edit()` | 20 |
| `transition_comment_status` | `Cloudflare\Hooks` | `on_comment_status()` | 20 |
| `admin_bar_menu` | `Cloudflare\Hooks` | `admin_bar_menu()` | 100 |
| `wp_footer` | `Cloudflare\Hooks` | `admin_bar_script()` | 100 |
| `admin_footer` | `Cloudflare\Hooks` | `admin_bar_script()` | 100 |
| `shutdown` | `Cloudflare\Hooks` | `process_pending_purges()` | default |

### Activation

| Hook | Callback |
|------|----------|
| `register_activation_hook` | `ajaxpress_plugin_activation()` |

## Global Functions

### `ajaxpress_purge_cache($urls = null)`

Purge specific URLs or the entire Cloudflare cache from theme or plugin code.

```php
// Purge specific pages
ajaxpress_purge_cache([
    'https://example.com/page-1/',
    'https://example.com/page-2/',
]);

// Purge everything
ajaxpress_purge_cache();
```

**Parameters:**
- `$urls` (`array|null`) -- Array of URLs to purge, or `null` to purge all
