Getting Started

Are Groundplan Events Custom Post Types?

Yes!  Both Events and Venues are set up as WordPress Custom Post Types.  Event Instances (aka performances or showings of the same event) are set up as a Posts 2 Posts relationship between the Event and Venue.  Groundplan supports multi-venue organizations, touring productions, film festivals, museums.  Performance data is stored in an efficient join table within the WordPress database, and Groundplan is built with functions to help developers easily query event and performance data. 

How many sites can I use my Groundplan license on?

You may activate your license on up to 2 sites - a live server and a testing server.

There is no limit on local development environments. A development environment is a site that is not available to the internet on your local machine, such as a vagrant or MAMP/XAMP environment running on localhost or, for example. You may need to purchase additional licenses for a staging environment if you’re developing on a live domain, or you can deactivate the license on one of your staging environments after installation to work around this constraint.

Do I need to purchase the Advanced Custom Fields PRO WordPress plugin to use Groundplan Pro?

ACF PRO is now included in Groundplan. If you have the free version of ACF, disable it and take advantage of the PRO features.

Can I retrieve all PatronManager event fields?

All Event and Venue fields available through the API are available to WP, and the following are hooked up by default.


  • Detail [Description]
  • Address


  • Description (Short Description in WP)
  • Detail (Long Description in WP)
  • General Event Direct Link
  • Sort Order

Event Instance

  • Event Instance Direct Link (Links to quantity or seat selection for that event instance)
  • Instance Date [Start Time in WP]
  • Sale Status (either for sale or Sold Out - Groundplan can handle auto-archiving events through our calculated Eventstatus postmeta)
  • Venue

Other PatronManager information like your ticket allocations and number of available tickets is also stored in a site transient and is available for customization. When available tickets are reduced to 0 while still onsale, an event instance is automatically updated to a “Sold Out” status which appears in Groundplan responsive calendars.

It’s also possible to add additional fields to the API using a PatronManager / Salesforce process of adding fields to a field group which Gameflow can help you with if necessary.


How do I hide Venues from Search Engine and search results?

This sample function modifies Venue detail pages from being displayed to the public. 

// Disable Venue pages
functionmy_venue_post_arguments($args) {  

// Configure any arguments to the WP function register_post_type()  
$args['exclude_from_search'] = true;  
$args['publicly_queryable'] = false;  return$args;

add_action('xdgp_venue_post_arguments''my_venue_post_arguments', 10, 1);

The same function can be adapted using the xdgp_event_post_arguments filter as well.

I want to display the venue on my event detail template, but I notice that only performances have venues, not events themselves. How should I display the venue?

Groundplan is built to serve a wide variety of multi-venue organizations - many have events that sit in one venue (think of a musical), and many have events that are itinerant between multiple venues (think of a film shown multiple times in a film festival,... or a touring musical.)

For this reason, each event instance has a separate connection to a venue Post Type to allow the event to "travel" between venues if necessary.

If you're an organization that doesn't need this level of flexibility, but would like to display information about the venue on an event-level template, there's a few strategies you can use:

  • the xdgp_load_all() function will lazy load venue information into each performance.  If you know that all events on your site will only be presented in one venue, you can pull the first performance ($event_post->performances[0]) and get venue information out of that object.
  • If you *sometimes* present events in multiple venues, you can also loop through the entire $event_post->performances array.  If all performances share the same venue information, display the venue information.  If not, hide the venue information (and you may want to use the groundplan mini calendar on your layout to help your audience find the audience in the correct venue) 

Monthly Calendar Customization

Can I enable the modal for the monthly calendar?

Not at this time, but this feature is something we're closely looking at for our roadmap as we extend Groundplan's API capabilities. You can roll your own solution by taking advantage of the calendar's event data JSON attribute:

$calendar = new XDGPCalendar($args);
$calendar_date_data = json_encode($calendar->events_by_date[0]);

On the monthly calendar, can the buy button on each performance be removed?

Yes, you can use the performance level DOM hooks

Use the xdgp_calendar_display_event_link hook to achieve this:

function remove_buy_buttons($link, $event, $performance) {
 // if the link is empty, the buy button will not display.
 $link = false;
 // You can also use event and performance data to calculate your own preferred link along with custom buy button text.
 return $link;

Is there a way to output the venues in a dropdown list for the monthly calendar without re-writing the entire output?

In the arguments for the calendar shortcode or function, select the arguments:

  • show_venue_filters = true
  • genre_nav_style = dropdown

Note that all genre filters currently need to have the same Navigation style, either dropdown, exclude, or click_to_show.

Can I set a default URL for all Buy Tickets buttons on the monthly calendar? 

Example usage: I want to keep Priority=Tickets but change the Buy button across the board for all events to link to a Season Subscription page until single tickets go on sale.

The simplest "manual" method is to just update the Event Instance and General Ticket URLs on the Event Detail to the internal URL - these will NOT be overridden during normal syncing until the Event Instance URL is deleted.  However, you'll need to then quickly remove and resync these URLs when single tickets go onsale later.

A slicker method if you're comfortable with the code is to set up a "Season Pass Mode" with some custom fields and logic, and the xdgp_calendar_display_event_link hook, which filters all buy ticket links on all calendars.  You could adapt the following:

1) Create a Season Pass URL field somewhere in a global options page using ACF Custom Fields.
2)  Modify and add the following filter to your functions.php file and adjust it to check the season Pass URL.  If the URL is set, return the season Pass URL, otherwise return the default $link.  (You can use this method to make some intuitive controls that match your client's business processes if you like, such as an onsale date timer that automatically switches to regular links at a particular time.)

function my_onsale_calendar_event_link($link, $event, $performance) {

// Check the Season Pass URL
$season_pass_url = get_field('season_pass_url', 'option');
if (!empty($season_pass_url)) {
return $season_pass_url;

return $link;

add_action('xdgp_calendar_display_event_link', 'my_onsale_calendar_event_link', 10, 3);


Event Queries

When I query events, why are only 10 events are being returned when I have many more?

All WP_Query queries default to your maximum posts per page settings, to aid in managing performance.  If you add either 'posts_per_page' = -1 or 'nopaging' = true to your query that will return all events. 

How are event queries sorted in Groundplan?

On archive pages or when you're querying a set of Event post types, by default the query returns only upcoming shows, sorted by the last performance in ascending order (so shows closing soon are prioritized.)

When values are not set for meta_query, meta_query→relation, orderby, and/or order, the following defaults are used:

'orderby'=> 'meta_value_num',
'order'=> 'ASC',
'meta_key'=> 'last_date',
'meta_query'=> array(
   'relation'=> 'AND',
     'key'=> 'last_date',
     'value'=> time() - (60*60*24), // Events hidden 24 hours after last performance
     'compare'=> '>'
   // Any other meta_query arrays you have set in your query

This functionality is set by MCEventPostType::order_archive_by_date(), which is called on the action pre_get_posts.