';
echo '
';
// section | global section edit button
if( !empty($section['mfn_global_section_id']) ) {
echo '
Edit Global Section';
}
// section | add new before
echo '
'. esc_html__('Add section', 'mfn-opts') .'';
// section | header
echo '';
// section | content
echo '
';
// section | sortable
echo '
';
// section | new
echo '
';
// section | existing content
if ( $section ){
// be sections global pbl
if( $mfn_global_section_id ) {
$section = get_post_meta($mfn_global_section_id, 'mfn-page-items', true);
if ( !is_array($section) ) {
$section = unserialize( call_user_func('base'.'64_decode', $section), ['allowed_classes' => false] );
}
$section = $section[0];
echo '
';
}
// FIX | Muffin Builder 2 compatibility
// there were no wraps inside section in Muffin Builder 2
if ( ! isset( $section['wraps'] ) && ! empty( $section['items'] ) ) {
$fix_wrap = array(
'size' => '1/1',
'items' => $section['items'],
);
$section['wraps'] = array( $fix_wrap );
}
// end FIX
if ( isset( $section['wraps'] ) && is_array( $section['wraps'] ) ) {
foreach ( $section['wraps'] as $wrap ) {
$this->wrap( $wrap, $uid );
}
}
}
echo '
';
echo '
';
// section | meta data
echo '
';
// section | meta fields
$section_fields = $this->fields->get_section();
foreach ( $section_fields as $field ) {
if( $field['type'] == 'header' || empty( $field['type'] ) ){
// row header
if ( ! isset( $field['class'] ) ) {
$field['class'] = false;
}
Mfn_Post_Type::row_header( $field['title'], $field );
} elseif( 'html' == $field['type'] ) {
echo $field['html'];
} else {
// responsive
$devices = ['desktop'];
if( ! empty( $field['responsive'] ) ){
$devices = ['desktop', 'laptop', 'tablet', 'mobile'];
}
foreach ( $devices as $device ){
$value = '';
// assign oryginal field data to device
$device_field = $field;
if( ! empty( $field['responsive'] ) ){
$device_field['responsive'] = $device;
}
// do not add postfix to device
if( 'desktop' !== $device ){
if( ! empty( $device_field['old_id'] ) ) {
$device_field['old_id'] .= '_'. $device;
}
$device_field['id'] .= '_'. $device;
}
// existing section or default value
if ( isset( $device_field['id'] ) && isset( $section['attr'][ $device_field['id'] ] ) ) {
$value = $section['attr'][ $device_field['id'] ];
} else {
$value = '';
}
// legacy: check old_id
if( ! $value && isset( $device_field['old_id'] ) && isset( $section['attr'][ $device_field['old_id'] ] ) ){
$value = $section['attr'][ $device_field['old_id'] ];
}
// default values
if ( ! $value && '0' !== $value && isset( $device_field['std'] ) ) {
$value = $device_field['std'];
}
// field ID
if( isset($device_field['id']) ){
$device_field['id'] = 'mfn-section['. $uid .']['. $device_field['id'] .']';
}
// PRINT single FIELD
$meta = 'filled'; // filled field uses 'name'
if ( empty( $value ) || ( is_array( $value ) && ! array_filter( $value ) ) ){
$meta = 'empty'; // 'empty' = field uses 'data-name'
}
// style fields using array
if ( isset( $value['val'] ) && empty( $value['val'] ) ){
$meta = 'empty'; // 'empty' = field uses 'data-name'
}
self::field( $device_field, $value, $meta );
}
}
}
echo '
';
// section | add new after
echo '
'. esc_html__('Add section', 'mfn-opts') .'';
echo '
';
}
/**
* PRINT single WRAP
*/
public function wrap( $wrap = false, $parent_id = false, $deprecated = false )
{
// size
if( empty( $wrap['size'] ) ){
$wrap['size'] = '1/1';
}
if( empty( $wrap['tablet_size'] ) ){
$wrap['tablet_size'] = $wrap['size']; // the same as desktop size
}
if( empty( $wrap['mobile_size'] ) ){
$wrap['mobile_size'] = '1/1'; // always 1/1 like in the Muffin Builder 3
}
// wrap ID
if( ! empty( $wrap['uid'] ) ){
$uid = $wrap['uid'];
} else {
$uid = Mfn_Builder_Helper::unique_ID();
}
// attributes
$class = [];
if( empty( $wrap['items'] ) ){
$class[] = 'empty';
}
if ( 'divider' == $wrap['size'] ) {
$class[] = 'divider';
}
//be sections global pbl
$is_global_wrap = !empty($wrap['attr']['global_wraps_select']);
if( $is_global_wrap ) {
$mfn_global_wrap_id = $wrap['attr']['global_wraps_select'];
$class[] = 'mfn-global-wrap';
}
$class = implode(' ', $class);
// output -----
echo '';
if( $is_global_wrap ){
echo '
Edit Global Wrap';
}
echo '
';
echo '
';
echo '
';
echo '
';
echo '
';
// wrap | header
echo '';
// wrap | content
echo '
';
echo '
';
// wrap | sortable
echo '
';
// wrap | existing content
//be sections global pbl
if( $is_global_wrap ) {
$section = get_post_meta($mfn_global_wrap_id, 'mfn-page-items', true);
if ( !is_array($section) ) {
$section = unserialize( call_user_func('base'.'64_decode', $section), ['allowed_classes' => false] );
}
$wrap['items'] = $section[0]['wraps'][0]['items'];
}
if ( isset( $wrap['items'] ) && is_array( $wrap['items'] ) ) {
foreach ( $wrap['items'] as $item ) {
$this->item( $item['type'], $item, $uid );
}
}
echo '
';
echo '
';
echo '
';
// wrap | meta
echo '
';
// wrap | meta fields
$wrap_fields = $this->fields->get_wrap();
foreach ( $wrap_fields as $field ) {
if( $field['type'] == 'header' || empty( $field['type'] ) ){
// row header
if ( ! isset( $field['class'] ) ) {
$field['class'] = false;
}
Mfn_Post_Type::row_header( $field['title'], $field );
} elseif( 'html' == $field['type'] ) {
echo $field['html'];
} else {
// responsive
$devices = ['desktop'];
if( ! empty( $field['responsive'] ) ){
$devices = ['desktop', 'laptop', 'tablet', 'mobile'];
}
foreach ( $devices as $device ){
$value = '';
// assign oryginal field data to device
$device_field = $field;
if( ! empty( $field['responsive'] ) ){
$device_field['responsive'] = $device;
}
// do not add postfix to device
if( 'desktop' !== $device ){
if( ! empty( $device_field['old_id'] ) ) {
$device_field['old_id'] .= '_'. $device;
}
$device_field['id'] .= '_'. $device;
}
// existing wrap or default value
if ( isset( $device_field['id'] ) && isset( $wrap['attr'][ $device_field['id'] ] ) ) {
$value = $wrap['attr'][ $device_field['id'] ];
} else {
$value = '';
}
// legacy: check old_id
if( ! $value && isset( $device_field['old_id'] ) && isset( $wrap['attr'][ $device_field['old_id'] ] ) ){
$value = $wrap['attr'][ $device_field['old_id'] ];
}
// default values
if ( ! $value && '0' !== $value && isset( $device_field['std'] ) ) {
$value = $device_field['std'];
}
// field ID
if( isset($device_field['id']) ){
$device_field['id'] = 'mfn-wrap['. $uid .']['. $device_field['id'] .']';
}
// PRINT single FIELD
$meta = 'filled'; // filled field uses 'name'
if ( empty( $value ) || ( is_array( $value ) && ! array_filter( $value ) ) ){
$meta = 'empty'; // 'empty' = field uses 'data-name'
}
// style fields using array
if ( isset( $value['val'] ) && empty( $value['val'] ) ){
$meta = 'empty'; // 'empty' = field uses 'data-name'
}
self::field( $device_field, $value, $meta );
}
}
}
echo '
';
echo '
';
}
/**
* PRINT single ITEM
*/
public function item( $item_type, $item = false, $parent_id = false, $deprecated = false )
{
$item_fields = $this->fields->get_item_fields( $item_type );
if( $item && ! isset( $item['attr'] ) ){
$item['attr'] = ! empty($item['fields']) ? $item['fields'] : [];
}
// size
if( empty( $item['size'] ) ){
$item['size'] = $item_fields['size'];
}
if( empty( $item['tablet_size'] ) ){
$item['tablet_size'] = $item['size']; // the same as desktop size
}
if( empty( $item['mobile_size'] ) ){
$item['mobile_size'] = '1/1'; // always 1/1 like in the Muffin Builder 3
}
// item ID
if( ! empty( $item['uid'] ) ){
$uid = $item['uid'];
} else {
$uid = Mfn_Builder_Helper::unique_ID();
}
// label
$label = false;
if( ! empty( $item['attr']['title'] ) ){
$label = $item['attr']['title'];
}
// google fonts used in the inline editor: blockquote, colum, visual
if( empty($item['used_fonts']) ){
$item['used_fonts'] = '';
};
// output -----
echo '';
echo '
';
echo '
';
echo '
';
echo '
';
echo '
';
echo '
';
echo '
';
echo '';
echo '';
// item preview
if( $this->preview ){
$preview = [
'image' => '',
'title' => '',
'subtitle' => '',
'content' => '',
'style' => '',
'number' => '',
'category' => '',
'category-all' => '',
'icon' => '',
'tabs' => '',
'images' => '',
'align' => '',
];
$preview_empty = [];
$preview_tabs_primary = 'title';
foreach ( $item_fields['attr'] as $field ) {
if ( isset( $field['preview'] ) ){
$prev_key = $field['preview'];
$prev_id = $field['id'];
// existing item or default value
if( isset( $item['attr'] ) ){
if( isset( $item['attr'][$prev_id] ) ){
if( isset( $item['attr'][$prev_id]['val'] ) ){
$preview[$prev_key] = $item['attr'][$prev_id]['val'];
} else {
$preview[$prev_key] = $item['attr'][$prev_id];
}
}
if( 'tabs' === $field['type'] && empty( $item['attr']['tabs'] ) ){
$preview[$prev_key] = '';
}
} elseif( ! empty( $field['std'] ) ){
$preview[$prev_key] = $field['std'];
if ( empty( $this->options['pre-completed'] ) ){
if ( in_array( $field['type'], ['tabs', 'text', 'textarea', 'upload'] ) ){
$preview[$prev_key] = '';
}
}
}
// tabs
if( 'tabs' == $field['preview'] ){
if( ! empty( $field['primary'] ) ){
$preview_tabs_primary = $field['primary'];
}
}
// category
if( 'category' == $field['preview'] ){
if( $preview['category'] ){
$cat_obj = get_category_by_slug( $preview['category'] );
if( is_object( $cat_obj ) ){
$preview['category'] = $cat_obj->name;
} else {
$preview['category'] = 'All';
}
} else {
$preview['category'] = 'All';
}
}
}
}
// multiple categories
if ( $preview['category-all'] ){
$preview['category'] = $preview['category-all'];
}
// icon
if ( in_array( $item_type, ['counter','icon_box','list'] ) && $preview['image'] ){
// image replaces icon in some items
$preview['icon'] = '';
}
// SVG placeholder
if ( in_array( $item_type, ['map','map_basic'] ) ){
$preview['image'] = get_theme_file_uri( '/muffin-options/svg/placeholders/map.svg' );
}
if ( in_array( $item_type, ['code','content','fancy_divider','sidebar_widget','slider_plugin','video'] ) ){
$preview['image'] = get_theme_file_uri( '/muffin-options/svg/placeholders/'. $item_type .'.svg' );
}
// empty
foreach( $preview as $prev_key => $prev_val ){
if( $prev_val ){
$preview_empty[ $prev_key ] = '';
} else {
$preview_empty[ $prev_key ] = 'empty';
}
}
// content limit
if ( $preview['content'] ){
$excerpt = $preview['content'];
if ( in_array( $item_type, ['column', 'visual'] ) ){
// remove unwanted HTML tags
$excerpt = wp_kses( $excerpt, Mfn_Builder_Helper::allowed_html() );
// wrap shortcodes into span to highlight
$excerpt = preg_replace( '/(\[(.*?)?\[\/)((.*?)?\])|(\[(.*?)?\])/', '
$0', $excerpt);
// autoclose tags
$excerpt = force_balance_tags( $excerpt );
} else {
$excerpt = strip_shortcodes( strip_tags( $excerpt ) );
$excerpt = preg_split( '/\b/', $excerpt, 16 * 2 + 1 );
array_pop( $excerpt );
$excerpt = implode( $excerpt );
if( strlen( $excerpt ) < strlen( $preview['content'] ) ){
$excerpt = $excerpt .'...';
}
}
$preview['content'] = $excerpt;
}
echo '
';
echo '
';
echo '
 .')
';
echo '
';
echo '
';
echo '
'. esc_html( $preview['title'] ) .'
';
echo '
'. esc_html( $preview['subtitle'] ) .'
';
echo '
'. $preview['content'] .'
';
echo '
';
$placeholder_type = $this->get_item_placeholder_type( $item_type );
if( 'standard' == $placeholder_type ){
$placeholder = get_theme_file_uri( '/muffin-options/svg/placeholders/'. $item_type .'.svg' );
echo '
';
} elseif ( 'variable' == $placeholder_type ) {
// existing item or default value
if( isset( $item['attr'] ) ){
$item_style = str_replace( array( ',', ' ' ), '-', $item['attr']['style'] );
} else {
$item_style = 'grid';
}
$placeholder_dir = get_theme_file_uri( '/muffin-options/svg/select/'. $item_type .'/' );
$placeholder = $placeholder_dir . $item_style .'.svg';
echo '
';
}
echo ''. esc_html( $preview['number'] ) .'';
echo '
';
echo '
';
echo '
'. esc_html__('Category', 'mfn-opts') .':'. esc_html( $preview['category'] ) .'
';
echo '
';
if ( $preview['tabs'] ){
foreach ( $preview['tabs'] as $tab ) {
echo '- '. $tab[$preview_tabs_primary] .'
';
}
}
echo '
';
echo '
';
if ( $preview['images'] ){
$preview['images'] = explode( ',', $preview['images'] );
foreach ( $preview['images'] as $image ){
echo '- '. wp_get_attachment_image( $image, 'thumbnail' ) .'
';
}
}
echo '
';
echo '
';
echo '
';
}
// item | meta
echo '
';
// item | meta fields
foreach ( $item_fields['attr'] as $field ) {
if ( ! isset( $field['class'] ) ) {
$field['class'] = '';
}
// hide fields for specified style: simple/classic
if( isset( $field['themeoptions'] ) ){
$themeoption = explode(':', $field['themeoptions']);
if( isset($themeoption[1]) ){
if( $this->theme_options['style'] != $themeoption[1] ){
continue;
}else{
$field['class'] .= empty( $this->theme_options['style'] ) ? ' theme-classic-style' : ' theme-simple-style';
}
}
}
if( $field['type'] == 'header' || empty( $field['type'] ) ){
// row header
Mfn_Post_Type::row_header( $field['title'], $field );
} elseif( 'html' == $field['type'] ) {
echo $field['html'];
} else {
// responsive
$devices = ['desktop'];
if( ! empty( $field['responsive'] ) ){
$devices = ['desktop', 'laptop', 'tablet', 'mobile'];
}
foreach ( $devices as $device ){
$value = '';
// assign oryginal field data to device
$device_field = $field;
if( ! empty( $field['responsive'] ) ){
$device_field['responsive'] = $device;
}
// do not add postfix to device
if( 'desktop' !== $device ){
if( ! empty( $device_field['old_id'] ) ) {
$device_field['old_id'] .= '_'. $device;
}
$device_field['id'] .= '_'. $device;
}
// existing item or default value
if( isset( $item['attr'] ) ){
// existing
if( isset( $device_field['id'] ) && isset( $item['attr'][ $device_field['id'] ] ) ){
$value = $item['attr'][ $device_field['id'] ];
}
// legacy: check old_id
if( ! $value && isset( $device_field['old_id'] ) && isset( $item['attr'][ $device_field['old_id'] ] ) ){
$value = $item['attr'][ $device_field['old_id'] ];
}
// tabs
if( 'tabs' === $device_field['type'] && empty( $item['attr']['tabs'] ) ){
$value = [];
}
} else {
// new
if ( isset( $device_field['std'] ) ){
$value = $device_field['std'];
}
if ( empty( $this->options['pre-completed'] ) ){
if ( in_array( $device_field['type'], ['text', 'textarea', 'upload'] ) ){
$value = '';
}
if ( 'tabs' === $device_field['type'] ){
$value = [];
}
}
}
// field ID
if( isset($device_field['id']) ){
$device_field['id'] = 'mfn-item['. $uid .']['. $device_field['id'] .']';
}
// PRINT single FIELD
$meta = 'filled'; // filled field uses 'name'
if ( empty( $value ) || ( is_array( $value ) && ! array_filter( $value ) ) ){
$meta = 'empty'; // 'empty' = field uses 'data-name'
}
// style fields using array
if ( isset( $value['val'] ) && empty( $value['val'] ) ){
$meta = 'empty'; // 'empty' = field uses 'data-name'
}
self::field( $device_field, $value, $meta );
}
}
}
echo '
';
echo '
';
}
/**
* SEO content
*/
public function rankMath( $id = false, $mfn_items = false ){
// RankMath hidden content field
if( ! $mfn_items && $id ){
if( ! class_exists('RankMath') ){
return;
}
// BeBuilder Blocks disabled
if( mfn_opts_get('builder-blocks') ){
return;
}
$mfn_items = get_post_meta($id, 'mfn-page-items', true);
// FIX | Muffin Builder 2 compatibility
if ($mfn_items && ! is_array($mfn_items)) {
$mfn_items = unserialize(call_user_func('base'.'64_decode', $mfn_items), ['allowed_classes' => false]);
}
}
// analize content
$seo_content = '';
$skip = [
'#FFFFFF',
'{featured_image}',
'contain',
'center',
'center center',
'center top',
'default',
'disable',
'full',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'hide',
'hide-mobile',
'hide-tablet',
'horizontal',
'inline',
'left',
'no-repeat',
'none',
'right',
'show',
'solid',
'thumbnail',
'top',
'unset',
]; // seo values to skip
if( ! empty( $mfn_items ) ){
foreach( $mfn_items as $section ){
if( ! empty( $section['wraps'] ) ){
foreach( $section['wraps'] as $wrap ){
if( ! empty( $wrap['items'] ) ){
foreach( $wrap['items'] as $item ){
if( ! isset($item['attr']) ){
$item['attr'] = ! empty($item['fields']) ? $item['fields'] : [];
}
if( ! empty( $item['attr'] ) ){
foreach( $item['attr'] as $vk => $value ){
if( is_string( $value ) && ! is_numeric( $value ) && ! in_array( $value, $skip ) ){
if ( in_array( $vk, array( 'image', 'src' ) ) ) {
$seo_content .= "\n" . '