Last active
October 16, 2023 11:51
-
-
Save jaredatch/934515afe3a047559e9d092923a9320c to your computer and use it in GitHub Desktop.
WPForms display form entries with a custom shortcode
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Custom shortcode to display WPForms form entries. | |
* | |
* Basic usage: [wpforms_entries_table id="FORMID"]. | |
* | |
* Possible shortcode attributes: | |
* id (required) Form ID of which to show entries. | |
* user User ID, or "current" to default to current logged in user. | |
* fields Comma seperated list of form field IDs. | |
* number Number of entries to show, defaults to 30. | |
* | |
* @link https://wpforms.com/developers/how-to-display-form-entries/ | |
* | |
* @param array $atts Shortcode attributes. | |
* | |
* @return string | |
*/ | |
function wpf_entries_table( $atts ) { | |
// Pull ID shortcode attributes. | |
$atts = shortcode_atts( | |
[ | |
'id' => '', | |
'user' => '', | |
'fields' => '', | |
'number' => '', | |
], | |
$atts | |
); | |
// Check for an ID attribute (required) and that WPForms is in fact | |
// installed and activated. | |
if ( empty( $atts['id'] ) || ! function_exists( 'wpforms' ) ) { | |
return; | |
} | |
// Get the form, from the ID provided in the shortcode. | |
$form = wpforms()->form->get( absint( $atts['id'] ) ); | |
// If the form doesn't exists, abort. | |
if ( empty( $form ) ) { | |
return; | |
} | |
// Pull and format the form data out of the form object. | |
$form_data = ! empty( $form->post_content ) ? wpforms_decode( $form->post_content ) : ''; | |
// Check to see if we are showing all allowed fields, or only specific ones. | |
$form_field_ids = isset( $atts['fields'] ) && $atts['fields'] !== '' ? explode( ',', str_replace( ' ', '', $atts['fields'] ) ) : []; | |
// Setup the form fields. | |
if ( empty( $form_field_ids ) ) { | |
$form_fields = $form_data['fields']; | |
} else { | |
$form_fields = []; | |
foreach ( $form_field_ids as $field_id ) { | |
if ( isset( $form_data['fields'][ $field_id ] ) ) { | |
$form_fields[ $field_id ] = $form_data['fields'][ $field_id ]; | |
} | |
} | |
} | |
if ( empty( $form_fields ) ) { | |
return; | |
} | |
// Here we define what the types of form fields we do NOT want to include, | |
// instead they should be ignored entirely. | |
$form_fields_disallow = apply_filters( 'wpforms_frontend_entries_table_disallow', [ 'divider', 'html', 'pagebreak', 'captcha' ] ); | |
// Loop through all form fields and remove any field types not allowed. | |
foreach ( $form_fields as $field_id => $form_field ) { | |
if ( in_array( $form_field['type'], $form_fields_disallow, true ) ) { | |
unset( $form_fields[ $field_id ] ); | |
} | |
} | |
$entries_args = [ | |
'form_id' => absint( $atts['id'] ), | |
]; | |
// Narrow entries by user if user_id shortcode attribute was used. | |
if ( ! empty( $atts['user'] ) ) { | |
if ( $atts['user'] === 'current' && is_user_logged_in() ) { | |
$entries_args['user_id'] = get_current_user_id(); | |
} else { | |
$entries_args['user_id'] = absint( $atts['user'] ); | |
} | |
} | |
// Number of entries to show. If empty, defaults to 30. | |
if ( ! empty( $atts['number'] ) ) { | |
$entries_args['number'] = absint( $atts['number'] ); | |
} | |
// Get all entries for the form, according to arguments defined. | |
// There are many options available to query entries. To see more, check out | |
// the get_entries() function inside class-entry.php (https://a.cl.ly/bLuGnkGx). | |
$entries = wpforms()->entry->get_entries( $entries_args ); | |
if ( empty( $entries ) ) { | |
return '<p>No entries found.</p>'; | |
} | |
ob_start(); | |
echo '<table class="wpforms-frontend-entries">'; | |
echo '<thead><tr>'; | |
// Loop through the form data so we can output form field names in | |
// the table header. | |
foreach ( $form_fields as $form_field ) { | |
// Output the form field name/label. | |
echo '<th>'; | |
echo esc_html( sanitize_text_field( $form_field['label'] ) ); | |
echo '</th>'; | |
} | |
echo '</tr></thead>'; | |
echo '<tbody>'; | |
// Now, loop through all the form entries. | |
foreach ( $entries as $entry ) { | |
echo '<tr>'; | |
// Entry field values are in JSON, so we need to decode. | |
$entry_fields = json_decode( $entry->fields, true ); | |
foreach ( $form_fields as $form_field ) { | |
echo '<td>'; | |
foreach ( $entry_fields as $entry_field ) { | |
if ( absint( $entry_field['id'] ) === absint( $form_field['id'] ) ) { | |
echo apply_filters( 'wpforms_html_field_value', wp_strip_all_tags( $entry_field['value'] ), $entry_field, $form_data, 'entry-frontend-table' ); | |
break; | |
} | |
} | |
echo '</td>'; | |
} | |
echo '</tr>'; | |
} | |
echo '</tbody>'; | |
echo '</table>'; | |
$output = ob_get_clean(); | |
return $output; | |
} | |
add_shortcode( 'wpforms_entries_table', 'wpf_entries_table' ); |
Hello, Can you help me guys I need to hide the feilds if it's empty
for example if I'm displaying feilds 1,2,3,4 and in second entry feild 3 is emplty I want to be hide from front end
Thank you so much for this. I can now sort by entry_id, show the most recent entries, display or hide previously viewed entries. This is perfect for what I am working on!
Great snippet! - Is there a way to display entry_id in the table of entries?
Hi! did you find a solution to display entry_id?
where to change what in this code. It is giving me a headache. Can someone please answer it??
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I want to display my entry_id along with the whole data that are being filled in the form. How can I display that please tell?
please its urgent