: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Enable displaying Posts in the Builder Maps Pro addon
function tbp_maps_pro_posts_data_provider( $providers ) {
class Maps_Pro_Data_Provider_Posts extends Maps_Pro_Data_Provider {
return __( 'Posts', 'tbp' );
'label' => __( 'Custom Field for Address', 'tbp' ),
'type' => 'autocomplete',
'dataset' => 'custom_fields',
'help' => __( 'Name of the custom field that will be used as the location for marker. Accepts both human-readable address and Lat/Lng values.', 'tbp' ),
'id' => 'post_type_post',
'term_id' => 'tax_category',
'slug_id' => 'post_slug',
'label' => __( 'Posts Per Page', 'tbp' ),
'help' => __( 'Enter the number of post to display.', 'tbp' )
'label' => __( 'Order', 'tbp' ),
'help' => __( 'Descending = show newer posts first', 'tbp' ),
'label' => __( 'Order By', 'tbp' ),
'date' => __( 'Date', 'tbp' ),
'ID' => __( 'ID', 'tbp' ),
'author' => __( 'Author', 'tbp' ),
'title' => __( 'Title', 'tbp' ),
'name' => __( 'Name', 'tbp' ),
'modified' => __( 'Modified', 'tbp' ),
'rand' => __( 'Random', 'tbp' ),
'comment_count' => __( 'Comment Count', 'tbp' )
'label' => __( 'Offset', 'tbp' ),
'help' => __( 'Enter the number of post to displace or pass over.', 'tbp' )
'label' => __( 'PTB Map field', 'tbp' ),
'dataset' => 'ptb_map_fields', // "tb_select_dataset_ptb_map_fields" filter will populate this field
'wrap_class' => function_exists( 'run_ptb' ) ? '' : 'tb_hide',
'help' => sprintf( __( 'Select the field that will be used as the location for marker. Requires <a href="%s">PTB Extra Fields</a> addon.', 'tbp' ), 'https://themify.me/ptb-addons/extra-fields' ),
'empty' => array( 'show' => array( 'custom_field' ) ),
'not_empty' => array( 'hide' => array( 'custom_field' ) ),
'label' => __('Icon', 'tbp')
function get_items( $settings ) {
$settings = wp_parse_args( $settings, array(
'post_type_post' => 'post',
'term_type' => 'category',
'post_status' => 'publish',
'post_type' => $settings['post_type_post'],
'posts_per_page' => $settings['per_page'],
'order' => $settings['order'],
'orderby' => $settings['orderby'],
'ignore_sticky_posts'=>true,
'suppress_filters' => false,
'offset' => $settings['offset'],
if ( $settings['term_type'] === 'post_slug' ) {
if ( $settings['post_slug'] !== '' ) {
$args['post__in'] = Themify_Builder_Model::parse_slug_to_ids( $settings['post_slug'], $args['post_type'] );
$terms = isset( $settings[ "tax_{$settings['tax']}" ] ) ? $settings[ "tax_{$settings['tax']}" ] : ( isset( $settings['tax_category'] ) ? $settings['tax_category'] : false );
if ( $terms === false ) {
// deal with how category fields are saved
$terms = preg_replace('/\|[multiple|single]*$/', '', $terms);
$temp_terms = explode(',', $terms);
foreach ( $temp_terms as $t ) {
if ( ! is_numeric( $t ) ) {
array_push( $new_terms, trim( $t ) );
if ( ! empty( $new_terms ) && ! in_array( '0', $new_terms ) ) {
$args['tax_query'] = array(
'taxonomy' => $settings['tax'],
'field' => $is_string ? 'slug' : 'id',
'operator' => ( '-' === substr( $terms, 0, 1 ) ) ? 'NOT IN' : 'IN'
$query = new WP_Query( apply_filters( 'tb_maps_pro_query', $args, $settings ) );
if ( is_object( $post ) ){
$saved_post = clone $post;
while ( $query->have_posts() ) {
$item = $this->get_item( $settings );
if ( ! empty( $item ) ) {
if ( isset( $saved_post ) && is_object( $saved_post ) ) {
setup_postdata( $saved_post );
function get_item( $settings ) {
if ( ! empty ( $settings['ptb_map_field'] ) ) {
$meta_key = explode( ':', $settings['ptb_map_field']);
$meta_key = !empty($meta_key[1]) ? ('ptb_' . $meta_key[1]) : $settings['ptb_map_field'];
$address = get_post_meta( get_the_id(), $meta_key, true );
if ( is_array( $address ) ) {
$address = json_decode( $address['place'], true );
$address = $address['location']['lat'] . ', ' . $address['location']['lng'];
$address = get_post_meta( get_the_id(), $settings['custom_field'], true );
// skip posts that don't have the designated "address" meta field
<div style="float: left; margin-right: 10px;">
<img src="%1$s" alt="%3$s" />
<a href="%2$s"><strong>%3$s</strong></a>
esc_attr( get_the_post_thumbnail_url( get_the_id(), 'thumbnail' ) ),
esc_attr( get_permalink() ),
esc_html( get_the_title() ),
esc_html( get_the_excerpt() )
'image' => $settings['marker_icon'],
$providers['posts'] = 'Maps_Pro_Data_Provider_Posts';
add_filter( 'tb_maps_pro_data_providers', 'tbp_maps_pro_posts_data_provider' );
* Handles filling dynamic values for the "ptb_map_field" option in Maps Pro
function tbp_maps_pro_posts_map_fields( $values ) {
'options' => array_merge(
Tbp_Utils::get_ptb_fields_by_type( 'map' )
add_filter( 'tb_select_dataset_ptb_map_fields', 'tbp_maps_pro_posts_map_fields' );