How to Display WordPress Custom Post Types From User-Generated Content
Need a front-end posting system to publish user-generated content and display custom post types? Here's the solution. Enjoy custom post type publishing, searching, and more!
Are you planning to build a platform powered by users' submitted content? Or maybe a guest posting site? You just need the right tools to make it happen and ensure scalability. Today we're going to share a true story based on such a platform. Let's start!
About 8 years back, I worked on a project with Suspended Coffees, a non-profit organization focused on encouraging random acts of kindness. The brief for this project was simple: a raft load of features on a tiny budget! We didn't have funds for any custom coding or development.
The project needed a solution that would work straight out of the box. It included front-end publishing, custom post types, member database, and so on.
We chose WordPress to add custom post types from the front-end. Formidable had everything we needed. We're going to share those experiences (and mistakes), so that you can hopefully achieve better, in less time, and with less stress.
We wanted to utilize the power of user-generated content in the age of Web 2.0. Because user-generated content is not just a trend. It actually helps define Web 2.0 and isn't going away. It shaped our story of WordPress front-end posting for custom post types.
Google's definition of Web 2.0.
Upgrade your WordPress site with powerful, flexible forms.
Getting started with front-end posting and displaying custom post types in WordPress
Have you ever worked on a project with this kind of requirement? Well, we had several ones! Our basic requirements included the following.
New member signups
Members to update their own listings
The ability to be searchable, and
Users needed to be displayed on a map
Allowing users to submit their own stories was also high on the wish list. With all of this user-generated content, admin moderation was going to be an essential feature too.
One example of user-generated content is a business directory map.
We did some research and discovered the Create Posts feature in Formidable Forms premium. This feature (in addition to the Views feature discovered later) covered everything we needed. So after a lot of planning and pre-sale questions, we took the plunge and started building.
Read more: Create a WordPress Job Board
From Idea to Reality in Minutes. Build Powerful Forms, Dashboards, Apps and More.
Formidable Forms makes advanced site building simple. Launch forms, directories, dashboards, and custom WordPress apps faster than ever before.
Form settings to display a custom post type.
To figure out Formidable Forms for the first time, we decided it'd be good to start with the simplest features first. We figured this was the user-submitted stories. John Sweeney, the founder of the Suspended Coffees movement already had an active blog. He wanted the option to add guest posts from time to time.
Once we'd read all the Formidable documentation on creating posts or pages from a form, we were set to work. We set up a simple post submission form to allow guest blog/story submissions. It included fields for name, email address, post title, the story, category, and an image upload.
Read more: How to Setup Front-end Posting in WordPress
Formidable's Post Status feature
Two features surprised us immediately. The ability to create a WordPress front-end post in draft mode was the first. We set up an email notification so the site admin would always be aware of new submissions. Then these submissions could be checked before appearing on the site. This prevented any unwanted material from being published. We also loved that we could edit user-generated submissions. We could even format them and add images, change the post meta, just the same as with a post created in the back-end of the website.
The second feature that really caught our eye was auto-populating the category choice drop-down. We'd expected the set up to be a bit more involved in the first place. We'd also expected to manually update the form any time new categories were added. Not so with Formidable!
For this form, we didn't need to set up a custom post type. These submissions would be appearing in the main blog along with all the other posts. The first cup of coffee was still warm when the form was published. We tested it and tweaked the finer details within the next hour. This part of the project was completed much more quickly than we expected.
Building the member database
Encouraged by the early success, we decided to tackle the membership database next. The plan was simple: create another form that created posts in a custom post type. This time the form would include a lot more detail, allowing people signing up to include social media and website links, contact information, and a full write-up/promo of their cafรฉ.
We didn't need any logged-in users or a profile builder. Hence, no complex user roles were required. Formidable handled the member database generation efficiently!
Form to submit & display custom post type with front-end posting.
It worked like a registration form for the cafรฉ owners- with further reviews of course!
Utilizing a mapping plugin
We'd found a WordPress mapping plugin that could take address fields from a WordPress custom post type and display them on a map (Codespacing Progress Map). This was so we could not only build a great directory, we could also have a map view and search function to display all participating cafรฉs. This is where a LOT of trial and error came in. While the initial build was quick, we soon realized our mapping plugin wouldn't do everything we needed, so we had to re-visit the search function later in the build.
Read more: How to Embed a Google Map With WordPress Form Submissions
Using a View to display custom post type submissions
The next challenge was to get the submitted data to look good in the created post. For this, we chose the "Customize Post Content" option to create a new View. Using some HTML along with the field shortcodes, we were able to display all the submitted details in a simple, custom layout that was easy on the eye. It even included a mini-map showing the location of the featured cafรฉ.
With our custom post type set up, our form created, and the mapping plugin configured to accept the submitted addresses, we uploaded our database of members and made the site live. Display custom post type, here we go! Then we sat back and watched happily as new signups came in nearly every day.
Pro Tip: Don't make this mistake!
We had initially planned to use the search function in Progress Maps, so our original form used one long address field. After a LOT of work and frustration, weย found it didn't work well for global searches. As many people would be searching for locations near holiday destinations or overseas family, weย decided to switch things up and use the more powerfulย search and filter functions of Formidable instead.
At this point, we realized that having separate fields for town/city/state/country, etc. would allow us to filter results much more effectively. Our database of nearly 3000 participating businesses was exported as a CSV and because of the nuances of international addresses, it had to be manually edited. To split up these fields before re-importing the data was a nightmare job that took one very patient team member nearly 3 weeks! The lesson? It's easy to combine separate fields, so always start that way!
Making the user-generated directory searchable
By far the most taxing part of the whole process for us was the search function. Not because it's actually hard to do, but because of bad planning (See the Pro Tip above) and simple stubbornness!
Yes, you could search Views in Formidable, but we were newbies. So, we spent a couple of weeks going round in circles trying out 3rd party search plugins and finding issues with every single one we tried. Eventually, we admitted defeat and opened a support ticket with Formidable.
The final step was to build the search form. We followed the guide and set ours up to allow filtering by country and state, as well as cafรฉ name and address. We were amazed at how easy it was to find any entry we needed. Now our users could use the visual interactive map to browse participating locations near them or use the Formidable search for specific cafรฉ names or locations. The two perfectly complemented each other.
A Formidable View search results for Suspended Coffees.
Displaying custom post type submissions
The Suspended Coffees project is pretty old now and another developer has since taken over maintenance of the site. It was a big challenge for someone completely new to Formidable, and this powerful plugin allowed us to achieve things with WordPress front-end posting that we hadn't thought possible. Since then we've gone on to use Formidable on all sorts of projects where a front-end edit screen was needed. We've even included it on some projects where it wasn't actually necessary, but the site owner simply found the Formidable Forms interface more user friendly than the WordPress interface.
Front-end publishing opens the door to user-generated content. It allows your visitors to get involved, while you build communities and the searchable directories to support them. If you need, you can create custom meta boxes, post types, and taxonomies as well.
How could displaying custom post types in WordPress change your online presence? How would a custom post type UI contribute to it? Share with us via comments. And yes, get started today with Formidable Forms to begin a new journey with user-generated content!
This article may contain affiliate links. Once in a while, we
earn commissions from those links. But we only recommend products we like, with or without commissions.
Limited time offer
Build beautiful & powerful WordPress forms in minutes
We use cookies to improve your experience on our site. By using our site, you consent to cookies.
This website uses cookies
Websites store cookies to enhance functionality and personalise your experience. You can manage your preferences, but blocking some cookies may impact site performance and services.
Essential cookies enable basic functions and are necessary for the proper function of the website.
Name
Description
Duration
Geolocation Config
This cookie is used to store the consent settings based on the visitor's location.
30 days
Cookie Preferences
This cookie is used to store the user's cookie consent preferences.
30 days
These cookies are needed for adding comments on this website.
Name
Description
Duration
comment_author
Used to track the user across multiple sessions.
Session
comment_author_email
Used to track the user across multiple sessions.
Session
comment_author_url
Used to track the user across multiple sessions.
Session
Easy Digital Downloads is a complete eCommerce solution for WordPress.
Name
Description
Duration
edd_items_in_cart
Stores information about the cart.
Session
edd_session_
Stores information about the current user session.
Session
Formidable Forms is used to manage forms on this website.
Name
Description
Duration
frm_form_
Saves the ID of the form and the time the entry was submitted.
2 hours
These cookies are used for managing login functionality on this website.
Name
Description
Duration
wordpress_logged_in
Used to store logged-in users.
Persistent
wordpress_sec
Used to track the user across multiple sessions.
15 days
wordpress_test_cookie
Used to determine if cookies are enabled.
Session
Statistics cookies collect information anonymously. This information helps us understand how visitors use our website.
Google Analytics is a web analytics service offered by Google that tracks and reports website traffic.
Used to determine if the user is in a new session/visit.
Session
__utmt
Used to throttle request rate.
10 minutes
__utmv
Used to store visitor-level custom variable data.
2 years
__utmz
Stores the traffic source or campaign that explains how the user reached your site.
6 months
LinkedIn is a professional networking platform for job seekers, employers, and industry connections.
Name
Description
Duration
fcookie
Used for bot detection.
7 days
AnalyticsSyncHistory
Used to store information about the time a sync with the lms_analytics cookie took place for users in the Designated Countries
30 days
ccookie
To remember if a user received a captcha challenge.
20 minutes
lissc
Pending
1 year
ABSELB
This is Load Balancer Cookie for affiliate marketing
2 years
spectroscopyId
These cookies are set by LinkedIn for advertising purposes, including: tracking visitors so that more relevant ads can be presented, allowing users to use the 'Apply with LinkedIn' or the 'Sign-in with LinkedIn' functions, collecting information about how visitors use the site, etc.
session
brwsr
This cookie is used to Affiliate Marketing Cookie for LinkedIn
2 years
UserMatchHistory
These cookies are set by LinkedIn for advertising purposes, including: tracking visitors so that more relevant ads can be presented, allowing users to use the 'Apply with LinkedIn' or the 'Sign-in with LinkedIn' functions, collecting information about how visitors use the site, etc.
session
lihc_auth_
Used by LinkedIn HelpCenter Live Chat to store language and chat start timestamp. Example names of this cookie include lihc_auth_en, lihc_auth_es, depending on language preference.
Session
lang
Used to remember a user's language setting
session
li_a
Used to authenticate enterprise users on Sales Navigator and Recruiter
30 days
li_gc
Used to store guest consent to the use of cookies for non-essential purposes
2 years
li_ep_auth_context
User to authenticate LinkedIn enterprise customers
30 days
li_rm
Used as part of the LinkedIn Remember Me feature and is set when a user clicks Remember Me on the device to make it easier for him or her to sign in to that device
1 year
bscookie
Used by LinkedIn to track the use of embedded services.
1 year
lms_ads
This cookie is used to identify LinkedIn Members off LinkedIn for advertising
30 days
trkCode
This cookie is used by LinkedIn to support the functionality of adding a panel invite labeled 'Follow Us'
1 year
_guid
This cookie is used to identify a LinkedIn Member for advertising through Google Ads
90 days
trkInfo
This cookie is used by LinkedIn to support the functionality of adding a panel invite labeled 'Follow Us'
1 year
BizographicsOptOut
This cookie is used to determine opt-out status for non-members
10 years
li_oatml
Collects information about how visitors use our site.
30 days
IRLD
This cookie is used for Affiliate Marketing Cookie for LinkedIn
2 years
liap
Cookie used for Sign-in with Linkedin and/or to allow for the Linkedin follow feature.
90 days
l_page
This cookie is used for measuring conversion metrics on LinkedIn
6 months
pushPermInfo
Used across multiple LinkedIn services to determine cool off for push notification prompts
365 days
pushPermState
Used across multiple LinkedIn services to determine the user's push notification permission preference
30 days
ln_or
Used to determine if Oribi analytics can be carried out on a specific domain
1 day
chp_token
Used to denote whether the user has gone through two factor authentication or solved a Captcha.
Session
li_sugr
Used to make a probabilistic match of a user's identity outside the Designated Countries
90 days
lidc
Used by the social networking service, LinkedIn, for tracking the use of embedded services.
1 day
sdsc
This cookie is used for signed data service context cookie used for database routing to ensure consistency across all databases when a change is made. Used to ensure that user-inputted content is immediately available to the submitting user upon submission
Session
bcookie
Used by LinkedIn to track the use of embedded services.
1 year
li_mc
This cookie is used as a temporary cache to avoid database lookups for a member's consent for use of non-essential cookies and used for having consent information on the client side to enforce consent on the client side
6 months
PLAY_FLASH
Used by some LinkedIn services to facilitate the display of messages on page transitions . Users include notifying a user when a form is successfully submitted or fails , and to provide other similar notifications.
Session
li_referer
Used to detect bots. Cookie remembers the referring website before redirecting the user to captcha for authorization
15 minutes
f_token
Used to detect bots for anti-scraping
3 minutes
li_apfcdc
Used for triggering the abuse prevention features on member device.
10 hours
li_odapfcc
Used to control the number of abuse prevention features collected from member device.
2 Years
ac_L
Counts the number of times the account center banner, which is displayed to inform users with an incomplete profile how to complete their profile, was closed by a user to determine display logic
180 days
ac_LD
Contains the date when the account center was displayed to a user to determine display logic
180 days
recent_history_status
Used to determine whether a user enabled or disabled the Guest Recent History Setting
10 years
all_u_b
To know if a user has opted in to viewing LinkedIn on an unsupported browser
21 days
uh
Used to set the user preference for the mobile web platform via a user's settings
Session
abiRedirect
Enables import of address book during onboarding flow for users who choose to import their address book
Session
wwepo
Used to ensure that useres who choose to sign up using phone only have that setting and preference respected
90 days
li_cu
Used to map a user to a captcha challenge page
15 minutes
li_ec
Used to store unbound enterprise users' cookie consent
6 months
denial-client-ip
Stores user IP address for anti-scraping and DOS prevention
5 seconds
li_gpc
Used to remember a user's preferences on LinkedIn's Global Privacy Control
1 hour
denial-reason-code
Used for anti-scraping and DOS prevention
5 seconds
li_gp
Stores privacy preferences for guests to LinkedIn
1 year
rtc
Used as part of anti-abuse processes on LinkedIn
120 seconds
redirectFromM2MInviteSent
Used to notify and provide the appropriate profile display logic when the user sends an invitation to connect on LinkedIn from a LinkedIn member via email.
Session
queryString
This cookie is used to persist marketing tracking parameters
15 days
cookie.policy.banner.eu
Used to display cookie banner in LinkedIn Lite
365 days
cookie.policy.banner.nl
Used to display cookie banner in LinkedIn Lite on the Netherlands site.
365 days
appName
Used to identify the source as the LinkedIn Lite app to send the right service worker to the app
Session
appLang
Used to set the right language on the LinkedIn Lite app
Session
lls-integration
Validates whitelisted partners for content integrations
30 days
feed-sort
Used to remember a member's preference how the feed should be sorted
1 day
integration_type
Used to determine which integration traffic is coming from to render the profile namecard experience
30 days
li_theme_set
Remembers which users have updated their display / theme preferences
6 months
PLAY_LANG
Used by some LinkedIn services to remember a user's language preference
Session
lms_analytics
Used to identify LinkedIn Members off LinkedIn for analytics
30 days
PLAY_SESSION
Used by some LinkedIn services to store session information
Session
li_fat_id
Member indirect identifier for Members for conversion tracking, retargeting, analytics
30 days
redirectFromM2MInviteAccept
Determines the appropriate profile display logic when a user accepts an invitation to connect on LinkedIn from a LinkedIn member via email.
Session
li_giant
Indirect indentifier for groups of LinkedIn Members used for conversion tracking
7 days
sharebox-suggestion
Displays a banner that provides help text to first time users of the Elevate share box
Session
li_cc
Used to ensure a user's phone number is inputted in China
1 week
lss_bundle_viewer
Stores consent when a user agrees to view a Smartlinks link
1 month
interstitial_page_reg_oauth_url
Stores the referring page to ensure the Authentication screen displays correctly
1 day
df_ts
Device fingerprinting sampling for performance optimization
1 day
lil-lang
Stores user's selected language setting for LinkedIn Learning
Session
li_alerts
Used to track impressions of LinkedIn alerts, such as the Cookie Banner and to implement cool off periods for display of alerts
1 year
li_theme
Remembers a user's display preference/theme setting
6 months
li_feed_xray
Used to show new items in developer option 'Feed X-ray'
Session
VID
ID associated with a visitor to a LinkedIn microsite which is used to determine conversions for lead gen purposes
1 year
recent_history
Used to remember URLs visited by the guest to show the pages back where they left off
90 days
Marketing cookies are used to follow visitors to websites. The intention is to show ads that are relevant and engaging to the individual user.
Name
Description
Duration
affwp_campaign
Stores the affiliate campaign name for tracking purposes.
30 days
affwp_ref
Stores the referring affiliate ID for commission attribution.
30 days
affwp_ref_visit_id
Stores the visit ID linked to the referring affiliate.
30 days
LinkedIn Insight is a web analytics service that tracks and reports website traffic.