Support

Account

Home Forums Add-ons Repeater Field Query Last Row of a Repeater Field

Solving

Query Last Row of a Repeater Field

  • Hi,

    I’m trying to query the last row of a repeater field so that I can display posts by date based on a specific field in the last row.

    I have a field called ‘record’ with two subfields ‘date_in’ and ‘date_out’.

    So far I can query the ‘date_in’ sub field and it orders my posts, but only based on the first row of the repeater field rather than the last.

    Any help appreciated. This is what I have so far:

    // filter
    function my_posts_where( $where ) {	
    	$where = str_replace("meta_key = 'record_%", "meta_key LIKE 'record_%", $where);
    	return $where;
    }
    
    add_filter('posts_where', 'my_posts_where');
    
    // args
    $args = array(
    	'numberposts'	=> -1,
    	'post_type'	=> 'post',
    	'meta_query'	=> 'record_%_date_in',
    	'order'		=> 'ASC',
    	'orderby'	=> 'meta_value',
    	'meta_type'	=> 'DATETIME'	
    );
    
    // query
    $the_query = new WP_Query( $args);
  • There isn’t any way to do a query based on the last row of a repeater field. In order to do that you would need to have the same number of rows in every repeater and you’d need to replace the % in the query with the row number. For example, if a post has 5 rows the you’d query for ‘record_4_date_in’.

    Querying by and ordering by repeater sub fields is always problematic and inconsistent. Rather than try to do this I’ve found that creating a consistent field that can be used is a better solutions. For example, lets say that you want to sort your posts by the last date_in sub field.

    
    add_filter('acf/update_value/name=record', 'my_create_a_usable_field', 10, 3);
    function my_create_a_usable_field($value, $post_id, $field) {
      // $value will hold a nested array with the rows of the repeater
      if (!is_array($value)) {
        // the repeater is empty, bail early
        return $value;
      }
      $last_row = end($value);
      $date_in = $last_row['date_in'];
      // now put it into a different field
      // this field can be used in queries for filtering and sorting
      update_post_meta($post_id, 'filterable_date_in', $date_in);
    }
    

    Please not that you may need to do more with the value, for example, converting it into correct MySQL date format. I’m not sure what the value of a date field will be at this point. At any rate, this is a little more work, but gives you what is needed in a form that’s usable.

  • This reply has been marked as private.
  • Hi, so I realised from the comments I still need to query this new field. I’ve added in the query to order posts by date with the newly created field, unfortunately to no avail. Any Ideas:

    add_filter('acf/update_value/name=record', 'my_create_a_usable_field', 10, 3);
    function my_create_a_usable_field($value, $post_id, $field) {
      // $value will hold a nested array with the rows of the repeater
      if (!is_array($value)) {
        // the repeater is empty, bail early
        return $value;
      }
      $last_row = end($value);
      $date_in = $last_row['date_in'];
      // now put it into a different field
      // this field can be used in queries for filtering and sorting
      update_post_meta($post_id, 'filterable_date_in', $date_in);
    }
    
    // args
    $args = array(
    	'numberposts'	=> -1,
    	'post_type'		=> 'post',
    	'meta_query'		=> 'filterable_date_in',
    	'order'			=> 'ASC',
    	'orderby'		=> 'meta_value',
    	'meta_type'		=> 'DATETIME'	
    );
    
    // query
    $the_query = new WP_Query( $args);
  • The value stored by ACF is not a valid “DATETIME”. try numberic, or just delete the meta_type argument. and ‘meta_query’ for how you’re using it should be ‘meta_key’

    You’ll also need to manually update every post to get the values of the new field into the database.

Viewing 5 posts - 1 through 5 (of 5 total)

You must be logged in to reply to this topic.

We use cookies to offer you a better browsing experience, analyze site traffic and personalize content. Read about how we use cookies and how you can control them in our Cookie Policy. If you continue to use this site, you consent to our use of cookies.