=> $args['id_prefix'] . '_banner',
'desc' => __( 'Choose banner.', 'better-studio' ),
'type' => 'select',
'std' => 'none',
'deferred-options' => array(
'callback' => 'better_ads_get_banners_option',
'args' => array(
- 1,
true,
$args['format']
),
),
'show_on' => array(
array(
$args['id_prefix'] . '_type=banner'
),
),
'_show_on_parent' => $args['id_prefix'] . '_type',
'ad-id' => $args['id_prefix'],
'section_class' => 'better-ads-ad-field',
);
$fields[ $args['id_prefix'] . '_campaign' ] = array(
'name' => __( 'Campaign', 'better-studio' ),
'id' => $args['id_prefix'] . '_campaign',
'desc' => __( 'Choose campaign.', 'better-studio' ),
'type' => 'select',
'std' => 'none',
'deferred-options' => array(
'callback' => 'better_ads_get_campaigns_option',
'args' => array(
- 1,
true
),
),
'show_on' => array(
array(
$args['id_prefix'] . '_type=campaign'
),
),
'_show_on_parent' => $args['id_prefix'] . '_type',
'ad-id' => $args['id_prefix'],
'section_class' => 'better-ads-ad-field',
);
$fields[ $args['id_prefix'] . '_count' ] = array(
'name' => __( 'Max Amount of Allowed Banners', 'better-studio' ),
'id' => $args['id_prefix'] . '_count',
'desc' => __( 'How many banners are allowed?.', 'better-studio' ),
'input-desc' => __( 'Leave empty to show all banners.', 'better-studio' ),
'type' => 'text',
'std' => 1,
'show_on' => array(
array(
$args['id_prefix'] . '_type=campaign'
),
),
'_show_on_parent' => $args['id_prefix'] . '_type',
'ad-id' => $args['id_prefix'],
'section_class' => 'better-ads-ad-field',
);
$fields[ $args['id_prefix'] . '_columns' ] = array(
'name' => __( 'Columns', 'better-studio' ),
'id' => $args['id_prefix'] . '_columns',
'desc' => __( 'Show ads in multiple columns.', 'better-studio' ),
'type' => 'select',
"options" => array(
1 => __( '1 Column', 'better-studio' ),
2 => __( '2 Column', 'better-studio' ),
3 => __( '3 Column', 'better-studio' ),
),
'std' => 1,
'show_on' => array(
array(
$args['id_prefix'] . '_type=campaign'
),
),
'_show_on_parent' => $args['id_prefix'] . '_type',
'ad-id' => $args['id_prefix'],
'section_class' => 'better-ads-ad-field',
);
$fields[ $args['id_prefix'] . '_orderby' ] = array(
'name' => __( 'Order By', 'better-studio' ),
'id' => $args['id_prefix'] . '_orderby',
'type' => 'select',
"options" => array(
'date' => __( 'Date', 'better-studio' ),
'title' => __( 'Title', 'better-studio' ),
'rand' => __( 'Random (Rotate)', 'better-studio' ),
),
'std' => 'rand',
'show_on' => array(
array(
$args['id_prefix'] . '_type=campaign'
),
),
'_show_on_parent' => $args['id_prefix'] . '_type',
'ad-id' => $args['id_prefix'],
'section_class' => 'better-ads-ad-field',
);
$fields[ $args['id_prefix'] . '_order' ] = array(
'name' => __( 'Order', 'better-studio' ),
'id' => $args['id_prefix'] . '_order',
'type' => 'select',
"options" => array(
'ASC' => __( 'Ascending', 'better-studio' ),
'DESC' => __( 'Descending', 'better-studio' ),
),
'std' => 'ASC',
'show_on' => array(
array(
$args['id_prefix'] . '_type=campaign'
),
),
'_show_on_parent' => $args['id_prefix'] . '_type',
'ad-id' => $args['id_prefix'],
'section_class' => 'better-ads-ad-field',
);
{
$extra_desc = '';
$_check = array(
'ad_post_middle' => '',
'ad_post_bottom' => '',
'ad_post_top' => '',
'ad_post_inline' => '',
);
if ( isset( $_check[ $args['id_prefix'] ] ) ) {
$extra_desc = '
' . __( 'Please not the align left and right not works for ad banners like AdSense because of technical limiation. It works for simple image banner.', 'better-studio' ) . '';
}
}
$fields[ $args['id_prefix'] . '_align' ] = array(
'name' => __( 'Align', 'better-studio' ),
'desc' => __( 'Choose align of ad.', 'better-studio' ) . $extra_desc,
'id' => $args['id_prefix'] . '_align',
'type' => 'select',
"options" => array(
'left' => __( 'Left', 'better-studio' ),
'center' => __( 'Center', 'better-studio' ),
'right' => __( 'Right', 'better-studio' ),
),
'std' => 'center',
'show_on' => array(
array(
$args['id_prefix'] . '_type=banner',
),
array(
$args['id_prefix'] . '_type=campaign',
),
),
'_show_on_parent' => $args['id_prefix'] . '_type',
'ad-id' => $args['id_prefix'],
'section_class' => 'better-ads-ad-field',
);
$fields[ $args['id_prefix'] . '_lazy-load' ] = array(
'name' => __( 'Lazy Load Ad?', 'better-studio' ),
'desc' => __( 'Chose the behaviour of lazy loading.', 'better-studio' ),
'id' => $args['id_prefix'] . '_lazy-load',
'type' => 'select',
"options" => array(
'' => __( '-- Inherit from panel --', 'better-studio' ),
'enable' => __( 'Yes, Lazy load this ad', 'better-studio' ),
'disable' => __( 'No, Load this Ad as normal', 'better-studio' ),
),
'std' => 'center',
'show_on' => array(
array(
$args['id_prefix'] . '_type=banner',
),
array(
$args['id_prefix'] . '_type=campaign',
),
),
'_show_on_parent' => $args['id_prefix'] . '_type',
'ad-id' => $args['id_prefix'],
'section_class' => 'better-ads-ad-field',
);
if ( ! empty( $args['end_fields'] ) ) {
foreach ( (array) $args['end_fields'] as $field_id => $field_val ) {
$fields[ $field_id ] = $field_val;
}
}
if ( $args['group'] && $args['group_auto_close'] ) {
$fields[] = array(
'type' => 'group_close',
);
}
}
/**
* Handy function to add Ad location reperator ad field to panel by it's prefix
*
* @param $fields
* @param array $args
*/
function better_ads_inject_ad_repeater_field_to_fields( &$fields, $args = array() ) {
if ( is_string( $args ) ) {
$args = array(
'id_prefix' => $args,
);
}
$args = bf_merge_args( $args, array(
'id_prefix' => '',
'group' => true,
'group_state' => 'close',
'group_title' => __( 'Ad', 'better-studio' ),
'group_auto_close' => true,
'group_desc' => '',
'field_title' => '',
'field_desc' => '',
'field_add_label' => ' ' . __( 'New Ad', 'better-studio' ),
'field_delete_label' => __( 'Delete Ad', 'better-studio' ),
'field_item_title' => __( 'Ad', 'better-studio' ),
'field_item_smart_title' => true,
'start_fields' => '',
'format' => 'normal',
) );
if ( empty( $args['id_prefix'] ) ) {
return;
}
if ( $args['group'] ) {
$fields[] = array(
'name' => $args['group_title'],
'type' => 'group',
'state' => $args['group_state'],
'desc' => $args['group_desc'],
);
}
if ( ! empty( $args['start_fields'] ) ) {
foreach ( (array) $args['start_fields'] as $field_id => $field_val ) {
$fields[ $field_id ] = $field_val;
}
}
$repeater_items = array();
if ( ! empty( $args['field_start_fields'] ) ) {
foreach ( (array) $args['field_start_fields'] as $field_id => $field_val ) {
$repeater_items[ $field_id ] = $field_val;
}
}
$repeater_items['type'] = array(
'name' => __( 'Ad Type', 'better-studio' ),
'id' => 'type',
'desc' => __( 'Choose campaign or banner.', 'better-studio' ),
'type' => 'select',
'options' => array(
'' => __( '-- Select Ad Type --', 'better-studio' ),
'campaign' => __( 'Campaign', 'better-studio' ),
'banner' => __( 'Banner', 'better-studio' ),
),
'repeater_item' => true,
'ad-id' => $args['id_prefix'],
);
$repeater_items['campaign'] = array(
'name' => __( 'Campaign', 'better-studio' ),
'id' => 'campaign',
'desc' => __( 'Choose campaign.', 'better-studio' ),
'type' => 'select',
'deferred-options' => array(
'callback' => 'better_ads_get_campaigns_option',
'args' => array(
- 1,
true,
$args['format']
),
),
'show_on' => array(
array(
'type=campaign'
),
),
'repeater_item' => true,
'ad-id' => $args['id_prefix'],
);
$repeater_items['banner'] = array(
'name' => __( 'Banner', 'better-studio' ),
'id' => 'banner',
'desc' => __( 'Choose banner.', 'better-studio' ),
'type' => 'select',
'deferred-options' => array(
'callback' => 'better_ads_get_banners_option',
'args' => array(
- 1,
true,
$args['format']
),
),
'show_on' => array(
array(
'type=banner'
),
),
'repeater_item' => true,
'ad-id' => $args['id_prefix'],
);
$repeater_items['count'] = array(
'name' => __( 'Max Amount of Allowed Banners', 'better-studio' ),
'id' => 'count',
'desc' => __( 'How many banners are allowed?.', 'better-studio' ),
'input-desc' => __( 'Leave empty to show all banners.', 'better-studio' ),
'type' => 'text',
'show_on' => array(
array(
'type=campaign'
),
),
'repeater_item' => true,
'ad-id' => $args['id_prefix'],
);
$repeater_items['columns'] = array(
'name' => __( 'Columns', 'better-studio' ),
'id' => 'columns',
'desc' => __( 'Show ads in multiple columns.', 'better-studio' ),
'type' => 'select',
"options" => array(
1 => __( '1 Column', 'better-studio' ),
2 => __( '2 Column', 'better-studio' ),
3 => __( '3 Column', 'better-studio' ),
),
'show_on' => array(
array(
'type=campaign'
),
),
'repeater_item' => true,
'ad-id' => $args['id_prefix'],
);
$repeater_items['orderby'] = array(
'name' => __( 'Order By', 'better-studio' ),
'id' => 'orderby',
'type' => 'select',
"options" => array(
'date' => __( 'Date', 'better-studio' ),
'title' => __( 'Title', 'better-studio' ),
'rand' => __( 'Rand', 'better-studio' ),
),
'show_on' => array(
array(
'type=campaign'
),
),
'repeater_item' => true,
'ad-id' => $args['id_prefix'],
);
$repeater_items['order'] = array(
'name' => __( 'Order', 'better-studio' ),
'id' => 'order',
'type' => 'select',
"options" => array(
'ASC' => __( 'Ascending', 'better-studio' ),
'DESC' => __( 'Descending', 'better-studio' ),
),
'show_on' => array(
array(
'type=campaign'
),
),
'repeater_item' => true,
'ad-id' => $args['id_prefix'],
);
{
$extra_desc = '';
$_check = array(
'ad_post_inline' => '',
);
if ( isset( $_check[ $args['id_prefix'] ] ) ) {
$extra_desc = '
' . __( 'Please not the align left and right not works for ad banners like AdSense because of technical limiation. It works for simple image banner.', 'better-studio' ) . '';
}
}
$repeater_items['align'] = array(
'name' => __( 'Align', 'better-studio' ),
'id' => 'align',
'desc' => __( 'Choose align of ad.', 'better-studio' ) . $extra_desc,
'type' => 'select',
'options' => array(
'left' => __( 'Left Align', 'better-studio' ),
'center' => __( 'Center Align', 'better-studio' ),
'right' => __( 'Right Align', 'better-studio' ),
),
'show_on' => array(
array(
'type=banner',
),
array(
'type=campaign',
),
),
'repeater_item' => true,
'ad-id' => $args['id_prefix'],
);
$repeater_items['lazy-load'] = array(
'name' => __( 'Lazy Load Ad?', 'better-studio' ),
'desc' => __( 'Chose the behaviour of lazy loading.', 'better-studio' ),
'id' => 'lazy-load',
'type' => 'select',
"options" => array(
'' => __( '-- Inherit from panel --', 'better-studio' ),
'enable' => __( 'Yes, Lazy load this ad', 'better-studio' ),
'disable' => __( 'No, Load this Ad as normal', 'better-studio' ),
),
'std' => 'center',
'show_on' => array(
array(
'type=banner',
),
array(
'type=campaign',
),
),
'ad-id' => $args['id_prefix'],
'repeater_item' => true,
);
if ( ! empty( $args['field_end_fields'] ) ) {
foreach ( (array) $args['field_end_fields'] as $field_id => $field_val ) {
$repeater_items[ $field_id ] = $field_val;
}
}
$fields[ $args['id_prefix'] ] = array(
'name' => $args['field_title'],
'desc' => $args['field_desc'],
'id' => $args['id_prefix'],
'type' => 'repeater',
'save-std' => true,
'default' => array(
array(
'type' => '',
'campaign' => 'none',
'banner' => 'none',
'paragraph' => 3,
'count' => 3,
'columns' => 3,
'orderby' => 'rand',
'order' => 'ASC',
'align' => 'center',
'lazy-load' => '',
'post_type' => '',
),
),
'add_label' => $args['field_add_label'],
'delete_label' => $args['field_delete_label'],
'item_title' => $args['field_item_title'],
'section_class' => 'full-with-both' . ( $args['field_item_smart_title'] ? ' better-ads-repeater-ad-field' : '' ),
'options' => $repeater_items,
'ad-id' => $args['id_prefix'],
);
if ( ! empty( $args['end_fields'] ) ) {
foreach ( (array) $args['end_fields'] as $field_id => $field_val ) {
$fields[ $field_id ] = $field_val;
}
}
if ( $args['group'] && $args['group_auto_close'] ) {
$fields[] = array(
'type' => 'group_close',
);
}
}
/**
* Shows ad location code by its panel prefix or data
*
* @param string $panel_ad_prefix
* @param null $ad_data
* @param array $args
*/
function better_ads_show_ad_location( $panel_ad_prefix = '', $ad_data = null, $args = array() ) {
if ( empty( $panel_ad_prefix ) ) {
return;
}
if ( is_null( $ad_data ) || ! is_array( $ad_data ) ) {
$ad_data = better_ads_get_ad_location_data( $panel_ad_prefix );
}
if ( ! empty( $args['container-class'] ) ) {
if ( ! empty( $ad_data['container-class'] ) ) {
$ad_data['container-class'] .= ' ' . $args['container-class'] . ' better-ads-loc-' . $panel_ad_prefix;
} else {
$ad_data['container-class'] = $args['container-class'] . ' better-ads-loc-' . $panel_ad_prefix;
}
} else {
$ad_data['container-class'] = 'better-ads-loc-' . $panel_ad_prefix;
}
echo Better_Ads_Manager()->show_ads( $ad_data );
}
/**
* Returns full list of Ad location data from it's prefix inside panel
*
* @param string $panel_ad_prefix
* @param bool $multiple
* @param array|null $extra_fields Extra fields related to this ad location
*
* @return array
*/
function better_ads_get_ad_location_data( $panel_ad_prefix = '', $multiple = false, $extra_fields = null ) {
// Disabled for this item -> not matters for all or not
if ( ! better_ads_ad_can_be_shown( 'ad-location' ) ) {
return better_ads_get_ad_data_default( $extra_fields );
}
return better_ads_get_ad_data( $panel_ad_prefix, $multiple, $extra_fields );
}
/**
* Checks the ad can be shown on page based on the location and the disable feature
* .
*
* @param string $type
*
* @return bool
*/
function better_ads_ad_can_be_shown( $type = '' ) {
$func = '';
$object = '';
$object_id = null;
$disable_all = '';
$disable_item = '';
if ( is_singular() ) {
$func = 'bf_get_post_meta';
$object = get_post_type();
} elseif ( is_archive() ) {
$queried_object = get_queried_object();
if ( ! empty( $queried_object->taxonomy ) ) {
$func = 'bf_get_term_meta';
$object = $queried_object->taxonomy;
} elseif ( is_date() ) {
$object = 'date';
} // WooCommerce shop page is a exception because the page ID is not the same as the value of get_the_ID()
elseif ( function_exists( 'is_woocommerce' ) && is_woocommerce() && is_shop() ) {
$func = 'bf_get_post_meta';
$object = 'page';
$object_id = get_option( 'woocommerce_shop_page_id' );
}
} elseif ( is_search() ) {
$object = 'search';
} elseif ( is_404() ) {
$object = '404';
} elseif ( is_home() ) {
$object = 'home';
}
//
// Disabled for all items
//
if ( ! empty( $object ) ) {
$disable_all = Better_Ads_Manager::get_option( $object . '_disable_all' );
}
//
// Disabled for this item
//
if ( ! empty( $func ) ) {
$disable_loc = '';
if ( $type == 'ad-location' ) {
$disable_loc = call_user_func( $func, 'bam_disable_locations', $object_id );
} elseif ( $type == 'widget' ) {
$disable_loc = call_user_func( $func, 'bam_disable_widgets', $object_id );
} elseif ( $type == 'shortcode' ) {
$disable_loc = call_user_func( $func, 'bam_disable_post_content', $object_id );
}
$disable_item = $disable_loc;
// not 'show' or '1'
// mean it show for location -> highest priority
if ( $disable_loc == '' ) {
$disable_item = call_user_func( $func, 'bam_disable_all', $object_id );
}
// '1' means hide
// '' and 'show' mean Show
if ( $disable_item == 1 ) {
$disable_item = 'hide';
}
//
// $disable_item == '' -> show -> panel have priority
// $disable_item == '1' -> hide -> hide it, more priority than panel
// $disable_item == 'show' -> show -> show it, more priority than panel
//
}
// Disabled for this item -> not matters for all or not
if ( $disable_item == 'hide' ) {
return false;
} // Disabled for all items but this item made it enable!
elseif ( $disable_all && $disable_item != 'show' ) {
return false;
}
return true;
}
if ( ! function_exists( 'better_ads_get_ad_data_default' ) ) {
/**
* returns base data for ad banner!
*
* @param array|null $extra_fields Extra fields related to this ad location
*
* @return array
*/
function better_ads_get_ad_data_default( $extra_fields = null ) {
$fields = array(
'type' => '',
'banner' => '',
'campaign' => '',
'count' => '',
'columns' => '',
'orderby' => '',
'order' => '',
'align' => '',
'lazy-load' => '',
'active_location' => false,
);
if ( ! is_null( $extra_fields ) ) {
$fields = bf_merge_args( $fields, $extra_fields );
}
return $fields;
}
}
if ( ! function_exists( 'better_ads_get_ad_data_override' ) ) {
/**
* Returns data for ad location (even overidded data)
*
* @param string $panel_ad_prefix
* @param bool $multiple
* @param string $type
* @param null $extra_fields Extra fields for current ad location
*
* @return array
*/
function better_ads_get_ad_data_override( $panel_ad_prefix = '', $multiple = false, $type = 'ad-location', $extra_fields = null ) {
$data_ids = better_ads_get_ad_data_default( $extra_fields );
$object_id = 0;
$object_type = '';
$override_id = false;
$data = array();
$data_filled = false;
//
// Find override ID for current page
//
if ( is_home() && is_front_page() ) {
$override_id = 'home';
$object_type = 'home';
} elseif ( is_front_page() ) {
global $wp_query;
if ( 'page' == get_option( 'show_on_front' ) && get_option( 'page_on_front' ) && $wp_query->is_page( get_option( 'page_on_front' ) ) ) {
$override_id = get_post_type();
$object_id = get_queried_object_id();
$object_type = 'post';
} else {
$queried_object = get_queried_object();
if ( ! empty( $queried_object->name ) ) {
$override_id = $queried_object->name;
}
}
} elseif ( is_singular() ) {
if ( get_post_type() ) {
$override_id = get_post_type();
$object_id = get_queried_object_id();
$object_type = 'post';
}
} elseif ( is_post_type_archive() ) {
$queried_object = get_queried_object();
if ( ! empty( $queried_object->name ) ) {
$override_id = $queried_object->name;
}
} elseif ( is_archive() ) {
$queried_object = get_queried_object();
if ( ! empty( $queried_object->taxonomy ) ) {
$override_id = $queried_object->taxonomy;
$object_id = $queried_object->term_id;
$object_type = 'taxonomy';
} elseif ( is_date() ) {
$override_id = 'date';
$object_type = 'date';
}
} elseif ( is_search() ) {
$override_id = 'search';
$object_type = 'search';
} elseif ( is_404() ) {
$override_id = '404';
$object_type = '404';
}
$ad_id = 'ovr_' . $override_id . '-' . $panel_ad_prefix;
$ad_active_id = $ad_id . '-active';
if ( $type == 'ad-location' ) {
if ( $override_id && $object_type === 'post' ) {
//
// The post itself overridden the ad
//
if ( bf_get_post_meta( $ad_active_id, $object_id ) ) {
if ( $multiple ) {
$data = bf_get_post_meta( $ad_id, $object_id );
} else {
foreach ( $data_ids as $id => $value ) {
$data[ $id ] = bf_get_post_meta( $ad_id . '_' . $id, $object_id );
}
}
$data_filled = true;
} else {
//
// iterate all taxonomies of current post to find first term that overridden the ad
//
foreach ( get_post_taxonomies( $object_id ) as $taxonomy ) {
// data filled in prev taxonomy
if ( $data_filled ) {
break;
}
// Exceptions
{
$_check = array(
'post_format' => '',
'post_tag' => '',
);
if ( isset( $_check[ $taxonomy ] ) ) {
continue;
}
}
$terms = wp_get_post_terms( $object_id, $taxonomy );
// todo add default category support
// issue in terms
if ( is_wp_error( $terms ) ) {
continue;
}
foreach ( $terms as $term ) {
// not override in this term
if ( ! bf_get_term_meta( 'ovr_' . $taxonomy . '-' . $panel_ad_prefix . '-active', $term->term_id ) ) {
continue;
}
// not override in this term childs
if ( ! bf_get_term_meta( 'ovr_' . $taxonomy . '-' . $panel_ad_prefix . '-override-in-child', $term->term_id ) ) {
continue;
}
if ( $multiple ) {
$data = bf_get_term_meta( 'ovr_' . $taxonomy . '-' . $panel_ad_prefix, $term->term_id );
} else {
// collects data of overridden ad from term
foreach ( $data_ids as $id => $value ) {
$data[ $id ] = bf_get_term_meta( 'ovr_' . $taxonomy . '-' . $panel_ad_prefix . '_' . $id, $term->term_id );
}
}
$data_filled = true;
break;
}
if ( Better_Ads_Manager::get_option( 'ovr_' . $taxonomy . '-' . $panel_ad_prefix . '-active' ) &&
Better_Ads_Manager::get_option( 'ovr_' . $taxonomy . '-' . $panel_ad_prefix . '-override-in-child' ) ) {
if ( $multiple ) {
$data = Better_Ads_Manager::get_option( 'ovr_' . $taxonomy . '-' . $panel_ad_prefix );
} else {
// collects data of overridden ad from term
foreach ( $data_ids as $id => $value ) {
$data[ $id ] = Better_Ads_Manager::get_option( 'ovr_' . $taxonomy . '-' . $panel_ad_prefix . '_' . $id );
}
}
$data_filled = true;
}
}
}
}
//
// Taxonomy
//
if ( ! $data_filled && $override_id && $object_type === 'taxonomy' &&
bf_get_term_meta( $ad_active_id, $object_id )
) {
if ( $multiple ) {
$data = bf_get_term_meta( $ad_id, $object_id );
} else {
foreach ( $data_ids as $id => $value ) {
$data[ $id ] = bf_get_term_meta( $ad_id . '_' . $id, $object_id );
}
}
$data_filled = true;
}
//
// Option ad location
//
if ( ! $data_filled && $override_id && Better_Ads_Manager::get_option( $ad_active_id ) ) {
if ( $multiple ) {
$data = Better_Ads_Manager::get_option( $ad_id );
} else {
foreach ( $data_ids as $id => $value ) {
$data[ $id ] = Better_Ads_Manager::get_option( $ad_id . '_' . $id );
}
}
$data_filled = true;
}
//
// exact option
//
if ( ! $data_filled ) {
if ( $multiple ) {
$data = Better_Ads_Manager::get_option( $panel_ad_prefix );
} else {
foreach ( $data_ids as $id => $value ) {
$data[ $id ] = Better_Ads_Manager::get_option( $panel_ad_prefix . '_' . $id );
}
}
}
} elseif ( $type === 'option' ) {
$data = '___default___';
if ( $override_id && $object_type === 'post' ) {
$data = bf_get_post_meta( $ad_id, $object_id, $data );
} elseif ( $override_id && $object_type === 'taxonomy' ) {
$data = bf_get_term_meta( $ad_id, $object_id, $data );
}
if ( $data === '___default___' || is_null( $data ) ) {
$data = Better_Ads_Manager::get_option( $panel_ad_prefix );
}
}
return $data;
} // better_ads_get_ad_data_override
}
/**
* Returns full list of Ad location data from it's prefix inside panel
*
* @param string $panel_ad_prefix
* @param bool $multiple
* @param null $extra_fields Extra fields related to current ad location
*
* @return array
*/
function better_ads_get_ad_data( $panel_ad_prefix = '', $multiple = false, $extra_fields = null ) {
$data_ids = better_ads_get_ad_data_default( $extra_fields );
if ( empty( $panel_ad_prefix ) ) {
return $multiple ? array( $data_ids ) : $data_ids;
}
$final_ads = array();
$data = better_ads_get_ad_data_override( $panel_ad_prefix, $multiple, 'ad-location', $extra_fields );
if ( ! $multiple ) {
$data = array( $data );
}
foreach ( $data as $ad_item ) {
// Type not selected
if ( empty( $ad_item['type'] ) || $ad_item['type'] === 'none' ) {
continue;
}
// Banner not selected
if ( $ad_item['type'] === 'banner' && ( empty( $ad_item['banner'] ) || $ad_item['banner'] === 'none' ) ) {
continue;
} // Campaign not selected
elseif ( $ad_item['type'] === 'campaign' && ( empty( $ad_item['campaign'] ) || $ad_item['campaign'] == 'none' ) ) {
continue;
}
// Post type is not valid
if ( ! empty( $ad_item['post_type'] ) ) {
foreach ( explode( ',', $ad_item['post_type'] ) as $post_type ) {
if ( ! is_singular( $post_type ) ) {
continue;
}
}
}
$ad_item['active_location'] = true;
if ( empty( $ad_item['align'] ) ) {
$ad_item['align'] = 'center';
}
if ( bf_is_doing_ajax() ) {
$ad_item['lazy-load'] = 'disable';
} elseif ( empty( $ad_item['lazy-load'] ) ) {
$ad_item['lazy-load'] = Better_Ads_Manager::get_option( 'lazy_loading_ads' );
}
$final_ads[] = $ad_item;
}
// return default ID's
if ( empty( $final_ads ) ) {
return $multiple ? array( $data_ids ) : $data_ids;
}
if ( $multiple ) {
return $final_ads;
}
return current( $final_ads );
}
if ( ! function_exists( 'better_ads_extract_google_ad_code_data' ) ) {
/**
* Handy function to fetching data from Google Adsense code.
*
* @param $code
*
* @return array
*/
function better_ads_extract_google_ad_code_data( $code ) {
$data = array(
'ad-client' => '',
'ad-layout' => '',
'ad-slot' => '',
'ad-format' => '',
'ad-layout-key' => '',
'style' => '',
'full-width-responsive' => '',
);
$code = strtolower( $code );
/**
*
* data-ad-client
*
* Format 1:
*
* Format 2:
*
*/
{
// Format 1
{
preg_match( '/data-ad-client="(.*)"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['ad-client'] = $matches[1];
}
}
// Other format: google_ad_client = "*";
if ( empty( $data['ad-client'] ) ) {
preg_match( '/google_ad_client\s*=\s*"\s*(.*)\s*"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['ad-client'] = $matches[1];
}
}
}
/**
*
* data-ad-slot
*
* Format 1:
*
* Format 2:
*
*/
{
// Format 1
{
preg_match( '/data-ad-slot="(.*)"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['ad-slot'] = $matches[1];
}
}
// Format 2
if ( empty( $data['ad-slot'] ) ) {
preg_match( '/google_ad_slot\s*=\s*"\s*(.*)\s*"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['ad-slot'] = $matches[1];
}
}
}
/**
*
* data-ad-layout-key
*
*/
preg_match( '/data-ad-layout-key="(.*)"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['ad-layout-key'] = $matches[1];
}
/**
*
* data-layout
*
*/
preg_match( '/data-ad-layout="(.*)"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['ad-layout'] = $matches[1];
}
/**
*
* data-ad-format
*
*/
preg_match( '/data-ad-format="(.*)"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['ad-format'] = $matches[1];
}
$_check = array(
'vertical' => '',
'horizontal' => '',
'rectangle' => '',
'fluid' => '',
'autorelaxed' => '',
'auto' => '',
);
if ( empty( $data['ad-format'] ) || ! isset( $_check[ $data['ad-format'] ] ) ) {
$data['ad-format'] = 'auto';
}
/**
*
* data-full-width-responsive
*
*/
preg_match( '/data-full-width-responsive="(.*)"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['full-width-responsive'] = $matches[1];
}
$_check = array(
'false' => '',
'true' => '',
'' => '',
);
if ( ! isset( $_check[ $data['full-width-responsive'] ] ) ) {
$data['full-width-responsive'] = '';
}
/**
*
* style
*
*/
preg_match( '/style="(.*)"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['style'] = $matches[1];
}
/**
*
* Matched Content Customization Attrs
*
*/
{
/**
* matched-content-ui-type
*/
{
preg_match( '/data-matched-content-ui-type="(.*)"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['matched-content-ui-type'] = $matches[1];
}
}
/**
* matched-content-rows-num
*/
{
preg_match( '/data-matched-content-rows-num="(.*)"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['matched-content-rows-num'] = $matches[1];
}
}
/**
* matched-content-columns-num
*/
{
preg_match( '/data-matched-content-columns-num="(.*)"/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['matched-content-columns-num'] = $matches[1];
}
}
}
/**
*
* Style width
*
* Format 1:
*
* Format 2:
*
*/
if ( empty( $data['width'] ) ) {
// Format 1
{
preg_match( '/[^-]width[: ]+([0-9]+)[px]/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['width'] = $matches[1];
}
}
// Format 2
if ( empty( $data['width'] ) ) {
preg_match( '/google_ad_width\s*=\s*(\d*)\s*;/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['width'] = $matches[1];
}
}
}
/**
*
* Style height
*
* Format 1:
*
* Format 2:
*
*/
if ( empty( $data['height'] ) ) {
// Format 1
{
preg_match( '/[^-]height[: ]+([0-9]+)[px]/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['height'] = $matches[1];
}
}
// Format 2
if ( empty( $data['height'] ) ) {
preg_match( '/google_ad_height\s*=\s*(\d*)\s*;/', $code, $matches );
if ( ! empty( $matches[1] ) ) {
$data['height'] = $matches[1];
}
}
}
return $data;
} // better_ads_extract_google_ad_code_data
}
if ( ! function_exists( 'bam_deferred_dfp_spot_options' ) ) {
/**
* Callback for banner options. Extracts spots from list and shows them to user for easy to use.
*
* @param array $args
*
* @return array
*/
function bam_deferred_dfp_spot_options( $args = array() ) {
$options = array(
'' => __( '-- Select Spot --', 'better-studio' ),
'custom' => __( 'Custom Code', 'better-studio' ),
);
$dfp_code = Better_Ads_Manager::get_option( 'dfp_code' );
if ( ! empty( $dfp_code ) ) {
preg_match_all( '#defineSlot\((.*)\).addService#', $dfp_code, $dfp_spots );
} else {
$dfp_spots = array();
}
$group = array(
'label' => __( 'Auto detected DFP spots', 'better-studio' ),
'options' => array()
);
if ( ! empty( $dfp_spots[1] ) ) {
foreach ( $dfp_spots[1] as $_spot ) {
$group['options'][ str_replace( ',', '--', $_spot ) ] = $_spot;
}
}
if ( empty( $group['options'] ) ) {
$group['options']['not-detected'] = array(
'label' => __( 'Please enter DFP code into Better Ads Manager panle', 'better-studio' ),
'disabled' => true,
);
}
$options[] = $group;
return $options;
}
}
if ( ! function_exists( 'better_ads_get_override_sections_list' ) ) {
/**
* Returns list of items that can be overridden
*
* @return array
*/
function better_ads_get_override_sections_list() {
static $sections;
if ( $sections ) {
return $sections;
}
$sections = array(
'post_type' => array(
'label' => 'Post Types',
'items' => array(),
),
'taxonomy' => array(
'label' => 'Taxonomies',
'items' => array(),
),
'general_pages' => array(
'label' => 'General Pages',
'items' => array(),
),
);
//
// CPT's
//
{
$post_types = array_diff_key(
get_post_types(
array(
'public' => true,
)
),
array(
'attachment' => 0,
)
);
foreach ( $post_types as $cpt_id ) {
$post_type = get_post_type_object( $cpt_id );
$sections['post_type']['items'][ $cpt_id ] = array(
'id' => $cpt_id,
'label' => $post_type->labels->singular_name,
'label_plural' => $post_type->labels->name,
);
}
ksort( $sections['post_type']['items'] );
}
//
// Taxonomy
//
{
$taxonomies = array_diff_key(
get_taxonomies(
array(
'public' => true,
)
),
array(
'nav_menu' => 0,
'link_category' => 0,
'post_format' => 0,
'product_shipping_class' => 0,
'product_type' => 0,
)
);
foreach ( $taxonomies as $tax_id ) {
$tax = get_taxonomy( $tax_id );
$sections['taxonomy']['items'][ $tax_id ] = array(
'id' => $tax_id,
'label' => $tax->labels->singular_name,
'label_plural' => $tax->labels->name,
);
}
ksort( $sections['taxonomy']['items'] );
}
//
// General Pages
//
{
// Non-static Homepage
$sections['general_pages']['items']['home'] = array(
'id' => 'home',
'label' => 'Non-Static Homepage',
'label_plural' => 'Non-Static Homepage',
);
// Search page
$sections['general_pages']['items']['search'] = array(
'id' => 'search',
'label' => 'Search Page',
'label_plural' => 'Search Pages',
);
// Date archive pages
$sections['general_pages']['items']['date'] = array(
'id' => 'date',
'label' => 'Date Archive Page',
'label_plural' => 'Date Archive Pages',
);
// 404 page
$sections['general_pages']['items']['404'] = array(
'id' => '404',
'label' => '404 Page',
'label_plural' => '404 Pages',
);
}
return $sections;
} // better_ads_get_override_sections_list
}
if ( ! function_exists( 'better_ads_get_override_fields_list' ) ) {
/**
* Creates fields list of a overriden section
*
* @param array $fields
* @param array $args
*
* @return array
*/
function better_ads_get_override_fields_list( $fields = array(), $args = array() ) {
$section_fields = array();
//
// Loads fields from filter
//
if ( empty( $fields ) ) {
$fields = apply_filters( 'better-framework/panel/better_ads_manager/fields', array() );
}
//
// Remove extra field or not!
//
if ( isset( $args['type'] ) ) {
$exclude_extra_fields_type = $args['type'];
$exclude_extra_fields = true;
} elseif ( bf_is_doing_ajax() && isset( $_REQUEST['type'] ) ) {
$exclude_extra_fields_type = $_REQUEST['type'];
$exclude_extra_fields = true;
} else {
$exclude_extra_fields_type = false;
$exclude_extra_fields = false;
}
$exclude_to_next_tab = false;
// Converts tabs and groups to be nested fields
foreach ( $fields as $field_id => $field ) {
// from start to DFP or AMP ads
if ( ! empty( $field['id'] ) && ( $field['id'] === 'dfp_settings' || $field['id'] === 'amp_ads' || $field['id'] === 'override_settings' ) ) {
break;
}
//
// Remove extra and unneeded override fields.
// For example post ads in taxonomy does not sense!
//
if ( $exclude_extra_fields ) {
// remove extra post ads tab for general pages that post override is not avaliable
if( ($exclude_extra_fields_type === 'general_pages') && ! empty( $field['id'] ) && $field['id'] === 'post_ads_tab' ){
$exclude_to_next_tab = true;
continue;
}
if ( ( $exclude_extra_fields_type === 'metabox' || $exclude_extra_fields_type === 'post_type' ) && ! empty( $field['id'] ) && $field['id'] === 'after_x_post_ad_tab' ) {
$exclude_to_next_tab = true;
continue;
}
// Exclude all field to the next tab field.
if ( $exclude_to_next_tab ) {
if ( ! isset( $field['type'] ) || $field['type'] !== 'tab' ) {
continue;
} else {
$exclude_to_next_tab = false;
}
}
}
// exclude specific fields
if ( isset( $field['exclude-in-override'] ) && $field['exclude-in-override'] ) {
continue;
}
if ( ! empty( $field['type'] ) ) {
if ( $field['type'] === 'tab' ) {
$field['type'] = 'group';
$field['level'] = 2;
$field['state'] = 'close';
unset( $field['ajax-tab'] );
} elseif ( $field['type'] === 'group' ) {
$field['level'] = 4;
$field['type'] = 'group';
$field['state'] = 'close';
} elseif ( $field['type'] === 'heading' ) {
$field['type'] = 'group';
$field['level'] = 3;
$field['state'] = 'close';
}
}
$field['ajax-tab-field'] = 'override_settings';
$section_fields[ $field_id ] = $field;
}
return $section_fields;
} // better_ads_get_override_fields_list
}
if ( ! function_exists( 'better_ads_inject_override_ad_section_fields' ) ) {
/**
* Creates overridable fields for a section
*
* @param array $args
*
* @return array
*/
function better_ads_inject_override_ad_section_fields( $args = array() ) {
$args = bf_merge_args( $args, array(
'id' => '',
'name' => '',
'fields' => array(),
'ajax-section-field' => '',
'type' => '',
) );
$action = '';
$condition_field_id = '';
$override_fields = array();
$closed = true;
foreach ( $args['fields'] as $field_k => $field ) {
// create new ID
if ( ! empty( $field['id'] ) ) {
$id = 'ovr_' . $args['id'] . '-' . $field['id'];
} else {
$id = $field_k;
}
if ( ! isset( $override_fields[ $args['id'] . '_disable_all' ] ) ) {
$override_fields[ $args['id'] . '_disable_all' ] = array(
'name' => sprintf( __( 'Hide all Ads in "%s"', 'better-studio' ), $args['name'] ),
'desc' => sprintf( __( 'by enabling this all ads inside "%s" will be disabled and not showing.', 'better-studio' ), $args['name'] ),
'id' => $args['id'] . '_disable_all',
'type' => 'switch',
'std' => 0,
'ajax-tab-field' => $args['ajax-section-field'],
);
}
//
// Add condition field for group fields
//
if ( $action == 'add condition' ) {
if ( isset( $field['ad-id'] ) ) {
$condition_field_id = 'ovr_' . $args['id'] . '-' . $field['ad-id'] . '-active';
} else {
$condition_field_id = $id . '-active';
}
$override_fields[ $condition_field_id ] = array(
'name' => __( 'Override this ad?', 'better-studio' ),
'desc' => sprintf( __( 'You can override this ad location for "%s" with enabling this option', 'better-studio' ), $args['name'] ),
'id' => $condition_field_id,
'type' => 'switch',
'std' => 0,
'ajax-tab-field' => $args['ajax-section-field'],
);
//
// Adds an override ads in the post of taxonomy field to the ad override fields
//
if ( $args['type'] === 'taxonomy' ) {
if ( isset( $field['ad-id'] ) ) {
$override_child_field_id = 'ovr_' . $args['id'] . '-' . $field['ad-id'] . '-override-in-child';
} else {
$override_child_field_id = $id . '-override-in-child';
}
$override_fields[ $override_child_field_id ] = array(
'name' => __( 'Override inside the Child Posts?', 'better-studio' ),
'desc' => sprintf( __( 'By enabling this option the overridden ad will be shows for all posts of this "%s".', 'better-studio' ), $args['name'] ),
'id' => $override_child_field_id,
'type' => 'switch',
'std' => 0,
'ajax-tab-field' => $args['ajax-section-field'],
'show_on' => array(
array(
$condition_field_id . '=1'
)
)
);
}
$action = 'add filter';
}
//
// Add filter for group fields (show_on)
//
if ( $action == 'add filter' && $field['type'] !== 'group' ) {
//
// Update old show_on value
//
if ( isset( $field['show_on'] ) ) {
$new_show_on = array();
if ( ! empty( $field['_show_on_parent'] ) ) {
$type_id = $field['_show_on_parent'];
$rep_id = 'ovr_' . $args['id'] . '-' . $field['_show_on_parent'];
} else {
//
// remove text after last _ to detect the parent field id for replacement
// We suggest to add "_show_on_parent" to parent.
//
$type_id = explode( '_', $field['id'] );
if ( bf_count( $type_id ) > 1 ) {
array_pop( $type_id );
}
$type_id = implode( '_', $type_id );
$rep_id = 'ovr_' . $args['id'] . '-' . $type_id;
}
// renames old ID's to new id
foreach ( $field['show_on'] as $show_l1 ) {
$_show_l1 = array();
foreach ( $show_l1 as $show_l2 ) {
$_show_l1[] = str_replace( $type_id, $rep_id, $show_l2 );
}
$new_show_on[] = $_show_l1;
}
// add new filter to show on
foreach ( $new_show_on as $idx => $_ ) {
$new_show_on[ $idx ][] = $condition_field_id . '=1';
}
$field['show_on'] = $new_show_on;
} else {
$field['show_on'] = array(
array(
$condition_field_id . '=1'
)
);
}
}
if ( $field['type'] === 'group' && $field['level'] == 2 ) {
$override_fields[ $id . '-close' ] = array(
'type' => 'group_close',
'ajax-tab-field' => $args['ajax-section-field'],
'level' => 'all',
);
}
if ( $field['type'] !== 'group_close' ) {
$field['id'] = $id;
$field['ajax-tab-field'] = $args['ajax-section-field'];
$override_fields[ $id ] = $field;
}
//
// auto close for old group
//
if ( $field['type'] === 'group' && $field['level'] == 4 && ! $closed ) {
$override_fields[ $id . '-close' ] = array(
'type' => 'group_close',
'ajax-tab-field' => $args['ajax-section-field'],
);
$closed = true;
}
//
// group start -> condition field should be added
//
if ( $field['type'] === 'group' && $field['level'] == 4 ) {
$action = 'add condition';
}
//
// End of group -> clear
//
elseif ( $field['type'] === 'group_close' ) {
$action = '';
$condition_field_id = '';
$closed = true;
}
}
return $override_fields;
} // better_ads_inject_override_ad_section_fields
}
if ( ! function_exists( 'better_ads_section_override_fields_list' ) ) {
/**
* Prepares fields to opened group in ajax action of panel
*
* @param $args
*
* @return array
*/
function better_ads_section_override_fields_list( $args ) {
$section_fields_list = better_ads_get_override_fields_list( array(), $args );
if ( empty( $args['ajax-section-field'] ) ) {
$args['ajax-section-field'] = 'ajax-section-field';
}
$section_fields = better_ads_inject_override_ad_section_fields( array(
'id' => $args['section'],
'name' => $args['section-name'],
'fields' => $section_fields_list,
'ajax-section-field' => $args['ajax-section-field'],
'type' => ! empty( $args['type'] ) ? $args['type'] : '',
) );
return $section_fields;
}
}
if ( ! function_exists( 'better_ads_section_disable_fields_list' ) ) {
/**
* Prepares fields to opened group in ajax action of panel
*
* @param array $fields
* @param array $args
*
* @return array
*/
function better_ads_section_disable_fields_list( $fields = array(), $args = array() ) {
$args = bf_merge_args( $args, array(
'type' => 'post',
) );
$fields['bam_disable_all'] = array(
'name' => __( 'Disable All Ads?', 'better-studio' ),
'id' => 'bam_disable_all',
'type' => 'select',
'options' => array(
'' => __( '-- Inherit From Ads Manager Panel --', 'better-studio' ),
'1' => __( 'Disable All Ads', 'better-studio' ),
'show' => __( 'Show All Ads', 'better-studio' ),
),
'desc' => __( 'Hides all ads.', 'better-studio' ),
);
$fields['bam_disable_locations'] = array(
'name' => __( 'Disable All Ad Locations?', 'better-studio' ),
'id' => 'bam_disable_locations',
'type' => 'select',
'options' => array(
'' => __( '-- Inherit From Ads Manager Panel --', 'better-studio' ),
'1' => __( 'Disable All Ads', 'better-studio' ),
'show' => __( 'Show All Ads', 'better-studio' ),
),
'desc' => __( 'Hides only ad locations.', 'better-studio' ),
);
$fields['bam_disable_widgets'] = array(
'name' => __( 'Disable All Widgets?', 'better-studio' ),
'id' => 'bam_disable_widgets',
'type' => 'select',
'options' => array(
'' => __( '-- Inherit From Ads Manager Panel --', 'better-studio' ),
'1' => __( 'Disable All Ads', 'better-studio' ),
'show' => __( 'Show All Ads', 'better-studio' ),
),
'desc' => __( 'Hides ad widgets.', 'better-studio' ),
);
if ( $args['type'] === 'post' ) {
$fields['bam_disable_post_content'] = array(
'name' => __( 'Disable All Content Ads?', 'better-studio' ),
'id' => 'bam_disable_post_content',
'type' => 'select',
'options' => array(
'' => __( '-- Inherit From Ads Manager Panel --', 'better-studio' ),
'1' => __( 'Disable All Ads', 'better-studio' ),
'show' => __( 'Show All Ads', 'better-studio' ),
),
'desc' => __( 'Hides post content ads.', 'better-studio' ),
);
}
return $fields;
}
}
if ( ! function_exists( 'better_ads_capability' ) ) {
/**
* @since 1.20.0
* @return array
*/
function better_ads_capability() {
$options = get_option( 'better_ads_manager' );
if ( is_super_admin() || empty( $options['roles'] ) ) {
return 'manage_options';
}
foreach ( $options['roles'] as $capability ) {
if ( current_user_can( $capability ) ) {
return $capability;
}
}
return 'manage_options';
}
}
if ( ! function_exists( 'better_ads_user_roles' ) ) {
/**
* @since 1.20.0
* @return array
*/
function better_ads_user_roles() {
if ( ! function_exists( 'get_editable_roles' ) ) {
include ABSPATH . '/wp-admin/includes/user.php';
}
$roles = [];
foreach ( get_editable_roles() as $role => $role_info ) {
$roles[$role] = $role_info['name'];
}
return $roles;
}
}