This function will add (append) a row of values to an existing repeater field or flexible content sub field value. This function is different to add_row() which will add a row to a parent field. You may use this function inside or outside of a have_rows() loop to target which sub field’s value you intend to modify.


  • Added in version 5.4.7


add_sub_row( $selector, $row, $post_id );
  • $selector: (mixed) The sub field name or key, or an array of ancestors and row numbers (required)
  • $row: (array) The new row value to save in the database (required)
  • $post_id: (mixed) The post ID of which the value is saved to


This function will return the new count of rows or false upon failure.


  • Row numbers start from 1 (not 0). For example, the first row of values is considered $i = 1
  • It is possible to change the row index starting point so that row numbers start from 0 using the row_index_offset setting.


The following examples use a repeater field called ‘Parent’ that contains a child repeater. Here is an illustration of the sub fields:

r1 (repeater)
– r2 (repeater)
— t1 (text)
— t2 (text)

Inside have_rows() loop

This example will loop through a repeater field (r1) and add an extra row of data to each sub repeater field (r2).


if( have_rows('r1') ) {

	while( have_rows('r1') ) {

		$row = array(
			't1' => 'New t1 value',
			't2' => 'New t2 value'

		add_sub_row('r2', $row);




Outside have_rows() loop

This example will add a row of values to a sub field outside of a have_rows() loop. Please note that the $selector parameter is given an array containing a mixture of field names and row numbers. This array should read from left to right, the parents to children relationship padded by the row number.


// add to r1 (row 1) => r2
$row1 = array(
	't1' => 'r1 (row 1) => r2 (new row) => t1',
	't2' => 'r1 (row 1) => r2 (new row) => t2'

add_sub_row( array('r1', 1, 'r2'), $row1 );

// add to r1 (row 2) => r2
$row2 = array(
	't1' => 'r1 (row 2) => r2 (new row) => t1',
	't2' => 'r1 (row 2) => r2 (new row) => t2'

add_sub_row( array('r1', 2, 'r2'), $row2 );