Action Scheduler Moat

Block new action scheduling and rate-limit execution for individual hooks and groups.

The Action Scheduler Moat dashboard — click a region to jump to that section, or click the image to enlarge

The Moat page lets you control which Action Scheduler hooks and groups are allowed to schedule new actions and how fast they can execute. Use it to throttle runaway plugins, block unwanted background jobs, or limit execution during peak hours — all without touching your WordPress site directly.

Hooks Table (1)

The left column lists every hook registered in the Action Scheduler queue. By default, only hooks with pending actions are shown.

Column Description
Checkbox Select hooks for blocking or rate limiting. Disabled for hooks that are already blocked.
Hook Name The action hook name. Blocked hooks are shown with a strikethrough.
Pending Number of pending actions for this hook.
Total Total actions across all statuses.
Status Active (blue) or Blocked (red).
Rate Limit Blocked (red, all scheduling prevented) or N/hr (orange, hourly execution cap).
Action Unblock button, shown only for blocked hooks.

The header checkbox selects or deselects all hooks on the current page. Already-blocked hooks cannot be selected (their checkboxes are disabled), so the header checkbox only affects unblocked hooks.

Searching & Sorting

Type in the search box to filter hooks by name — the list updates as you type. Click any sortable column header (Hook Name, Pending, Total) to toggle between ascending and descending order. The sort indicator arrow shows the current direction.

Pagination controls appear when results exceed the page size. Choose between 10, 25, 50, or 100 per page, or type a page number into the Go to field and press Enter to jump directly. Changing the search term or toggling Show Zero resets to page 1.

Show Zero Toggle

By default, hooks with zero pending actions are hidden to reduce noise. Click Show Zero to include them. The button toggles between a filled state (showing all hooks) and an outline state (hiding zero-pending hooks). This is useful when you need to block a hook that has no pending actions yet but is expected to schedule new ones.

Groups Table

Below the hooks table, a second table lists Action Scheduler groups. Groups are collections of related hooks registered by plugins (e.g. woocommerce, gla, action-scheduler). The columns, sorting, searching, pagination, and Show Zero toggle work identically to the hooks table.

Blocking a group prevents any hook within that group from scheduling new actions. This is a more aggressive control than blocking individual hooks — use it when an entire plugin is misbehaving and you want to stop all of its background work at once.

Some actions may have no group assigned; these appear as (No Group) in the table. Blocking (No Group) will affect all ungrouped actions.

Rate Limiting Control (2)

The sidebar panel (2) configures and applies rate limiting to your selections.

Queue Status

The top of the panel shows the current Action Scheduler queue state:

  • Queue Active (green) — The queue is processing normally.
  • Queue Paused (red) — Queue processing is suspended (see Queue Control).
  • Pending count — Total actions waiting to execute.

Rate Limit Types

The Rate Limit Type dropdown has three options:

Type Scheduling Execution
No restrictions Normal Normal
Block new scheduling Blocked Normal
Rate limit execution Normal Capped at N/hour

Block new scheduling prevents new actions from being added to the queue. Already-pending actions continue to execute normally. Use this to stop a plugin from flooding the queue.

Rate limit execution allows new actions to be scheduled but limits how many can execute per hour. An Actions per Hour field appears when this type is selected. Excess actions are automatically rescheduled to the next hour.

No restrictions removes any existing rate limit or block from the selected items.

Applying Rules

  1. Select one or more hooks and/or groups using the checkboxes in either table.
  2. The Selected Items section updates to show hook and group counts.
  3. Choose a Rate Limit Type from the dropdown.
  4. If using Rate limit execution, enter the Actions per Hour count (minimum 1).
  5. Click Apply Rate Limiting (red button for blocking, default for removing restrictions).
  6. The confirmation dialog shows:
    • How many hooks and groups will be affected.
    • The configuration summary (e.g. “Block new scheduling, normal execution”).
    • An explanation of how the selected rate limit type works.
  7. Click the confirm button to apply. All selections are cleared after a successful operation.

You can mix hooks and groups in a single operation — the same rate limit type applies to all selected items. The Impact Summary appears once you have at least one selection, showing the total number of items that will be affected.

Use Clear Selection to deselect all items without applying any changes.

Unblocking

There are two ways to remove a block or rate limit:

  • Row Unblock button — Click Unblock in any blocked hook or group row. Removes the rule immediately.
  • No restrictions — Select items, choose No restrictions as the rate limit type, and apply. Removes the rule from all selected items in one action.

Orphaned Rules

When a blocked hook or group no longer has any actions in the queue (e.g. the plugin was deactivated or all actions completed), the blocking rule becomes orphaned. The Orphaned Rules panel appears below the Groups table when orphaned rules exist.

Column Description
Type Hook or Group badge.
Name The hook name or group slug, shown with a strikethrough.
Rate Limit The original rate limit type that was applied.
Blocked How long ago the rule was created.
Action Remove button for individual rules, or Clear All Orphaned to remove all at once.

Orphaned rules are harmless but should be cleaned up periodically. They will block scheduling again if the hook or group returns, which may or may not be what you want.

How It Works

The Moat uses two mechanisms on the WordPress site, both managed by the Minuttes plugin:

Block New Scheduling

Hooks into Action Scheduler's pre_as_schedule_* filters to intercept action registration. When a hook or group is set to Block new scheduling, the filter returns a value that prevents the action from being stored. Existing pending actions are not affected and will continue to execute.

Hourly Rate Limiting

A background cron job runs every 60 seconds and checks rate-limited hooks and groups. It counts how many actions have already executed in the current hour and compares this to the configured limit. Excess pending actions scheduled within the next 15 minutes are rescheduled to the start of the next hour.

No Site Connected

If no WordPress site is connected to your tenant, the Moat page displays a placeholder message instead of the tables and control panel. Connect a WordPress site running the Minuttes plugin to enable Moat controls. The connection is established via OAuth 2.0 from your site's Minuttes plugin settings.

FAQ

Does blocking a hook cancel pending actions?

No. Blocking only prevents new actions from being scheduled. All existing pending actions remain in the queue and will execute normally. If you need to stop execution entirely, use Queue Control to suspend the queue.

What happens if I block a group and an individual hook in that group?

Both rules apply independently. If the group block is removed, the individual hook block still remains (and vice versa). There is no conflict between the two.

How quickly does a block take effect?

Immediately. The pre_as_schedule_* filters are checked every time an action is scheduled. As soon as the Minuttes plugin saves the blocking rule, the next scheduling attempt for that hook or group will be prevented.

How does hourly rate limiting decide which actions to delay?

The enforcement cron checks pending actions scheduled within the next 15 minutes and keeps the earliest ones up to the hourly limit. Excess actions are rescheduled to the top of the next hour. Actions that have already executed in the current hour count against the limit.

Can I use the Moat to completely stop a runaway plugin?

The Moat blocks scheduling only. If a plugin already has thousands of pending actions, those will still execute. To handle that scenario, use the Moat to block new scheduling (so the queue stops growing), then use Delete Actions by Status on the Overview page to clear the backlog.

What is the difference between the Moat and suspending the queue?

Suspending the queue stops all action processing for every hook and group. The Moat is surgical — it targets specific hooks or groups while everything else continues to run normally.