View Categories

Put Recurring Controls on a Front-End Page

Goal: let a team operate schedules without sending them into the WordPress admin.

Before you start: both shortcodes are administrative views. They render only for users holding recurring_form_submissions_manage_resubmissions, and output nothing at all for anyone else.


Option 1 — A Read-Only Dashboard #

One page, one shortcode:

[rfsfgf_overview]

Columns: Entry, Form, Feed Name, Feed Label, Next Submission, Progress, Status.

Narrow it with the status attribute:

[rfsfgf_overview status="failed"]
[rfsfgf_overview status="paused"]
[rfsfgf_overview status="all"]

active (the default) lists everything except completed and canceled. Because completed and canceled series are retained for the history window, all lists more than it used to — ask for the status you actually want.

This table requires the Premium plan or higher.


Option 2 — Controls for One Entry #

[rfsfgf_entry_widget form_id="12" entry_id="345"]

This renders the same cards as the entry page, with:

  • Run Next Submission Now
  • Retry Failed Submission
  • Start Series From Now
  • Cancel Series (Premium plan)

Pause, Resume, Change next submission, attempt history and diagnostics deliberately stay in Queue.


Option 3 — A List-and-Detail Pattern #

The useful combination: one page that lists series, and one that operates a chosen entry.

The list page #

Add [rfsfgf_overview], or build your own list (a GravityView view works well), and link each row to your detail page with the entry ID:

https://example.com/schedules/detail/?rfsfgf_entry=345

The detail page #

[rfsfgf_entry_widget entry_id="current"]

current reads the entry from the request, checking rfsfgf_entry first, then lid, then entry_id.

rfsfgf_entry is the unambiguous choice for your own pages; lid is supported because that’s what Gravity Forms uses on its entry screens.


Behaviour on the Front End #

Aspect Behaviour
Actions Use AJAX and refresh the cards in place, on the page they were performed on.
Without JavaScript The ordinary form submission returns to the same page with its result notice — never a redirect into the dashboard.
Security Operational requests go through the same capability-checked and nonce-checked handler as the dashboard. No new endpoint is added.
Mismatched form_id Renders nothing, rather than another form’s feeds.

Access Control #

The default #

No management capability → nothing renders. That’s the whole widget, not just the buttons.

Granting access to a team #

Give the role the recurring_form_submissions_manage_resubmissions capability with your role editor. Those users then get both the view and the actions.

Letting someone view only their own #

Use rfsfgf_shortcode_can_view to widen the read without widening the write:

add_filter( 'rfsfgf_shortcode_can_view', function ( $can_view, $context, $args ) {
    if ( 'entry_widget' === $context && ! $can_view ) {
        return get_current_user_id() && (int) rgar( $args['entry'], 'created_by' ) === get_current_user_id();
    }
    return $can_view;
}, 10, 3 );

The buttons and the handler behind them still require the management capability, so a user you let see a card cannot submit from it.

Scope any widening tightly. Returning a bare true shows every user every series’ entry, form, feed and failure state.

Page-level protection #

Still worth applying — a members-only page, a password, a restricted menu. It is no longer the only thing protecting the data, but it’s a sensible second layer.


A Sensible Setup #

Page Who can reach it Contents
Schedules Operations team [rfsfgf_overview]
Schedule detail Operations team [rfsfgf_entry_widget entry_id="current"]
Needs attention Operations team [rfsfgf_overview status="failed"]

Keep Queue as the place for schedule editing and forensics. The front-end pages are for the routine day-to-day.