¡Atención!

Este artículo contiene código PHP y está destinado a desarrolladores. Ofrecemos este código como cortesía, pero no proporcionamos soporte para personalizaciones de código o desarrollo de terceros.

Para obtener ayuda adicional, consulta el tutorial de WPBeginner sobre cómo añadir código personalizado.

Descartar

Cómo mostrar entradas de formulario

¿Quieres mostrar las entradas de un formulario en una página de tu sitio para que las presentaciones completadas por los usuarios se muestren públicamente? Este tutorial te guiará sobre cómo crear e implementar esta funcionalidad en tu sitio de WordPress.

Por defecto, solo los usuarios pro pueden ver las entradas del formulario desde el panel de administración de WordPress basándose en los Controles de Acceso asignados a su usuario. Sin embargo, puedes crear fácilmente la funcionalidad para mostrar las entradas del formulario en el frontend de tu sitio.

Creación del Shortcode

Primero, te proporcionaremos un fragmento de código que deberá agregarse a tu sitio para que puedas reutilizar fácilmente este mismo shortcode, con la excepción de actualizar solo el ID del formulario según lo necesites.

Simplemente agrega el siguiente fragmento de código a tu sitio. Si no estás seguro de cómo hacerlo, por favor revisa este tutorial.

/**
* Custom shortcode to display WPForms form entries in table view.
*
* 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 separated list of form field IDs.
* number         Number of entries to show, defaults to 30.
*
* @link https://wpforms.com/developers/how-to-display-form-entries/
*
* Realtime counts could be delayed due to any caching setup on the site
*
* @param array $atts Shortcode attributes.
*
* @return string
*/
 
function wpf_entries_table( $atts ) {
 
// Pull ID shortcode attributes.
$atts = shortcode_atts(
[
'id'     => '',
'user'   => '',
'fields' => '',
'number' => '',
'type'   => 'all', // all, unread, read, or starred.
'sort'   => '',
'order'  => 'asc',
],
$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' ] );
}
 
// Filter the type of entries all, unread, read, or starred
if ( $atts[ 'type' ] === 'unread' ) {
$entries_args[ 'viewed' ] = '0';
} elseif( $atts[ 'type' ] === 'read' ) {
$entries_args[ 'viewed' ] = '1';
} elseif ( $atts[ 'type' ] === 'starred' ) {
$entries_args[ 'starred' ] = '1';
}
 
// 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 = json_decode(json_encode(wpforms()->entry->get_entries( $entries_args )), true);
 
if ( empty( $entries ) ) {
return '<p>No entries found.</p>';
}
 
foreach($entries as $key => $entry) {
$entries[$key][ 'fields' ] = json_decode($entry[ 'fields' ], true);
$entries[$key][ 'meta' ] = json_decode($entry[ 'meta' ], true);
}
 
if ( !empty($atts[ 'sort' ]) && isset($entries[0][ 'fields' ][$atts[ 'sort' ]] ) ) {
if ( strtolower($atts[ 'order' ]) == 'asc' ) {
usort($entries, function ($entry1, $entry2) use ($atts) {
return strcmp($entry1[ 'fields' ][$atts[ 'sort' ]][ 'value' ], $entry2[ 'fields' ][$atts[ 'sort' ]][ 'value' ]);
});
} elseif ( strtolower($atts[ 'order' ]) == 'desc' ) {
usort($entries, function ($entry1, $entry2) use ($atts) {
return strcmp($entry2[ 'fields' ][$atts[ 'sort' ]][ 'value' ], $entry1[ 'fields' ][$atts[ 'sort' ]]['value']);
});
}
}
 
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_fields = $entry[ 'fields' ];
 
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' );

Lo que hará este fragmento de código es permitirte usar este shortcode en cualquier lugar de tu sitio que acepte shortcodes, como páginas, publicaciones y áreas de widgets.

Simplemente usando este [wpforms_entries_table id="FORMID"], tus visitantes verán las entradas enviadas para el formulario que especifiques en id="FORMID”.

El número de ID de un formulario se puede encontrar yendo a WPForms » Todos los Formularios y buscando el número en la columna Shortcode para cada formulario.

Cómo localizar el ID de tu formulario

Mostrar Entradas del Formulario

Después de crear el shortcode, deberás agregarlo a una página o publicación en tu sitio para mostrar tus entradas.

Primero, necesitarás determinar en qué ID de formulario quieres mostrar estas entradas. En nuestro ejemplo, vamos a mostrar las entradas para el ID de formulario 211, por lo que nuestro shortcode se verá así.

[wpforms_entries_table id="211"]

El único atributo requerido para usar el shortcode es el id; sin definirlo en tu shortcode, no se mostrará nada, por lo que el ID del formulario debe estar listado dentro del shortcode.

Sin embargo, puedes filtrar tus entradas aún más definiendo algunos de los atributos del shortcode y vamos a revisar cada atributo disponible.

Definir el atributo type

Se puede usar el atributo type si deseas mostrar solo las entradas marcadas con estrella. Aquí tienes un ejemplo.

[wpforms_entries_table id="211" type="starred"]

A continuación se muestran otros parámetros de tipo disponibles que puedes usar:

  • all – usar este atributo mostrará todos los tipos de entrada.
  • read – este atributo solo mostrará las entradas que han sido vistas por un administrador.
  • unread – al usar este atributo, solo verás las entradas que no han sido abiertas por un administrador en tu sitio.
  • starred – este atributo solo mostrará las entradas que han sido marcadas con estrella por un administrador

Utilizar el atributo user

Si un usuario ha iniciado sesión actualmente en tu sitio y solo quieres que vea las entradas del formulario que ha enviado, usa este shortcode.

[wpforms_entries_table id="FORMID" user="current"]

Si el usuario no ha iniciado sesión, se mostrarían todas las entradas de este formulario.

Si el usuario ha iniciado sesión pero no ha completado el formulario (mientras ha iniciado sesión), entonces No se han encontrado resultados. se mostraría en la página.

Definición del atributo fields

Para mostrar solo ciertos campos, primero deberá averiguar los ID de los campos que desea mostrar. Para encontrar esos ID de campo, por favor revise este tutorial.

Una vez que sepa cuáles son los ID de campo, usará esto como su shortcode. En este ejemplo, solo queremos el campo Nombre, que es el ID de campo 0, y el campo Comentarios, que es el ID de campo 2.

[wpforms_entries_table id="211" fields="0,2"]

Nota: Múltiples ID de campo se separan con una coma en el shortcode.

Uso del atributo number

Por defecto, el shortcode solo mostrará las primeras 30 entradas. Sin embargo, si desea mostrar una cantidad menor, necesitará usar el parámetro number. Por ejemplo, si desea mostrar las primeras 20 entradas, agregue su shortcode de esta manera.

[wpforms_entries_table id="211" number="20"]

La variable number=”20″ pasada dentro del shortcode determinará cuántas entradas mostrará la tabla. Si desea mostrar todas las entradas, cambie el number a 9999.

Mostrar las entradas del formulario en una vista de tabla predeterminada

Uso de los atributos sort y order

Al usar su shortcode, puede indicar al shortcode por qué campo desea ordenar la tabla y luego definir si desea que se ordene por asc (orden ascendente) o desc (orden descendente). Un ejemplo de ese shortcode se vería así.

[wpforms_entries_table id="211" sort="1" order="asc"]

En este ejemplo, mostraremos una tabla de entradas para el ID de formulario 211 y ordenaremos esta tabla en orden asc (ascendente) usando el ID de campo 1, que es el ID de campo para el campo Nombre del formulario.

Estilo de la tabla (Opcional)

El estilo de la tabla de entradas es completamente opcional, ya que la mayoría de los temas tienen estilos de tabla predeterminados integrados, al igual que los navegadores. Sin embargo, queríamos brindarle un ejemplo para comenzar, por lo que si desea cambiar el estilo predeterminado de la tabla, querrá copiar y pegar este CSS en su sitio.

Para obtener ayuda sobre cómo y dónde agregar CSS a su sitio, por favor revise este tutorial.

El estilo de su tabla de entradas variará según el estilo predeterminado que su tema pueda tener o no para las tablas.

table {
border-collapse: collapse;
}

thead tr {
height: 60px;
}

table, th, td {
border: 1px solid #000000;
}

td {
white-space: normal;
max-width: 33%;
width: 33%;
word-break: break-all;
height: 60px;
padding: 10px;
}
tr:nth-child(even) {
background: #ccc
}

tr:nth-child(odd) {
background: #fff
}
Añadir estilo a la tabla de entradas de tu formulario

Agregar una vista que no sea una tabla

Si prefiere no usar una vista de tabla HTML para mostrar sus entradas, también tenemos una solución alternativa para usted. En lugar de crear su shortcode con el fragmento de código anterior, use este fragmento de código en su lugar.

/**
* Custom shortcode to display WPForms form entries in non-table view.
*
* 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 separated list of form field IDs.
* number         Number of entries to show, defaults to 30.
*
* @link https://wpforms.com/developers/how-to-display-form-entries/
*
* Realtime counts could be delayed due to any caching setup on the site
*
* @param array $atts Shortcode attributes.
*
* @return string
*/
 
function wpf_entries_table( $atts ) {
 
// Pull ID shortcode attributes.
$atts = shortcode_atts(
[
'id'     => '',
'user'   => '',
'fields' => '',
'number' => '',
'type'   => 'all', // all, unread, read, or starred.
'sort'   => '',
'order'  => 'asc',
],
$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 exist, 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' ] );
}
 
// Filter the type of entries: all, unread, read, or starred
if ( $atts[ 'type' ] === 'unread' ) {
$entries_args[ 'viewed' ] = '0';
} elseif( $atts[ 'type' ] === 'read' ) {
$entries_args[ 'viewed' ] = '1';
} elseif ( $atts[ 'type' ] === 'starred' ) {
$entries_args[ 'starred' ] = '1';
}
 
// 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 = json_decode(json_encode(wpforms()->entry->get_entries( $entries_args )), true);
 
if ( empty( $entries ) ) {
return '<p>No entries found.</p>';
}
 
foreach($entries as $key => $entry) {
$entries[$key][ 'fields' ] = json_decode($entry[ 'fields' ], true);
$entries[$key][ 'meta' ] = json_decode($entry[ 'meta' ], true);
}
 
if ( !empty($atts[ 'sort' ]) && isset($entries[0][ 'fields' ][$atts[ 'sort' ]] ) ) {
if ( strtolower($atts[ 'order' ]) == 'asc' ) {
usort($entries, function ($entry1, $entry2) use ($atts) {
return strcmp($entry1[ 'fields' ][$atts[ 'sort' ]][ 'value' ], $entry2[ 'fields' ][$atts[ 'sort' ]][ 'value' ]);
});
} elseif ( strtolower($atts[ 'order' ]) == 'desc' ) {
usort($entries, function ($entry1, $entry2) use ($atts) {
return strcmp($entry2[ 'fields' ][$atts[ 'sort' ]][ 'value' ], $entry1[ 'fields' ][$atts[ 'sort' ]]['value']);
});
}
}
 
ob_start();
 
echo '<div class="wrapper">';
 
echo '<div class="header-row">';
 
// 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 '<span class="column-label">';
echo esc_html( sanitize_text_field( $form_field[ 'label' ] ) );
echo '</span>';
}
 
echo '</div>';
 
echo '<div class="entries">';
 
// Now, loop through all the form entries.
foreach ( $entries as $entry ) {
 
echo '<div class="entry-details">';
 
$entry_fields = $entry[ 'fields' ];
 
foreach ( $form_fields as $form_field ) {
 
echo '<span class="details">';
 
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 '</span>';
}
 
echo '</div>';
}
 
echo '</div>';
 
echo '</div>';
 
$output = ob_get_clean();
 
return $output;
}
add_shortcode( 'wpforms_entries_table', 'wpf_entries_table' );

Sin embargo, es importante tener en cuenta aquí que, dado que no estamos utilizando una tabla estándar, no se aplicará ningún estilo predeterminado al usar esta opción, por lo que el CSS en el siguiente paso es vital, pero enumeraremos las clases CSS utilizadas para que pueda aplicar su propio estilo a esta opción.

Estilo de la no-tabla

A continuación, se incluye una lista detallada de las clases CSS utilizadas y cuál puede ser su propósito (si es necesario).

  • .wrapper – este es un contenedor general alrededor de todo el bloque de entradas y se puede usar si desea reducir el ancho del bloque para que no se extienda al 100% de su página.
  • .header-row – este es otro contenedor general alrededor de las etiquetas de cada columna (solo las etiquetas) si desea cambiar el color de fondo de la sección de etiquetas.
  • .column-label – este contenedor envolverá cada título de etiqueta individual. Por ejemplo, Nombre, Dirección de correo electrónico y Sugerencia/Comentario tienen cada uno un contenedor que los rodea y podría usarse para definir el tamaño de este texto.
  • .entries – este es un contenedor general alrededor de las entradas en sí si desea cambiar el color de fondo de esta sección para que aparezca de manera diferente a las etiquetas.
  • .entry-details – este es un contenedor general alrededor de cada entrada individual y podría ser útil si desea proporcionar un color de fondo diferente para cada fila de entrada.
  • .details – cada columna de información está envuelta en esta clase para que pueda agregar cualquier estilo adicional que desee, como tamaño de fuente, color, etc.

Puede usar el CSS a continuación para agregar un estilo predeterminado para su vista de no-tabla.

Para obtener ayuda sobre cómo y dónde agregar CSS a su sitio, por favor revise este tutorial.

.wrapper {
width: 100%;
clear: both;
display: block;
}

.header-row {
float: left;
width: 100%;
margin-bottom: 20px;
border-top: 1px solid #eee;
padding: 10px 0;
border-bottom: 1px solid #eee;
}

span.details, span.column-label {
display: inline-block;
float: left;
width: 33%;
margin-right: 2px;
text-align: center;
margin: 5px 0;
}

.entries {
display: block;
clear: both;
width: 100%;
}

.header-row span.column-label {
text-transform: uppercase;
letter-spacing: 2px;
}

.entry-details {
border-bottom: 1px solid #ccc;
width: 100%;
display: block;
float: left;
margin: 20px 0;
padding-bottom: 20px;
}

Nota: El CSS proporcionado anteriormente se basa en la visualización de solo 3 campos de su entrada: el campo Nombre, Correo electrónico y Comentarios. Si desea mostrar más campos, recuerde actualizar su CSS en consecuencia.

Este es un ejemplo del formulario no tabular después de añadir el CSS

Y eso es todo, ahora ha creado un shortcode que se puede agregar en varios lugares de su sitio para que pueda mostrar las entradas de su formulario a usuarios que no son administradores. ¿También le gustaría mostrar cuántas entradas quedan en su formulario al usar el complemento Form Locker? Pruebe nuestro fragmento de código para Cómo mostrar el número de límite de entradas restantes.

Filtro de Referencia

wpforms_html_field_value

Preguntas frecuentes

Estas son las respuestas a algunas de las preguntas más frecuentes que vemos sobre cómo mostrar las entradas del formulario en una página o publicación en WordPress.

P: ¿Cómo puedo mostrar solo un recuento de entradas no leídas?

R: Agregaría este fragmento a su sitio.

<?php
/**
* Custom shortcode to display WPForms form entries count for a form.
*
* Realtime counts could be delayed due to any caching setup on the site
*
* @link https://wpforms.com/developers/how-to-display-form-entries/
*
*/
 
function wpf_dev_entries_count( $atts ) {
 
// Pull ID shortcode attributes.
$atts = shortcode_atts(
[
'id'     => '',
'type'   => 'all', // all, unread, read, or starred.
],
$atts
);
 
if ( empty( $atts['id'] ) ) {
return;
}
 
$args = [
'form_id' => absint( $atts['id'] ),
];
 
if ( $atts['type'] === 'unread' ) {
$args['viewed'] = '0';
} elseif( $atts['type'] === 'read' ) {
$args['viewed'] = '1';
} elseif ( $atts['type'] === 'starred' ) {
$args['starred'] = '1';
}
 
return wpforms()->entry->get_entries( $args, true );
 
}
add_shortcode( 'wpf_entries_count', 'wpf_dev_entries_count' );

Luego, puede usar este shortcode en cualquier lugar de su sitio de WordPress donde se acepten shortcodes.

[wpf_entries_count id="13" type="unread"]

Simplemente puede cambiar el type a unread, read o starred.

P: ¿Por qué no se muestran mis entradas más recientes?

R: Esto se debe probablemente al almacenamiento en caché a nivel del servidor, del sitio o del navegador. Por favor, verifique que su caché esté completamente limpia.

¿Tengo que tener columnas sí o sí?

R: No, en absoluto. Puedes mostrar tus entradas colocando la etiqueta delante del valor del campo y cada campo en una línea separada usando este fragmento y CSS.

/**
* Custom shortcode to display WPForms form entries in non-table view.
*
* 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 separated list of form field IDs.
* number         Number of entries to show, defaults to 30.
*
* @link https://wpforms.com/developers/how-to-display-form-entries/
*
* Realtime counts could be delayed due to any caching setup on the site
*
* @param array $atts Shortcode attributes.
*
* @return string
*/
 
function wpf_entries_table( $atts ) {
 
// Pull ID shortcode attributes.
$atts = shortcode_atts(
[
'id'     => '',
'user'   => '',
'fields' => '',
'number' => '',
'type'   => 'all', // all, unread, read, or starred.
'sort'   => '',
'order'  => 'asc',
],
$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 exist, 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'] );
}
 
// Filter the type of entries: all, unread, read, or starred
if ( $atts['type'] === 'unread' ) {
$entries_args['viewed'] = '0';
} elseif( $atts['type'] === 'read' ) {
$entries_args['viewed'] = '1';
} elseif ( $atts['type'] === 'starred' ) {
$entries_args['starred'] = '1';
}
 
// 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 = json_decode(json_encode(wpforms()->entry->get_entries( $entries_args )), true);
 
if ( empty( $entries ) ) {
return '<p>No entries found.</p>';
}
 
foreach($entries as $key => $entry) {
$entries[$key]['fields'] = json_decode($entry['fields'], true);
$entries[$key]['meta'] = json_decode($entry['meta'], true);
}
 
if ( !empty($atts['sort']) && isset($entries[0]['fields'][$atts['sort']] ) ) {
if ( strtolower($atts['order']) == 'asc' ) {
usort($entries, function ($entry1, $entry2) use ($atts) {
return strcmp($entry1['fields'][$atts['sort']]['value'], $entry2['fields'][$atts['sort']]['value']);
});
} elseif ( strtolower($atts['order']) == 'desc' ) {
usort($entries, function ($entry1, $entry2) use ($atts) {
return strcmp($entry2['fields'][$atts['sort']]['value'], $entry1['fields'][$atts['sort']]['value']);
});
}
}
 
ob_start();
 
echo '<div class="wrapper">';
echo '<div class="entries">';
 
// Now, loop through all the form entries.
foreach ( $entries as $entry ) {
 
echo '<div class="entry-details">';
 
$entry_fields = $entry['fields'];
 
foreach ( $form_fields as $form_field ) {
 
echo '<span class="details">';
echo '<span class="label">' . esc_html( sanitize_text_field( $form_field['label'] ) ) . ':</span>';
 
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 '</span>';
}
 
echo '</div>';
}
 
echo '</div>';
echo '</div>';
 
$output = ob_get_clean();
 
return $output;
}
 
add_shortcode( 'wpforms_entries_table', 'wpf_entries_table' );

Utiliza el siguiente CSS para dar estilo a la vista que no es una tabla.

Para obtener ayuda sobre cómo y dónde agregar CSS a su sitio, por favor revise este tutorial.

.wrapper {
width: 100%;
clear: both;
display: block;
}

span.details {
display: block;
margin-right: 2px;
margin: 5px 0;
}

.entries {
display: block;
clear: both;
width: 100%;
}

.entry-details {
border-bottom: 1px solid #ccc;
width: 100%;
display: block;
margin: 20px 0;
padding-bottom: 20px;
}

span.label {
font-weight: bold;
margin-right: 5px;
}
También puedes mostrar las entradas en un estilo de lista