$wrapper_classes ]); $tag = $attr['tag'] ?? 'p'; $opening_tag = "<{$tag} {$wrapper_attributes}>"; $closing_tag = ""; // throw if value is empty. if ( ( '' === $field['value'] || is_null( $field['value'] ) || ( is_array( $field['value'] ) && empty( $field['value'] ) ) || false === $field['value'] ) && 'true_false' !== $field['type'] ) { if ( isset( $attr['showMessageIfEmpty'] ) && boolval( $attr['showMessageIfEmpty'] ) && isset( $attr['emptyMessage'] ) && ! empty( $attr['emptyMessage'] ) ) { return $opening_tag . '' . wp_kses_post( $attr['emptyMessage'] ) . '' . $closing_tag; } else { return ''; } } $value = ''; $is_link = isset( $attr['linkToObject'] ) && boolval( $attr['linkToObject'] ); $new_tab = isset( $attr['newTab'] ) && boolval( $attr['newTab'] ); $truncate = ! empty( $attr['truncate'] ) && in_array( $field['type'], array( 'text', 'textarea', 'wysiwyg' ), true ) && is_string( $field['value'] ); switch ( $field['type'] ) { case 'text': $value = esc_html( $truncate ? $this->truncate_text( $field['value'], $attr ) : $field['value'] ); break; case 'textarea': if ( $truncate ) { $value = esc_html( $this->truncate_text( $field['value'], $attr ) ); } else { $value = wp_kses_post( ! empty( $field['new_lines'] ) ? nl2br( $field['value'] ) : $field['value'] ); } break; case 'true_false': if ( boolval( $field['value'] ) && isset( $attr['checkedText'] ) && ! empty( $attr['checkedText'] ) ) { $value = esc_html( $attr['checkedText'] ); } elseif ( isset( $attr['uncheckedText'] ) && ! empty( $attr['uncheckedText'] ) ) { $value = esc_html( $attr['uncheckedText'] ); } break; case 'wysiwyg': if ( $truncate ) { $value = esc_html( $this->truncate_text( apply_filters( 'acf_the_content', $field['value'] ), $attr ) ); } else { $tag = 'div'; $value = apply_filters( 'acf_the_content', $field['value'] ); } break; case 'link': if ( isset( $field['value']['url'], $field['value']['title'] ) ) { $value = $this->create_link( $field['value']['url'], $field['value']['title'], $new_tab ); } break; case 'post_object': case 'relationship': if ( is_array( $field['value'] ) ) { $value = array_map( function( $val ) use ( $is_link, $field, $new_tab ) { if ( $is_link ) { return $this->create_link( get_permalink( $val ), get_the_title( $val ), $new_tab ); } else { return get_the_title( $val ); } }, $field['value'] ); } else { if ( $is_link ) { $value = $this->create_link( get_permalink( $field['value'] ), get_the_title( $field['value'] ), $new_tab ); } else { $value = get_the_title( $field['value'] ); } } break; case 'taxonomy': if ( is_array( $field['value'] ) ) { $value = array_map( function( $val ) use ( $is_link, $field, $new_tab, $attr ) { $term = get_term( $val ); if ( is_wp_error( $term ) || is_null( $term ) ) { return ''; } $return_field = isset( $attr['returnFormat'] ) && isset( $term->{$attr['returnFormat']} ) ? $term->{$attr['returnFormat']} : $term->name; if ( $is_link ) { return $this->create_link( get_term_link( $term ), $return_field, $new_tab ); } else { return esc_html( $return_field ); } }, $field['value'] ); } else { $term = get_term( $field['value'] ); if ( is_wp_error( $term ) || is_null( $term ) ) { break; } $return_field = isset( $attr['returnFormat'] ) && isset( $term->{$attr['returnFormat']} ) ? $term->{$attr['returnFormat']} : $term->name; if ( $is_link ) { $value = $this->create_link( get_term_link( $term ), $return_field, $new_tab ); } else { $value = esc_html( $return_field ); } } break; case 'user': if ( is_array( $field['value'] ) ) { $value = array_map( function( $val ) use ( $is_link, $field, $new_tab, $attr ) { $user = get_userdata( $val ); if ( ! $user ) { return ''; } $return_field = isset( $attr['returnFormat'] ) && isset( $user->data->{$attr['returnFormat']} ) ? $user->data->{$attr['returnFormat']} : $user->data->display_name; if ( $is_link ) { return $this->create_link( get_author_posts_url( $user->data->ID ), $return_field, $new_tab ); } else { return esc_html( $return_field ); } }, $field['value'] ); } else { $user = get_userdata( $field['value'] ); if ( ! $user ) { break; } $return_field = isset( $attr['returnFormat'] ) && isset( $user->data->{$attr['returnFormat']} ) ? $user->data->{$attr['returnFormat']} : $user->data->display_name; if ( $is_link ) { $value = $this->create_link( get_author_posts_url( $user->data->ID ), $return_field, $new_tab ); } else { $value = esc_html( $return_field ); } } break; case 'select': case 'radio': case 'checkbox': case 'button_group': if ( is_array( $field['value'] ) ) { $value = array_map( function( $val ) use ( $attr, $field ) { if ( isset( $attr['returnFormat'] ) && 'label' === $attr['returnFormat'] && isset( $field['choices'][ $val ] ) ) { return esc_html( $field['choices'][ $val ] ); } else { return esc_html( $val ); } }, $field['value'] ); } else { if ( isset( $attr['returnFormat'] ) && 'label' === $attr['returnFormat'] && isset( $field['choices'][ $field['value'] ] ) ) { $value = esc_html( $field['choices'][ $field['value'] ] ); } else { $value = esc_html( $field['value'] ); } } break; case 'email': if ( $is_link ) { $value = $this->create_link( 'mailto:' . $field['value'], $field['value'], false ); } else { $value = esc_html( $field['value'] ); } break; case 'url': if ( $is_link ) { $value = $this->create_link( $field['value'], $field['value'], $new_tab ); } else { $value = esc_url( $field['value'] ); } break; case 'page_link': if ( is_array( $field['value'] ) ) { $value = array_map( function( $val ) use ( $new_tab ) { $link = is_numeric( $val ) ? get_permalink( $val ) : $val; return $this->create_link( $link, $link, $new_tab ); }, $field['value'] ); } else { $link = is_numeric( $field['value'] ) ? get_permalink( $field['value'] ) : $field['value']; $value = $this->create_link( $link, $link, $new_tab ); } break; case 'number': case 'range': $number = ! empty( $attr['formatNumber'] ) ? Formatter::format_number( $field['value'], $attr ) : null; $value = esc_html( null !== $number ? $number : $field['value'] ); break; case 'date_picker': case 'date_time_picker': case 'time_picker': // A block-level date format wins; otherwise match ACF's own output: // acf_format_date() formats the raw stored value with the field's // return_format (localized, timezone-aware). $date = Formatter::format_date( $field['value'], $field['type'], $attr ); $value = null !== $date ? esc_html( $date ) : acf_format_date( $field['value'], $field['return_format'] ); break; case 'google_map': $return_format = $attr['returnFormat'] ?? 'address'; switch ( $return_format ) { case 'lat_lng': $lat = isset( $field['value']['lat'] ) ? $field['value']['lat'] : ''; $lng = isset( $field['value']['lng'] ) ? $field['value']['lng'] : ''; $value = $lat . ', ' . $lng; break; case 'lat': $value = isset( $field['value']['lat'] ) ? $field['value']['lat'] : ''; break; case 'lng': $value = isset( $field['value']['lng'] ) ? $field['value']['lng'] : ''; break; case 'street_number': case 'street_name': case 'street_name_short': case 'city': case 'state': case 'state_short': case 'post_code': case 'country': case 'country_short': $value = isset( $field['value'][ $return_format ] ) ? $field['value'][ $return_format ] : ''; break; case 'address': default: $value = isset( $field['value']['address'] ) ? $field['value']['address'] : ''; break; } // Handle link to Google Maps if ( $is_link && ! empty( $value ) ) { $address = isset( $field['value']['address'] ) ? $field['value']['address'] : ''; $place_id = isset( $field['value']['place_id'] ) ? $field['value']['place_id'] : ''; $map_url = 'https://www.google.com/maps/search/?api=1&query=' . urlencode( $address ); if ( ! empty( $place_id ) ) { $map_url .= '&query_place_id=' . urlencode( $place_id ); } $value = $this->create_link( $map_url, $value, $new_tab ); } else { $value = esc_html( $value ); } break; default: $value = is_array( $field['value'] ) ? array_map( 'esc_html', $field['value'] ) : esc_html( $field['value'] ); break; } // filter empty strings from value if array. if ( is_array( $value ) ) { $value = array_filter( $value, function( $val ) { return '' !== $val; } ); } $value = Helper::apply_filters( 'afb/text/formatted_value', $field, $value, $field, $attr ); if ( '' === $value || ( is_array( $value ) && empty( $value ) ) ) { return ''; } $is_rich_text = 'wysiwyg' === $field['type'] && ! $truncate; $prefix = 'true_false' !== $field['type'] && ! $is_rich_text && ! empty( $attr['prefix'] ) ? $attr['prefix'] : ''; $suffix = 'true_false' !== $field['type'] && ! $is_rich_text && ! empty( $attr['suffix'] ) ? $attr['suffix'] : ''; ob_start(); echo '<' . esc_html( $tag ) . ' ' . wp_kses_post( $wrapper_attributes ) . '>'; if ( ! empty( $prefix ) ) { echo '' . esc_html( $prefix ) . ''; } if ( $is_rich_text ) { echo wp_kses_post( $value ); } elseif ( is_array( $value ) ) { foreach ( $value as $key => $val ) { if ( "ul" === $tag || "ol" === $tag ) { echo '
  • '; } elseif ( 0 < $key && isset( $attr['separator'] ) ) { echo '' . esc_html( $attr['separator'] ) . ''; } echo '' . wp_kses_post( $val ) . ''; if ( "ul" === $tag || "ol" === $tag ) { echo '
  • '; } } } else { echo '' . wp_kses_post( $value ) . ''; } if ( ! empty( $suffix ) ) { echo '' . esc_html( $suffix ) . ''; } echo ''; $output = ob_get_clean(); $output = Helper::apply_filters( 'afb/output', $field, $output, $field, $attr ); $output = Helper::apply_filters( 'afb/text/output', $field, $output, $field, $attr ); return $output; } private function truncate_text( $content, $attr ) { $length = isset( $attr['truncateLength'] ) ? absint( $attr['truncateLength'] ) : 55; $more = isset( $attr['truncateMore'] ) ? (string) $attr['truncateMore'] : '…'; $text = html_entity_decode( wp_strip_all_tags( str_replace( '<', ' <', strip_shortcodes( (string) $content ) ) ), ENT_QUOTES, get_bloginfo( 'charset' ) ); $text = trim( preg_replace( '/\s+/u', ' ', $text ) ); if ( 0 === $length ) { return $text; } if ( isset( $attr['truncateBy'] ) && 'characters' === $attr['truncateBy'] ) { if ( mb_strlen( $text ) <= $length ) { return $text; } return rtrim( mb_substr( $text, 0, $length ) ) . $more; } return wp_trim_words( $text, $length, $more ); } private function create_link( $url, $text, $new_tab = false ) { return '' . esc_html( $text ) . ''; } }