Como exibir entradas de formulário

Pretende apresentar entradas de formulários numa página do seu site para mostrar publicamente aos utilizadores as submissões de formulários concluídas? Este tutorial explica-lhe como criar e implementar esta funcionalidade no seu site WordPress.

Por predefinição, apenas os utilizadores profissionais podem visualizar entradas de formulários a partir da administração do WordPress com base nos controlos de acesso atribuídos ao seu utilizador. No entanto, pode criar facilmente a funcionalidade para apresentar entradas de formulários no frontend do seu sítio.

Criar o código curto

Em primeiro lugar, vamos fornecer-lhe um fragmento de código que terá de ser adicionado ao seu site, para que possa reutilizar facilmente este mesmo shortcode, com a exceção de apenas atualizar o ID do formulário conforme necessário.

Basta adicionar o seguinte trecho de código ao seu site. Se não tiver a certeza de como o fazer, consulte 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' );

O que este snippet de código vai fazer é permitir que você use este shortcode em qualquer lugar do seu site que aceite shortcodes, como páginas, posts e áreas de widgets.

Basta utilizar este [wpforms_entries_table id="FORMID"]os seus visitantes verão as entradas enviadas para o formulário que especificar em id="FORMID".

O número de identificação de um formulário pode ser encontrado indo a WPForms " Todos os formulários e olhando para o número na coluna Shortcode para cada formulário.

Como localizar o seu ID de formulário

Exibição de entradas de formulário

Depois de criar o shortcode, terá de o adicionar a uma página ou publicação no seu sítio para apresentar as suas entradas.

Primeiro, tem de determinar em que ID de formulário pretende apresentar estas entradas. No nosso exemplo, vamos apresentar entradas para o ID de formulário 211, pelo que o nosso shortcode tem o seguinte aspeto.

[wpforms_entries_table id="211"]

O único atributo necessário para utilizar o shortcode é o id. Sem definir este atributo no seu shortcode, nada será apresentado, pelo que o ID do formulário deve ser indicado no shortcode.

No entanto, pode filtrar ainda mais as suas entradas definindo alguns dos atributos do shortcode e vamos analisar cada atributo disponível.

Definição do atributo type

A utilização do atributo type pode ser utilizada se pretender mostrar apenas entradas com estrelas. Eis um exemplo.

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

Abaixo estão outros parâmetros de tipo disponíveis que podem ser utilizados:

  • all - a utilização deste atributo permite visualizar todos os tipos de registos.
  • read (ler ) - este atributo só apresenta as entradas que foram visualizadas por um administrador.
  • não lidas - ao utilizar este atributo, só verá as entradas que não foram abertas por um administrador do seu sítio.
  • com estrela - este atributo só apresenta entradas que tenham sido marcadas com estrela por um administrador

Utilizar o atributo do utilizador

Se um utilizador tiver sessão iniciada no seu site e pretender que ele veja apenas as entradas de formulário que submeteu, utilize este shortcode.

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

Se o utilizador não tiver iniciado sessão, serão apresentadas todas as entradas deste formulário.

Se o utilizador tiver iniciado sessão mas não tiver preenchido o formulário (enquanto iniciou sessão), a página apresentará a mensagem Não foram encontrados resultados.

Definição do atributo campos

Para exibir apenas determinados campos, primeiro é necessário descobrir os IDs dos campos que deseja exibir. Para encontrar esses IDs de campo, consulte este tutorial.

Assim que souber quais são os IDs dos campos, utilizará isto como o seu shortcode. Neste exemplo, só queremos o campo Nome, que é o campo ID 0, e o campo Comentários, que é o campo ID 2.

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

Nota: Os IDs de campos múltiplos são separados por vírgula no código curto.

Utilizar o atributo número

Por predefinição, o shortcode só apresentará as primeiras 30 entradas. No entanto, se pretender apresentar uma quantidade inferior, terá de utilizar a opção number parâmetro. Por exemplo, se pretender mostrar as primeiras 20 entradas, adicione o seu shortcode da seguinte forma.

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

A variável number="20″ passada dentro do shortcode determinará o número de entradas que a tabela apresentará. Se quiser mostrar todas as entradas, altere o número para 9999.

apresentação de entradas de formulários numa vista de tabela predefinida

Utilizar o atributo sort and order

Ao utilizar o seu shortcode, pode indicar-lhe o campo pelo qual pretende ordenar a tabela e, em seguida, definir se pretende que seja ordenada por asc (ordem ascendente) ou desc (ordem descendente). Um exemplo desse shortcode seria o seguinte.

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

Neste exemplo, vamos apresentar uma tabela de entradas para o ID de formulário 211 e vamos ordenar esta tabela por ordem ascendente (ascending) utilizando o ID de campo 1, que é o ID de campo para o campo Nome do formulário.

Estilizar a mesa (opcional)

O estilo da tabela de entradas é completamente opcional, pois a maioria dos temas tem o estilo de tabela padrão incorporado, assim como os navegadores. No entanto, queríamos que começasse com um exemplo, por isso, se pretender alterar o estilo de tabela predefinido, deve copiar e colar este CSS no seu site.

Para obter assistência sobre como e onde adicionar CSS ao seu site, consulte este tutorial.

O estilo da sua tabela de entrada varia consoante o estilo predefinido que o seu tema pode ou não ter para as tabelas.

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
}
Adicionar estilo à tabela de entradas do formulário

Adicionar uma vista que não seja de tabela

Se preferir não utilizar uma vista de tabela HTML para apresentar as suas entradas, também temos uma solução alternativa para si. Em vez de criar o seu código curto com o fragmento de código acima, utilize este fragmento de código.

/**
* 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' );

No entanto, é importante notar aqui que, uma vez que não estamos a utilizar uma tabela padrão, não será aplicado qualquer estilo predefinido quando utilizarmos esta opção, pelo que o CSS no passo seguinte é vital, mas listaremos as classes CSS utilizadas para que possa aplicar o seu próprio estilo a esta opção.

Estilizar a não-mesa

Segue-se uma lista pormenorizada das classes CSS utilizadas e qual a sua finalidade (se necessário).

  • .wrapper - trata-se de um invólucro geral em torno de todo o bloco de entradas e pode ser utilizado se pretender reduzir a largura do bloco para que não ocupe 100% da sua página.
  • .header-row - trata-se de um outro invólucro geral em torno das etiquetas de cada coluna (apenas as etiquetas) se pretender alterar a cor de fundo da secção das etiquetas.
  • .column-label - este invólucro envolverá cada título de etiqueta individual. Por exemplo, Nome, Endereço de correio eletrónico e Sugestão/Comentário têm cada um destes envoltórios e podem ser utilizados para definir o tamanho do texto.
  • .entradas - trata-se de um invólucro geral em torno das próprias entradas, caso pretenda alterar a cor de fundo desta secção para que apareça de forma diferente das etiquetas.
  • .entry-details - trata-se de um invólucro geral em torno de cada entrada individual e pode ser útil se pretender fornecer uma cor de fundo diferente para cada linha de entrada.
  • .details - cada coluna de informação é envolvida nesta classe para que possa acrescentar qualquer estilo adicional que deseje, como o tamanho da letra, a cor, etc.

Pode utilizar o CSS abaixo para adicionar algum estilo predefinido à sua vista sem tabela.

Para obter assistência sobre como e onde adicionar CSS ao seu site, consulte 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: O CSS fornecido acima é baseado na exibição de apenas 3 campos da sua entrada, o campo Nome, E-mail e Comentários. Se pretender apresentar mais campos, não se esqueça de atualizar o CSS em conformidade.

Este é um exemplo do formulário sem tabela após a adição do CSS

E já está, criou um shortcode que pode ser adicionado em vários locais do seu site para que possa apresentar as entradas do seu formulário a utilizadores não administradores. Também gostaria de exibir quantas entradas restam no seu formulário ao usar o complemento Form Locker? Experimente o nosso snippet de código para Como exibir o número limite de entradas restantes.

Filtro de referência

wpforms_html_field_value

FAQ

Estas são as respostas a algumas das principais perguntas que vemos sobre a exibição de entradas de formulário numa página ou publicação no WordPress.

P: Como é que posso apresentar apenas uma contagem de entradas não lidas?

R: Deve adicionar este snippet ao seu site.

<?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' );

Depois, é livre de utilizar este código de acesso em qualquer parte do seu sítio WordPress onde os códigos de acesso sejam aceites.

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

Pode simplesmente alterar o tipo para não lido, lido ou com estrela.

P: Porque é que as minhas entradas mais recentes não aparecem?

R: É provável que isto se deva à colocação em cache ao nível do servidor, do site ou do browser. Verifique se a sua cache está completamente limpa.

P: Tenho de ter colunas?

R: Não, de modo algum. Pode apresentar as suas entradas colocando a etiqueta à frente do valor do campo e colocando cada campo numa linha separada, utilizando este snippet e 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' );

Utilize o CSS abaixo para estilizar a vista sem tabela.

Para obter assistência sobre como e onde adicionar CSS ao seu site, consulte 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;
}
também é possível apresentar as entradas num estilo de lista