A Table Field Add-on for the Advanced Custom Fields Plugin.
The Table Field Plugin enhances the functionality of the “Advanced Custom Fields” plugin with easy-to-edit tables.
This plugin requires the “Advanced Custom Fields” plugin or the Pro version!
The table field works also with the repeater and flexible field types and supports the ACF Blocks for Gutenberg
Note: Please contribute your language to the plugin to make it even more useful.
The Advanced Custom Fields Table Field plugin is also available in a professional version which includes more functionality and more flexibility. The additional Pro features are:
The Pro version runs completely independend beside the free version and comes with its own field type.
You can change an existing field with field type “Table” (free version) to field type “Table Pro”.
This software can be used as both a WP plugin and a theme include.
However, only when activated as a plugin will updates be available.
To render the table fields data as an html table in one of your template files (page.php, single.php) you can start with the following basic code example:
$table = get_field( 'your_table_field_name' ); if ( ! empty ( $table ) ) { echo '<table border="0">'; if ( ! empty( $table['caption'] ) ) { echo '<caption>' . $table['caption'] . '</caption>'; } if ( ! empty( $table['header'] ) ) { echo '<thead>'; echo '<tr>'; foreach ( $table['header'] as $th ) { echo '<th>'; echo $th['c']; echo '</th>'; } echo '</tr>'; echo '</thead>'; } echo '<tbody>'; foreach ( $table['body'] as $tr ) { echo '<tr>'; foreach ( $tr as $td ) { echo '<td>'; echo $td['c']; echo '</td>'; } echo '</tr>'; } echo '</tbody>'; echo '</table>'; }
If the table has only one empty cell, then get_field()
returns FALSE
. get_field()
returns NULL when a field is not stored in the database. That happens when a page is copied but not their fields content. You can check both with empty()
…
$table = get_field( 'your_table_field_name' ); if ( ! empty( $table ) ) { // $table is not FALSE and not NULL. // Field exists in database and has content. }
This is about displaying line breaks in the admin tables and getting line breaks as <br>
when outputting the tables HTML.
Converting Line Breaks for HTML Output
To convert line breaks to <br>
in tables HTML output the PHP function nl2br()
can be used:
For line breaks in table header cells replace…
echo $th['c'];
with…
echo nl2br( $th['c'] );
For line breaks in table body cells replace…
echo $td['c'];
with…
echo nl2br( $td['c'] );
Displaying Line Breaks in Editing Tables
To display natural line breaks in the editing tables in the admin area, add the following styles to the admin area.
.acf-table-header-cont, .acf-table-body-cont { white-space: pre-line; }
One way to add these styles to the WordPress admin area is adding the following code to your functions.php file of the theme.
add_action('admin_head', 'acf_table_styles'); function acf_table_styles() { echo '<style> .acf-table-header-cont, .acf-table-body-cont { white-space: pre-line; } </style>'; }
In general, its up to Elementor to support ACF field types on the Elementor widgets. All supported ACF fields by Elementor you can find here. But because the table field is not a native ACF field, the support for this field may never happen.
For now the way to go is using the Elementors shortcode Widget. Before you can use a shortcode to display a table fields table, you have to setup a shortcode in functions.php. The following code does this. You can modify the table html output for your needs.
function shortcode_acf_tablefield( $atts ) { $a = shortcode_atts( array( 'table-class' => '', 'field-name' => false, 'post-id' => false, ), $atts ); $table = get_field( $a['field-name'], $a['post-id'] ); $return = ''; if ( $table ) { $return .= '<table class="' . $a['table-class'] . '" border="0">'; if ( ! empty( $table['caption'] ) ) { echo '<caption>' . $table['caption'] . '</caption>'; } if ( $table['header'] ) { $return .= '<thead>'; $return .= '<tr>'; foreach ( $table['header'] as $th ) { $return .= '<th>'; $return .= $th['c']; $return .= '</th>'; } $return .= '</tr>'; $return .= '</thead>'; } $return .= '<tbody>'; foreach ( $table['body'] as $tr ) { $return .= '<tr>'; foreach ( $tr as $td ) { $return .= '<td>'; $return .= $td['c']; $return .= '</td>'; } $return .= '</tr>'; } $return .= '</tbody>'; $return .= '</table>'; } return $return; } add_shortcode( 'tablefield', 'shortcode_acf_tablefield' );
Then use the shortcode in a Elementors shortcode widget like this, to insert a table from the current page or post…
[tablefield field-name="your table field name" table-class="my-table"]
You also can insert a table from another page or post…
[tablefield field-name="your table field name" post-id="123" table-class="my-table"]
Or you can insert a table from a ACF option page…
[tablefield field-name="your table field name" post-id="option" table-class="my-table"]
You can use the ACF PHP function update_field()
to change a tables data.
Notice
Example of changing table data using get_field() and update_field()
// the post ID where to update the table field $post_id = 123; $table_data = get_field( 'my_table', $post_id ); $table_data = array( 'use_header' => true, // boolean true/false 'caption' => 'My Caption', 'header' => array( 0 => array( 'c' => 'A', ), 1 => array( 'c' => 'B', ), ), 'body' => array( 0 => array( 0 => array( 'c' => 'The content of first cell of first row', ), 1 => array( 'c' => 'The content of second cell of first row', ), ), 1 => array( 0 => array( 'c' => The content of first cell of second row', ), 1 => array( 'c' => 'The content of second cell of second row', ), ), ) ); update_field( 'my_table', $table_data, $post_id );
Example of adding a new row
// the post ID where to update the table field $post_id = 123; // gets the table data $table_data = get_field( 'my_table', $post_id ); // defines the new row and its columns $new_row = array( // must define the same amount of columns as exists in the table // column 1 array( // the 'c' stands for content of the cell 'c' => 'Cell Content of Column 1', ), // column 2 array( 'c' => 'Cell Content of Column 2', ) ); // adds the new row to the table body data array_push( $table_data['body'], $new_row ); // saves the new table data update_field( 'my_table', $table_data, $post_id );
Since version 1.3.1 of the table plugin, the storing format of the table data changes from JSON string to serialized array for new or updated tables. The issue with JSON is because of third party plugins that do not properly applying wp_slash()
to a post_meta value before updating with update_post_metadata()
. This can break JSON strings because update_post_metadata()
removes backslashes by default. Backslashes are part of the JSON string syntax escaping quotation marks in content.
The table field plugin prevents broken JSON strings to save as a table field data and throws an error message that explains the issue. But this may also breaks the functionality of the third party plugin trying to update the table data. You could disable the JSON string check in the table field plugin using the following code in the wp-config.php file. But then the table JSON data are no longer protected from destroing by update_post_metadata()
. Use the following code in wp-config.php only, if you understand the risk…
define( "ACF_TABLEFIELD_FILTER_POSTMETA", false );
= 1.3.19=
* Fixes issue not initial loading editing tables in Gutenberg blocks.