Using the Participants Database Plugin

Shortcodes this Plugin Uses

This plugin uses a number of different shortcodes to place it’s functionality in your content. Here is a list of all the shortcodes with a brief description:

  • [pdb_signup] – This prints out the signup form including only those fields selected for inclusion. On submission, it creates a new record and optionally notifies the admin and the person signing up by email.
  • [pdb_list] – This shortcode prints out a list of records from the database. Which records get displayed and how can all be determined in the settings or in the shortcode. You can optionally show a search and/or sort control with the list.
  • [pdb_single] – This shows a single record as determined by the record ID present in the URL used to access the page. It is possible to set a link to the single record in the record list, allowing for a detail display of a single record.
  • [pdb_record] – This shortcode only displays when accessed with a URL including the record “private id” number. It allows the user to edit and add to their own record, while others won’t have access to it. A private link to this record can be included in the “thankyou” email they will receive on submission.
  • [pdb_signup_thanks] – If you want to send the people who use the signup form to another page after they submit, you can use this shortcode to display the thank you message. This is not needed if you have them just go back to the signup page, the signup shortcode will take care if it.
  • [pdb_search] – used if you want to place the search form in a separate location from the list. When the search is performed, the user is taken to a page with a list shortcode and shown the result of their search.
  • [pdb_request_link] – shows a form for requesting the private link to be resent.
  • [pdb_total] – shows the either the number of records matching a given filter or the numeric total of a given column of values.

Take a look at this article for a full explanation of all the shortcode attributes you can use: Shortcode Attributes

Showing a list of records

You can use the [pdb_list] shortcode to show the records on your site. Just put the shortcode where you want it to show up. Here is the full list of parameters you can use with the [pdb_list] shortcode:

  • search – set to ‘true’ to show a list search field
  • sort – set to ‘true’ to show a list sort field
  • fields – a comma-separated list of fields to show (only needed to override the setting on the Manage List Columns page)
  • list_limit – sets the number of records to list per page (defaults to the plugin setting value)
  • template – allows you to select the template that is used to show the list of records
  • filter – lets you determine which records are shown (see List Shortcode Filters for a detailed explanation)
  • orderby – order the list by one of the columns
  • order – determines whether the list is ordered in ascending (asc) or descending (desc) order
  • display_count – if set to ‘true’ will display a total of all records
  • suppress – prevents any record from showing until a search is performed

You can set the number of records to show per page with the ‘list_limit’ setting. To show all records, use list_limit=-1

Determining Which Columns Show in the List

Which columns are shown by the shortcode is set up on the Manage List Columns page. On that page you’ll find a handy drag-and-drop interface for setting up the columns for the frontend list display and also the admin Participant List display.

You can also set the columns to display for an individual shortcode by including a list of the names (not Titles!) of the fields you want to show in the order you want to show them:

[pdb_list fields="last_name, city, email, photo"]

If you want to get tricky with the CSS, each header column has a class name that corresponds to the name of the field, you can use CSS to lay out the listing exactly as you want.

Sorting the List

The order in which records are shown in the list is determined first by the settings under the “List Display” tab in the plugin settings. It is also possible to set the sort of the list in the shortcode using the “orderby” and “order” attributes. For example: [pdb_list orderby=last_name order=desc] You can also sort by multiple columns with a comma-separated list of field names, like this: [pdb_list orderby=date_recorded,last_name order=asc,desc] That example will sort the list according to when the record was created in ascending order, then by the last name in descending order.

Numeric Sorting

By default all sorting of lists is done alphabetically, which means that if you have a field that is numeric (like prices or rating points) you will not get a numeric sort if you use that field to sort the list. If you need to do this, you must manually edit the database to make your numeric field work like a number and not a word. Here’s how you do that:

Get into your database using PHPMyAdmin or similar application. Click on the structure tab of the ‘participants_database’ table. This shows you the types of all the fields that are used to store the data. You will recognize the names, and most of them will be of type TINYTEXT. You need to change the field type for only the fields where your numbers are stored.

Click on the little pencil to edit the field where you have numbers. You need to decide the range of numbers you will be using. Lets say you need to be able to go up to 9999 with two decimal places. Change the type from TINYTEXT to DECIMAL. In the LENGTH/VALUES field, put the size of number you want to use…our example would be 4,2 giving you up to four figures to the left of the dot and two to the right. Save it and now your sorts on that field will be numeric. This also applies to comparisons in the shortcode filter.

Please note that non-numeric characters cannot be stored in a DECIMAL field, including commas and currency symbols.

Let Your Users Search and Sort The List

You can activate list searching and/or sorting for your users with these attributes: [pdb_list search=true] or [pdb_list sort=true] These attributes will enable a search form and/or sort form displayed above the list. The user can select which field they want to search through a dropdown and type in a search term. Only fields that are displayed can be searched. For sorting, the fields offered for sorting must be checked as “sortable” and also be present in the list display. There are two search modes for the list: strict or not strict. If the “Strict User Searching” setting (this is in the plugin settings) is checked, the search term must match exactly the whole contents of the field in order to be found. If unchecked, the search will show any records where any part of the searched field contains the search term. The search function is pretty simple, only searching only one field at a time. If you need more control over the search functionality you offer your users, you will need to create a custom search function for that purpose. I have created an API to make this kind of custom functionality easy to create, but knowledge of PHP and HTML will be needed to take advantage of that. I also offer auxiliary plugins that can add enhanced search functionality.

Search Wildcards

The search from will accept wildcards for more control over the results. The asterisk stands for any string of characters, while the question mark stands for a single character. To search for all entries that begin with the letter “b” for instance, you would use the search term “b*”

If you want the list of records to only appear as a search result, add the “suppress” attribute to the shortcode like this: [pdb_list search=true suppress=true]

Filtering which Records Get Shown with the List Shortcode

Each list shortcode can have a filter that determines which records are shown in that list. This is explained fully here: List Shortcode Filters

List Shortcode Templates

The list shortcode has four built-in templates which provide the basic display framework for showing the list of records.

  • default – shows the list in a standard WordPress table. The number of columns is determined by the number of fields you have set up to show in the list.
  • bootstrap – shows the list of records in a table, but with standard “bootstrap” formatting. Best used with themes based on Bootstrap.
  • responsive – a template designed for responsive displays, meaning it tries to look good on a mobile display. Instead of using a table, the records are shown each as their own block of field values. This is so the display can “collapse” when viewed on a small screen.
  • flexbox – this template uses the powerful Flexbox layout system implemented in modern browsers. This one is fairly technical to use, but it provides a lot of possibilities.

Templates are selected by placing the name of the template in the list shortcode. (This is also how Custom Templates are used.) For example:

[pdb_list template=responsive]

Approving Records for Public Display

One application for the list filtering option allows you to control whether a record gets displayed, giving you an approval process for new records.

In the default set of field provided with the plugin, there is a field in the Administrative group named “Approved” (If you don’t have this field, create one the the Administrative group. Call it “approved” and make it a checkbox type field. Put this in the values for the field: yes,no with a default value of ‘no’.) You can also set the default value to “yes” if you want to use it as a “disapproval” function.

With the Approved field in place, use a shortcode like this to display your list:

[pdb_list filter='approved=yes']

Now, only records that have been approved will be included in the list display. You may need to do something like this if you get a problem with spam, for instance.

If you’re using it as a “disapproval” function, set the filter the opposite, like this:

[pdb_list filter='approved!=no']

Admin List Filter

The admin listing now allows a range of dates to be entered in the search field: just type in the first and last dates you want to see, separated by the word “to” like this:

July 1, 2013 to Aug 1, 2013

This works for timestamp fields as well.

Showing a Single Record

To show an individual record on the website, use the [pdb_single] shortcode. This is usually configured on the “List Display” tab as explained in the next section.

This shortcode has two templates available to it: the default, which uses a table-based layout and “bootstrap” which uses a more responsive layout, and is used with a shortcode like this: [pdb_single template=bootstrap]. Custom templates are also possible.

By default, all fields that are in public groups will be shown by the single shortcode. You can also determine which fields are shown using the “groups” or “fields” attribute of the shortcode. The “groups” attribute lets you determine the field groups to show in the shortcode, for example: [pdb_single groups="main,address"] The “fields” attribute works the same way, but it is a list of field names.

While a list is a good way to show a lot of records, you can only show a limited amount of data from each record. A good way to deal with this is to add a clickable link to each record in the list that, when clicked, takes the user to all the details contained in that record. You can see this in action on the Demo Page, where there is a link on “View Details” that takes you to show all the values in the record.

You can set this up by creating a page for your single record display, then put the [pdb_single] shortcode on that page. In the plugin settings, under the List Display tab, look for “Single Record Page”: set that to the page where your [pdb_single] shortcode is. Then, in “Single Record Link Field” choose which field will be the link to the single record page. You can set the link on any text field or an image field.

Setting up a “View Details” Link

If you want to make a field that is just for linking to the record, create a new field for that purpose. Make it a “placeholder” type field and put as the default value the text you want to use for your link. In the demo, it has “View Details” there. Now, in the plugin settings under the List Display tab, select your placeholder field in the Single Record Link Field setting.

The Signup Form

To create a new record on the frontend of your site, you must use the “signup” form. The fields included in this form are defined in the “signup” column on the Manage Database Fields page. It is also possible to define which fields are presented in the form in the shortcode itself using the “fields” attribute as described above. This is one way it is possible to have different types of signup form. When a user fills out a signup form, the can be sent a receipt email confirming the submission. This email may also contain a private link to a page where their record may be edited. It is also possible to have an email notification sent to an admin when a signup occurs. These actions are set up in the settings under the “Signup Form” tab. When a signup form is submitted, the user can be directed to a “thank you” page acknowledging their submission.


If you need a simple way to stop registration bots from sending in spam submissions, there is a CAPTCHA field that asks a random simple math question. For coders, the plugin API provides an easy way to add your own custom test.

If you want to give the user the ability to receive their private link again, check “Enable Lost Private Link” under the Resend Link tab on the settings page. Check the other settings there to complete setting it up. The user will be asked to supply a piece of information that will identify their record. Their private link will be sent to the email address saved with the record

The private link request form will normally replace the “signup” form, but you can put the private link request form on another page. Select that page in the “Lost Private Link Page” setting and place the [pdb_request_link] shortcode on that page.

Hidden Signup Fields

There is a field type called “hidden” that can be used to add dynamic values to the signup form submissions. For instance, if you had the signup form in multiple locations on your blog, you could know which page the user was on when they signed up because the page name would be placed in a hidden field. Here is a quick tutorial showing how to add a field that tracks the page the signup form is on:

  1. Add a new field with a descriptive name, like “source page”
  2. Make that field a hidden type
  3. For the default value, put “post->post_title”
  4. This will fill in the title of the page the signup form appears on.

When the form is submitted, the information in the hidden field will be included. At the moment, only two WordPress objects are available: $post and $current_user. You can look these up in the codex to see what properties you can access. The way this works is simple: just put the name of the property in the default value field for the hidden field. For instance “current_user->user_login” will put in the user login of a logged-in user. You don’t need the dollar sign, it will ignore it if you do put it in.

You can also access some PHP “Superglobals.” For instance, to get the IP of the user, put this into the default: “SERVER:REMOTE_ADDR” You can access these superglobals: POST, GET, REQUEST, COOKIE, SERVER, SESSION. This means you can get a value from a cookie and put it into the form, saving it when the form is submitted. You don’t need the ‘$_’ that is used in PHP. The PHP site has a good reference for using superglobals. Superglobal arrays can be accessed with an index like this COOKIE:location[city] where “city” is the index in the array $_COOKIE[‘location’].

For example, if you wanted to set up referral tracking for the signup form, you would create a hidden field to hold a referral code. Set the default value to get:ref This means that it will be looking for a variable named “ref” in the URL: When that URL is used to open the signup form, the referral code 12345 will be saved with the signup data.

If you just want to put in a fixed value, the hidden field will include any string you put into the “default” for the field. This can be useful as a place to put links in a list or single record display.

For those with some Javascript skills, you can use these hidden fields to store dynamic information about a signup. The template file makes a convenient place to include your custom Javascript. Dynamic hidden fields also work in the form presented by the [pdb_record] shortcode. These fields are visible and editable in the admin edit page.

Setting Up the Signup Form “Thank You” Page

To have your visitors go to another page after they submit a signup, go to the settings page and set the “Signup Thanks Page” setting to point to your page. Place the [pdb_signup_thanks] shortcode on that page to display the thank you message. You don’t have to use the shortcode, but it gives you a way to thank them using their name. It’s also possible to use this feature to make filling out the signup form required in order to get to another (hidden) page on your website.

It’s also possible to determine which page the user goes to after a successful submission in the shortcode, by using the “action” attribute. For instance, of you were using more than one signup form, this makes it possible to send users to a different thank you page depending on which signup form was used.

The Search Shortcode

This shortcode gives you a way to show a search form on it’s own and send the user to another page (or a different part of the same page) to see the results of their search. This shortcode is not needed if you want to place your search just above the list. Use the “search=true” attribute in the [pdb_list] shortcode in that case.

The shortcode has an attribute named “target_page” which tells the search form where the search results page ([pdb_list] shortcode) is. You don’t need to use this if the search shortcode is on the same page as the target list, but if you put the search shortcode into a widget that can be on any page, you’ll need it.

If the target page has more that one Participants Database shortcode on it, you’ll need to tell the search shortcode which “instance” to update with the search results. This is done using the “target_instance” attribute. To find the instance number of your target list, take a look at the HTML of the page where your result list is shown. Wrapping your result list will be a “div” tag with a class containing something like “pdb-instance-2” That “2” is the instance number for that list, so you’ll need to put a 2 for the target_attribute value in the search shortcode.

If you have the search shortcode on the same page as your list shortcode, you will need to use this attribute in order for the search to work correctly.

[pdb_search target_page="search-results" target_instance=2 ]

The “Total” Shortcode

This shortcode provides an easy way to show stats and totals from the database. In it’s simplest form , it shows the total number of records, but you can use the filter attribute to show other totals such as the totals from a certain location, or just to show only approved records and stuff like that.

This shortcode can also be used to show a calculated total from the data stored in any field. Put the name of the column to be totaled in the “fields” attribute and all the numbers stored in that field will be summed and displayed. The “filter” attribute can be used to limit which records are included in the total.

The shortcode template is where all the math happens, and this gives you the flexibility to show things like cumulative standings, earned totals, or the time elapsed since a date stored in the database (for instance, an age based on the birthday field). Because it’s in a custom template any kind of calculation that you can think of is possible. Take a look at the template file for this shortcode (pdb-total-default.php) for a simple demonstration of how that can be done.

The output of this shortcode is simply a number, so it can be used inline or you can  put a bunch of them on a page to show several things at once. For instance:

There are [pdb_total filter="approved=yes"] signups so far!

The Groups Attribute

The “groups” shortcode attribute greatly simplifies managing which fields are shown. For the ‘signup’, ‘record’, and ‘single’ shortcodes, when the groups attribute is defined, only those fields contained in the groups named will be shown. For the “signup” forms, the fields must also be enabled for the signup form.

Form Templates

All shortcodes use a template to determine how they are presented. Plugin default templates are found in the “templates” directory in the plugin directory. There are several examples to show you a little of what is possible. I have created a page to guide you through the process of creating a plugin template here. Please note that using templates will require some understanding of HTML, CSS and PHP.

>>How to use custom shortcode templates…

The default and example template files include comments to help you develop your own templates easily.

Single Record Templates

Templates for the single record shortcode include an array that can be used to prevent some fields from displaying. Let’s say you wanted to exclude the city, state and postcode. In that case the array would be filled with those names like this: $exclude = array('city','state','postcode'); These fields will now be excluded from the display. Of course it is also possible to determine which fields are shown in the shortcode using the “fields” attribute. The template offers many other opportunities to customize the output of the [[pdb_single]] shortcode to match your theme.

Image and File Uploads

Images and files can be uploaded through the “image upload” or “file upload” form element types. The allowed file types are set globally in the settings (General tab) or they can be set for each field by listing the allowed file extensions in the “values” field for the field. Please note that file uploads can present a security risk. The plugin offers some protection from malicious use by renaming the uploaded files to insure that only an allowed file extension is present in the filename. It is important to make sure your web server is configured so that your allowed file types cannot be executed as scripts. Ask your web host tech support if you are unsure about this.

Image and file uploads can be stored anywhere in the WP install directory, and can be moved without breaking image sources and links. The ‘File Upload Location’ setting will always determine the location for the images and files. IMPORTANT: Don’t store images or any other custom information in the plugin directory because they will be deleted by automatic upgrades. The default location for plugin uploads is in “wp-content/uploads/participants-database/” and for most installations this is a good place to keep them.

Importing & exporting CSV Files

CSV is a common file format for exporting or importing databases and spreadsheets. You can export a CSV file from your spreadsheet or database and import the records into the plugin. It can be a tricky process, so I’ll offer a few hints here on getting it to work.

The import will work most reliably if the CSV file has it’s fields delimited by a comma and the text enclosed by double quotes. (this is actually only required for a field that contains a delimiter character) The first row should be a header row containing the column names (which are the same as your field names). The encoding of the file must be UTF-8. On the CSV import page is a button to export a blank CSV file in the correct format to get you started. It is critical that your database or spreadsheet application be able to export the CSV in the proper format for the process to work. In some cases, you may have to open your CSV file (as exported from your spreadsheet or database) in a text editing application for further modification to get everything working. This must be a plain-text editor, don’t try this with a word processor! In particular, if your data has both double and single quotes (which are also apostrophes!) in it, it will be very difficult to import because one of the two will need to be used as the text delimiter. This does not apply to “curly” quotes and apostrophes, which are not enclosure characters. I suggest you convert quotes and apostrophes that are part of blocks of text into their HTML equivalents: ' for apostrophes and single quotes and " for double quotes. This way, the text delimiter can do it’s job without other characters interfering. You will probably have to use a text editing application to make these substitutions.

The “Image Upload Location” setting in the plugin is important here because that is where the plugin will place the uploaded CSV. The default setting for this is ‘wp-content/uploads/participants-database/’ If the plugin does not find the directory specified in the “Image Upload Location” setting, it will attempt to create it. It should notify you if it fails, and you may have to create the directory manually (using an FTP client, for instance) to get the CSV import to work.

The plugin can also export a CSV file from the “List Participants” page. The same fields that are selected to import with the CSV will be exported. If the list is getting filtered (for instance, with a date range) only those records will be exported. If you are planning to export records from the plugin and then re-import them (for instance, if you wanted to edit them in a spreadsheet application) you should export them with the record ID numbers. Then, when you re-import them, make sure the setting under the “Signup Form” tab is set to overwrite matching records and that the matching field is “Record ID.

Multiple-page Forms

Multiple-page forms are now easily implemented using the new “action” shortcode attribute. When a signup or record form is submitted, the user will be taken to the page named in the “action” attribute. If that page has a [pdb_record] shortcode, it will show an edit form for the same record, but by configuring each shortcode to show a different set of fields, the whole form is broken up into separate pages. The user can even leave the form and return to finish it, each page updates the database when it’s completed.

Check this post for a tutorial: Creating Multiple-page Forms in Participants Database.

Plugin Support

I do monitor the WP forums and comments page on my own website for support requests. I very much appreciate bugs being brought to my attention, so please let me know if things are broken or not working as expected. I only ask that you read the documentation before posting with support requests because it will save us both valuable time. Many of the issues people have are due to improper setup or use of the plugin…this is partly due, I know, to shorcomings in the documentation. It is a complex plugin with lots of options, so it can be difficult to explain how it works in a way that everybody will understand.

About Plugin Display and CSS

I get a lot of questions about how to make the plugin’s output look like the site it’s on or how to make things look different. I have made efforts to set up the plugin output to work most of the time out-of-the-box, but with so many themes out there and so many ways to control how things look, things don’t always look right. While I try to answer specific questions about formatting the output of the plugin, most questions about CSS are far too general for me to answer with a fix. If you are responsible for what things look like on a website, I think you should have an understanding of how the CSS and stylesheets work on the site. The single most helpful thing you can do if you want to understand how the CSS is working is use Firefox with the Firebug extension. It will show you what CSS rules are affecting any element of the page and also allow you to edit the CSS and see the effects of your changes right away without breaking the display for other users. You can learn a lot that way. If you want to get help with a particular aspect of the display, be specific, say what you want to see, and if possible provide a link for people to see what you’re talking about. Questions like “things are messed up, something’s wrong” will probably be ignored.