function get_layout_title($field, $layout, $i, $value) { // add loop acf_add_loop(array('selector' => $field['name'], 'name' => $field['name'], 'value' => array($value), 'field' => $field, 'i' => 0, 'post_id' => 0)); // vars $title = $layout['label']; // filters $title = apply_filters('acf/fields/flexible_content/layout_title', $title, $field, $layout, $i); $title = apply_filters('acf/fields/flexible_content/layout_title/name=' . $field['_name'], $title, $field, $layout, $i); $title = apply_filters('acf/fields/flexible_content/layout_title/key=' . $field['key'], $title, $field, $layout, $i); // remove loop acf_remove_loop(); // prepend order $title = '<span class="acf-fc-layout-order">' . ($i + 1) . '</span> ' . $title; // return return $title; }
function have_rows($selector, $post_id = false) { // vars $active_loop = acf_get_loop('active'); $previous_loop = acf_get_loop('previous'); $new_parent_loop = false; $new_child_loop = false; $sub_field = false; $sub_exists = false; $change = false; $key = "selector={$selector}/post_id={$post_id}"; // reference $_post_id = $post_id; // filter post_id $post_id = acf_get_valid_post_id($post_id); // no active loops if (!$active_loop) { // create a new loop $new_parent_loop = true; // loop has changed } elseif ($active_loop['key'] != $key) { // detect change if ($post_id != $active_loop['post_id']) { $change = 'post_id'; } elseif ($selector != $active_loop['selector']) { $change = 'selector'; } else { // key has changed due to a technicallity, however, the post_id and selector are the same } // attempt to find sub field $sub_field = acf_get_sub_field($selector, $active_loop['field']); if ($sub_field) { $sub_exists = isset($active_loop['value'][$active_loop['i']][$sub_field['key']]); } // If post_id has changed, this is most likely an archive loop if ($change == 'post_id') { if (empty($_post_id) && $sub_exists) { // case: Change in $post_id was due to this being a nested loop and not specifying the $post_id // action: move down one level into a new loop $new_child_loop = true; } elseif ($previous_loop && $previous_loop['post_id'] == $post_id) { // case: Change in $post_id was due to a nested loop ending // action: move up one level through the loops acf_remove_loop('active'); } else { // case: Chang in $post_id is the most obvious, used in an WP_Query loop with multiple $post objects // action: leave this current loop alone and create a new parent loop $new_parent_loop = true; } } elseif ($change == 'selector') { if ($previous_loop && $previous_loop['selector'] == $selector && $previous_loop['post_id'] == $post_id) { // case: Change in $field_name was due to a nested loop ending // action: move up one level through the loops acf_remove_loop('active'); } elseif ($sub_exists) { // case: Change in $field_name was due to this being a nested loop // action: move down one level into a new loop $new_child_loop = true; } else { // case: Chang in $field_name is the most obvious, this is a new loop for a different field within the $post // action: leave this current loop alone and create a new parent loop $new_parent_loop = true; } } // loop is the same } else { // do nothing } // add parent loop if ($new_parent_loop) { // vars $field = get_field_object($selector, $post_id, false); $value = acf_extract_var($field, 'value'); // add loop acf_add_loop(array('selector' => $selector, 'name' => $field['name'], 'value' => $value, 'field' => $field, 'i' => -1, 'post_id' => $post_id, 'key' => $key)); // add child loop } elseif ($new_child_loop) { // vars $value = $active_loop['value'][$active_loop['i']][$sub_field['key']]; $post_id = $active_loop['post_id']; // add loop acf_add_loop(array('selector' => $selector, 'name' => $active_loop['name'] . '_' . $active_loop['i'] . '_' . $sub_field['name'], 'value' => $value, 'field' => $sub_field, 'i' => -1, 'post_id' => $post_id, 'key' => $key)); } // update vars $active_loop = acf_get_loop('active'); // return true if next row exists if ($active_loop && is_array($active_loop['value']) && isset($active_loop['value'][$active_loop['i'] + 1])) { return true; } // no next row! acf_remove_loop('active'); // return return false; }