) { $this->subfield( $level + 2, $item[ $this->field_names[ $level + 2 ] ] ); } } } // table field else { $this->subfield( $level + 1, $data ); } } }; return $class->html; } add_shortcode( 'tablefield', 'shortcode_acf_tablefield' ); Then use the shortcode with the corresponding shortcode options of the Page Builder. Getting a table field from the current page or post… [tablefield field-name="table_field_name"] Getting a table field from a group field… [tablefield field-name="group_field_name/table_field_name"] Getting a table field from a repeater field… [tablefield field-name="repeater_field_name/table_field_name"] Getting a table field from a specific repeater field item… [tablefield field-name="repeater_field_name/item_index/table_field_name"] Getting a table field from a flexible content field… [tablefield field-name="flexible_content_field_name/layout_name/table_field_name"] You can also get a table field from any kind of nested fields like in this example, where the table field is part of a layout of an flexible content field, that is a subfield of a repeater field, that is a subfield of a group field… [tablefield field-name="group_field_name/repeater_field_name/flexible_content_field_name/layout_name/table_field_name"] Getting a table field from inside a group, repeater or flexible content field loop… [tablefield subfield-name="table_field_name"] Getting a table field from another page or post… [tablefield field-name="table_field_name" post-id="123"] Getting a table field from a ACF option page… [tablefield field-name="table_field_name" post-id="option"] Adding a CSS class to the table HTML element… [tablefield field-name="table_field_name" table-class="my-table-style"] Updating a table using update_field() You can use the ACF PHP function update_field() to change a tables data. Notice Make sure that the number of entries in the header array matches the number of cells in the body rows. The array key 'c' stands for the content of the cells to have the option of adding other cell setting in future development. The table data obtained by get_field() are formatted and differ by the original database data obtained by get_post_meta(). 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 ); Third party plugins issues 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 ); UI Sanitizing Options Since version 1.3.33, you can configure the UI sanitizing options. This requires a script to be enqueued as an ACF admin script. You can enqueue it in your theme’s functions.php file using the following action. add_action( 'acf/input/admin_enqueue_scripts', function() { wp_enqueue_script( 'table-field-config', // Table field config script handle get_template_directory_uri() . '/js/table-field-config.js', // Path to the script in the theme ); }); The sanitization of the table fields UI is handled by DOMPurify. Use the following table field hook in your table field config script to modify the DOMPurify options.