<?php
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
/**
* WPBakery WPBakery Page Builder helpers functions
*
* @package WPBakeryPageBuilder
*
*/
// Check if this file is loaded in js_composer
if ( ! defined( 'WPB_VC_VERSION' ) ) {
die( '-1' );
}
/**
* @param array $params
*
* @return array|bool
* @since 4.2
* vc_filter: vc_wpb_getimagesize - to override output of this function
*/
function wpb_getImageBySize( $params = array() ) { // phpcs:ignore
$params = array_merge( array(
'post_id' => null,
'attach_id' => null,
'thumb_size' => 'thumbnail',
'class' => '',
), $params );
if ( ! $params['thumb_size'] ) {
$params['thumb_size'] = 'thumbnail';
}
if ( ! $params['attach_id'] && ! $params['post_id'] ) {
return false;
}
$post_id = $params['post_id'];
$attach_id = $post_id ? get_post_thumbnail_id( $post_id ) : $params['attach_id'];
$attach_id = apply_filters( 'wpml_object_id', $attach_id, 'attachment', true );
$thumb_size = $params['thumb_size'];
$thumb_class = ( isset( $params['class'] ) && '' !== $params['class'] ) ? $params['class'] . ' ' : '';
global $_wp_additional_image_sizes;
$thumbnail = '';
$sizes = array(
'thumbnail',
'thumb',
'medium',
'large',
'full',
);
if ( is_string( $thumb_size ) && ( ( ! empty( $_wp_additional_image_sizes[ $thumb_size ] ) && is_array( $_wp_additional_image_sizes[ $thumb_size ] ) ) || in_array( $thumb_size, $sizes, true ) ) ) {
$attachment = get_post( $attach_id );
$title = trim( wp_strip_all_tags( $attachment->post_title ) );
$attributes = array(
'class' => $thumb_class . 'attachment-' . $thumb_size,
'title' => $title,
'alt' => trim( esc_attr( do_shortcode( get_post_meta( $attach_id, '_wp_attachment_image_alt', true ) ) ) ),
);
$thumbnail = wp_get_attachment_image( $attach_id, $thumb_size, false, $attributes );
} elseif ( $attach_id ) {
if ( is_string( $thumb_size ) ) {
preg_match_all( '/\d+/', $thumb_size, $thumb_matches );
if ( isset( $thumb_matches[0] ) ) {
$thumb_size = array();
$count = count( $thumb_matches[0] );
if ( $count > 1 ) {
$thumb_size[] = $thumb_matches[0][0]; // width
$thumb_size[] = $thumb_matches[0][1]; // height
} elseif ( 1 === $count ) {
$thumb_size[] = $thumb_matches[0][0]; // width
$thumb_size[] = $thumb_matches[0][0]; // height
} else {
$thumb_size = false;
}
}
}
if ( is_array( $thumb_size ) ) {
// Resize image to custom size
$p_img = wpb_resize( $attach_id, null, $thumb_size[0], $thumb_size[1], true );
$alt = trim( esc_attr( do_shortcode( get_post_meta( $attach_id, '_wp_attachment_image_alt', true ) ) ) );
$attachment = get_post( $attach_id );
if ( ! empty( $attachment ) ) {
$title = trim( wp_strip_all_tags( $attachment->post_title ) );
if ( empty( $alt ) ) {
$alt = trim( wp_strip_all_tags( $attachment->post_excerpt ) ); // If not, Use the Caption
}
if ( empty( $alt ) ) {
$alt = $title;
}
if ( $p_img ) {
$attributes = array(
'class' => $thumb_class,
'src' => $p_img['url'],
'width' => $p_img['width'],
'height' => $p_img['height'],
'alt' => $alt,
'title' => $title,
);
$attributes = vc_stringify_attributes( vc_add_lazy_loading_attribute( $attributes ) );
$thumbnail = '<img ' . $attributes . ' />';
}
}
}
}
$p_img_large = wp_get_attachment_image_src( $attach_id, 'large' );
return apply_filters( 'vc_wpb_getimagesize', array(
'thumbnail' => $thumbnail,
'p_img_large' => $p_img_large,
), $attach_id, $params );
}
/**
* Get image data by source where image obtained from.
*
* @since 7.4
* @param string $source
* @param int $post_id
* @param int $image_id
* @param string $img_size
* @return array
*/
function wpb_get_image_data_by_source( $source, $post_id, $image_id, $img_size ) {
$image_src = '';
switch ( $source ) {
case 'media_library':
case 'featured_image':
if ( 'featured_image' === $source ) {
if ( $post_id && has_post_thumbnail( $post_id ) ) {
$img_id = get_post_thumbnail_id( $post_id );
} else {
$img_id = 0;
}
} else {
$img_id = preg_replace( '/[^\d]/', '', $image_id );
}
if ( ! $img_size ) {
$img_size = 'thumbnail';
}
if ( $img_id ) {
$image_src = wp_get_attachment_image_src( $img_id, $img_size );
if ( $image_src ) {
$image_src = $image_src[0];
}
}
$alt_text = get_post_meta( $img_id, '_wp_attachment_image_alt', true );
break;
case 'external_link':
if ( ! empty( $params['custom_src'] ) ) {
$image_src = $params['custom_src'];
}
$alt_text = '';
break;
}
return [
'image_src' => $image_src,
'image_alt' => $alt_text,
];
}
/**
* Add `loading` attribute with param lazy to attribute list.
*
* @param array $attributes
* @return array
* @since 7.1
*/
function vc_add_lazy_loading_attribute( $attributes ) {
if ( ! is_array( $attributes ) ) {
$attributes = [];
}
$attributes['loading'] = 'lazy';
return $attributes;
}
/**
* @param $id
* @param $size
* @return array|false|mixed|string
*/
function vc_get_image_by_size( $id, $size ) {
global $_wp_additional_image_sizes;
$sizes = array(
'thumbnail',
'thumb',
'medium',
'large',
'full',
);
if ( is_string( $size ) && ( ( ! empty( $_wp_additional_image_sizes[ $size ] ) && is_array( $_wp_additional_image_sizes[ $size ] ) ) || in_array( $size, $sizes, true ) ) ) {
return wp_get_attachment_image_src( $id, $size );
} else {
if ( is_string( $size ) ) {
preg_match_all( '/\d+/', $size, $thumb_matches );
if ( isset( $thumb_matches[0] ) ) {
$size = array();
$count = count( $thumb_matches[0] );
if ( $count > 1 ) {
$size[] = $thumb_matches[0][0]; // width
$size[] = $thumb_matches[0][1]; // height
} elseif ( 1 === $count ) {
$size[] = $thumb_matches[0][0]; // width
$size[] = $thumb_matches[0][0]; // height
} else {
$size = false;
}
}
}
if ( is_array( $size ) ) {
// Resize image to custom size
$p_img = wpb_resize( $id, null, $size[0], $size[1], true );
return $p_img['url'];
}
}
return '';
}
/**
* Convert vc_col-sm-3 to 1/4
* @param $width
*
* @return string
* @since 4.2
*/
function wpb_translateColumnWidthToFractional( $width ) { // phpcs:ignore
switch ( $width ) {
case 'vc_col-sm-2':
$w = '1/6';
break;
case 'vc_col-sm-3':
$w = '1/4';
break;
case 'vc_col-sm-4':
$w = '1/3';
break;
case 'vc_col-sm-6':
$w = '1/2';
break;
case 'vc_col-sm-8':
$w = '2/3';
break;
case 'vc_col-sm-9':
$w = '3/4';
break;
case 'vc_col-sm-12':
$w = '1/1';
break;
default:
$w = is_string( $width ) ? $width : '1/1';
}
return $w;
}
/**
* @param $width
*
* @return bool|string
* @since 4.2
*/
function wpb_translateColumnWidthToSpan( $width ) { // phpcs:ignore
$output = $width;
preg_match( '/(\d+)\/(\d+)/', $width, $matches );
if ( ! empty( $matches ) ) {
$part_x = (int) $matches[1];
$part_y = (int) $matches[2];
if ( $part_x > 0 && $part_y > 0 ) {
$value = ceil( $part_x / $part_y * 12 );
if ( $value > 0 && $value <= 12 ) {
$output = 'vc_col-sm-' . $value;
}
}
}
if ( preg_match( '/\d+\/5$/', $width ) ) {
$output = 'vc_col-sm-' . $width;
}
return apply_filters( 'vc_translate_column_width_class', $output, $width );
}
/**
* @param $content
* @param bool $autop
*
* @return string
* @since 4.2
*/
function wpb_js_remove_wpautop( $content, $autop = false ) {
if ( $autop ) {
$content = wpautop( preg_replace( '/<\/?p\>/', "\n", $content ) . "\n" );
}
return do_shortcode( shortcode_unautop( $content ) );
}
if ( ! function_exists( 'shortcode_exists' ) ) {
/**
* Check if a shortcode is registered in WordPress.
*
* Examples: shortcode_exists( 'caption' ) - will return true.
* shortcode_exists( 'blah' ) - will return false.
*
* @param bool $shortcode
*
* @return bool
* @since 4.2
*/
function shortcode_exists( $shortcode = false ) {
global $shortcode_tags;
if ( ! $shortcode ) {
return false;
}
if ( array_key_exists( $shortcode, $shortcode_tags ) ) {
return true;
}
return false;
}
}
if ( ! function_exists( 'vc_siteAttachedImages' ) ) {
/**
* Helper function which returns list of site attached images, and if image is attached to the current post it adds class 'added'
* @param array $att_ids
*
* @return string
* @since 4.11
*/
function vc_siteAttachedImages( $att_ids = array() ) { // phpcs:ignore
$output = '';
$limit = (int) apply_filters( 'vc_site_attached_images_query_limit', - 1 );
$media_images = get_posts( 'post_type=attachment&orderby=ID&numberposts=' . $limit );
foreach ( $media_images as $image_post ) {
$thumb_src = wp_get_attachment_image_src( $image_post->ID, 'thumbnail' );
$thumb_src = $thumb_src[0];
$class = ( in_array( $image_post->ID, $att_ids, true ) ) ? ' class="added"' : '';
$output .= '<li' . $class . '>
<img rel="' . esc_attr( $image_post->ID ) . '" src="' . esc_url( $thumb_src ) . '" />
<span class="img-added">' . esc_html__( 'Added', 'js_composer' ) . '</span>
</li>';
}
if ( '' !== $output ) {
$output = '<ul class="gallery_widget_img_select">' . $output . '</ul>';
}
return $output;
}
}
/**
* @param array $images IDs or srcs of images
*
* @return string
* @since 5.8
*/
function vc_field_attached_images( $images = array() ) {
$output = '';
foreach ( $images as $image ) {
if ( is_numeric( $image ) ) {
$thumb_src = wp_get_attachment_image_src( $image, 'thumbnail' );
$thumb_src = isset( $thumb_src[0] ) ? $thumb_src[0] : '';
} else {
$thumb_src = $image;
}
if ( $thumb_src ) {
$output .= '
<li class="added">
<img rel="' . esc_attr( $image ) . '" src="' . esc_url( $thumb_src ) . '" />
<a href="javascript:;" class="vc_icon-remove"><i class="vc-composer-icon vc-c-icon-close"></i></a>
</li>';
}
}
return $output;
}
/**
* @param $param_value
*
* @return array
* @since 4.2
*/
function wpb_removeNotExistingImgIDs( $param_value ) { // phpcs:ignore
$tmp = explode( ',', $param_value );
$return_ar = array();
foreach ( $tmp as $id ) {
if ( wp_get_attachment_image( $id ) ) {
$return_ar[] = $id;
}
}
$tmp = implode( ',', $return_ar );
return $tmp;
}
/*
* Resize images dynamically using wp built in functions
* Victor Teixeira
*/
if ( ! function_exists( 'wpb_resize' ) ) {
/**
* @param int $attach_id
* @param string $img_url
* @param int $width
* @param int $height
* @param bool $crop
*
* @return array
* @since 4.2
*/
function wpb_resize( $attach_id, $img_url, $width, $height, $crop = false ) {
// this is an attachment, so we have the ID
$image_src = array();
if ( $attach_id ) {
$image_src = wp_get_attachment_image_src( $attach_id, 'full' );
$actual_file_path = get_attached_file( $attach_id );
// this is not an attachment, let's use the image url
} elseif ( $img_url ) {
$file_path = wp_parse_url( $img_url );
$actual_file_path = rtrim( ABSPATH, '/' ) . $file_path['path'];
$orig_size = getimagesize( $actual_file_path );
$image_src[0] = $img_url;
$image_src[1] = $orig_size[0];
$image_src[2] = $orig_size[1];
}
if ( ! empty( $actual_file_path ) ) {
$file_info = pathinfo( $actual_file_path );
$extension = '.' . $file_info['extension'];
// the image path without the extension
$no_ext_path = $file_info['dirname'] . '/' . $file_info['filename'];
$cropped_img_path = $no_ext_path . '-' . $width . 'x' . $height . $extension;
// checking if the file size is larger than the target size
// if it is smaller or the same size, stop right here and return
if ( $image_src[1] > $width || $image_src[2] > $height ) {
// the file is larger, check if the resized version already exists (for $crop = true but will also work for $crop = false if the sizes match)
if ( file_exists( $cropped_img_path ) ) {
$cropped_img_url = str_replace( basename( $image_src[0] ), basename( $cropped_img_path ), $image_src[0] );
$vt_image = array(
'url' => $cropped_img_url,
'width' => $width,
'height' => $height,
);
return $vt_image;
}
if ( ! $crop ) {
// calculate the size proportionaly
$proportional_size = wp_constrain_dimensions( $image_src[1], $image_src[2], $width, $height );
$resized_img_path = $no_ext_path . '-' . $proportional_size[0] . 'x' . $proportional_size[1] . $extension;
// checking if the file already exists
if ( file_exists( $resized_img_path ) ) {
$resized_img_url = str_replace( basename( $image_src[0] ), basename( $resized_img_path ), $image_src[0] );
$vt_image = array(
'url' => $resized_img_url,
'width' => $proportional_size[0],
'height' => $proportional_size[1],
);
return $vt_image;
}
}
// no cache files - let's finally resize it
$img_editor = wp_get_image_editor( $actual_file_path );
if ( is_wp_error( $img_editor ) || is_wp_error( $img_editor->resize( $width, $height, $crop ) ) ) {
return array(
'url' => '',
'width' => '',
'height' => '',
);
}
$new_img_path = $img_editor->generate_filename();
if ( is_wp_error( $img_editor->save( $new_img_path ) ) ) {
return array(
'url' => '',
'width' => '',
'height' => '',
);
}
if ( ! is_string( $new_img_path ) ) {
return array(
'url' => '',
'width' => '',
'height' => '',
);
}
$new_img_size = getimagesize( $new_img_path );
$new_img = str_replace( basename( $image_src[0] ), basename( $new_img_path ), $image_src[0] );
// resized output
$vt_image = array(
'url' => $new_img,
'width' => $new_img_size[0],
'height' => $new_img_size[1],
);
return $vt_image;
}
// default output - without resizing
$vt_image = array(
'url' => $image_src[0],
'width' => $image_src[1],
'height' => $image_src[2],
);
return $vt_image;
}
return false;
}
}
/**
* Method adds css class to body tag.
*
* Hooked class method by body_class WP filter. Method adds custom css class to body tag of the page to help
* identify and build design specially for VC shortcodes.
* Used in wp-content/plugins/js_composer/include/classes/core/class-vc-base.php\Vc_Base\bodyClass
*
* @param $classes
*
* @return array
* @since 4.2
*/
function js_composer_body_class( $classes ) {
$classes[] = 'wpb-js-composer js-comp-ver-' . WPB_VC_VERSION;
$disable_responsive = vc_settings()->get( 'not_responsive_css' );
if ( '1' !== $disable_responsive ) {
$classes[] = 'vc_responsive';
} else {
$classes[] = 'vc_non_responsive';
}
return $classes;
}
/**
* @param $m
*
* @return string
* @since 4.2
*/
function vc_convert_shortcode( $m ) {
list( $output, $m_one, $tag, $attr_string, $m_four, $content ) = $m;
if ( 'vc_row' === $tag || 'vc_section' === $tag ) {
return $output;
}
$result = '';
$el_position = '';
$width = '1/1';
$shortcode_attr = shortcode_parse_atts( $attr_string );
extract( shortcode_atts( array(
'width' => '1/1',
'el_class' => '',
'el_position' => '',
), $shortcode_attr ) );
// Start
if ( preg_match( '/first/', $el_position ) || empty( $shortcode_attr['width'] ) || '1/1' === $shortcode_attr['width'] ) {
$result = '[vc_row]';
}
if ( 'vc_column' !== $tag ) {
$result .= '[vc_column width="' . $width . '"]';
}
// Tag
$pattern = get_shortcode_regex();
if ( 'vc_column' === $tag ) {
$result .= "[{$m_one}{$tag} {$attr_string}]" . preg_replace_callback( "/{$pattern}/s", 'vc_convert_inner_shortcode', $content ) . "[/{$tag}{$m_four}]";
} elseif ( 'vc_tabs' === $tag || 'vc_accordion' === $tag || 'vc_tour' === $tag ) {
$result .= "[{$m_one}{$tag} {$attr_string}]" . preg_replace_callback( "/{$pattern}/s", 'vc_convert_tab_inner_shortcode', $content ) . "[/{$tag}{$m_four}]";
} else {
$result .= preg_replace( '/(\"\d\/\d\")/', '"1/1"', $output );
}
// End
if ( 'vc_column' !== $tag ) {
$result .= '[/vc_column]';
}
if ( preg_match( '/last/', $el_position ) || empty( $shortcode_attr['width'] ) || '1/1' === $shortcode_attr['width'] ) {
$result .= '[/vc_row]' . "\n";
}
return trim( $result );
}
/**
* @param $m
*
* @return string
* @since 4.2
*/
function vc_convert_tab_inner_shortcode( $m ) {
list( $output, $m_one, $tag, $attr_string, $m_four, $content ) = $m;
$result = '';
extract( shortcode_atts( array(
'width' => '1/1',
'el_class' => '',
'el_position' => '',
), shortcode_parse_atts( $attr_string ) ) );
$pattern = get_shortcode_regex();
$result .= "[{$m_one}{$tag} {$attr_string}]" . preg_replace_callback( "/{$pattern}/s", 'vc_convert_inner_shortcode', $content ) . "[/{$tag}{$m_four}]";
return $result;
}
/**
* @param $m
*
* @return string
* @since 4.2
*/
function vc_convert_inner_shortcode( $m ) {
list( $output, $m_one, $tag, $attr_string, $m_four, $content ) = $m;
$result = '';
$width = '';
$el_position = '';
extract( shortcode_atts( array(
'width' => '1/1',
'el_class' => '',
'el_position' => '',
), shortcode_parse_atts( $attr_string ) ) );
if ( '1/1' !== $width ) {
if ( preg_match( '/first/', $el_position ) ) {
$result .= '[vc_row_inner]';
}
$result .= "\n" . '[vc_column_inner width="' . esc_attr( $width ) . '" el_position="' . esc_attr( $el_position ) . '"]';
$attr = '';
foreach ( shortcode_parse_atts( $attr_string ) as $key => $value ) {
if ( 'width' === $key ) {
$value = '1/1';
} elseif ( 'el_position' === $key ) {
$value = 'first last';
}
$attr .= ' ' . $key . '="' . $value . '"';
}
$result .= "[{$m_one}{$tag} {$attr}]" . $content . "[/{$tag}{$m_four}]";
$result .= '[/vc_column_inner]';
if ( preg_match( '/last/', $el_position ) ) {
$result .= '[/vc_row_inner]' . "\n";
}
} else {
$result = $output;
}
return $result;
}
global $vc_row_layouts;
$vc_row_layouts = array(
array(
'cells' => '11',
'mask' => '12',
'title' => '1/1',
'icon_class' => '1-1',
),
array(
'cells' => '12_12',
'mask' => '26',
'title' => '1/2 + 1/2',
'icon_class' => '1-2_1-2',
),
array(
'cells' => '23_13',
'mask' => '29',
'title' => '2/3 + 1/3',
'icon_class' => '2-3_1-3',
),
array(
'cells' => '13_13_13',
'mask' => '312',
'title' => '1/3 + 1/3 + 1/3',
'icon_class' => '1-3_1-3_1-3',
),
array(
'cells' => '14_14_14_14',
'mask' => '420',
'title' => '1/4 + 1/4 + 1/4 + 1/4',
'icon_class' => '1-4_1-4_1-4_1-4',
),
array(
'cells' => '14_34',
'mask' => '212',
'title' => '1/4 + 3/4',
'icon_class' => '1-4_3-4',
),
array(
'cells' => '14_12_14',
'mask' => '313',
'title' => '1/4 + 1/2 + 1/4',
'icon_class' => '1-4_1-2_1-4',
),
array(
'cells' => '56_16',
'mask' => '218',
'title' => '5/6 + 1/6',
'icon_class' => '5-6_1-6',
),
array(
'cells' => '16_16_16_16_16_16',
'mask' => '642',
'title' => '1/6 + 1/6 + 1/6 + 1/6 + 1/6 + 1/6',
'icon_class' => '1-6_1-6_1-6_1-6_1-6_1-6',
),
array(
'cells' => '16_23_16',
'mask' => '319',
'title' => '1/6 + 4/6 + 1/6',
'icon_class' => '1-6_2-3_1-6',
),
array(
'cells' => '16_16_16_12',
'mask' => '424',
'title' => '1/6 + 1/6 + 1/6 + 1/2',
'icon_class' => '1-6_1-6_1-6_1-2',
),
array(
'cells' => '15_15_15_15_15',
'mask' => '530',
'title' => '1/5 + 1/5 + 1/5 + 1/5 + 1/5',
'icon_class' => 'l_15_15_15_15_15',
),
);
/**
* @param $width
*
* @return string
* @since 4.2
*/
function wpb_vc_get_column_width_indent( $width ) {
$identy = '11';
if ( 'vc_col-sm-6' === $width ) {
$identy = '12';
} elseif ( 'vc_col-sm-3' === $width ) {
$identy = '14';
} elseif ( 'vc_col-sm-4' === $width ) {
$identy = '13';
} elseif ( 'vc_col-sm-8' === $width ) {
$identy = '23';
} elseif ( 'vc_col-sm-9' === $width ) {
$identy = '34';
} elseif ( 'vc_col-sm-2' === $width ) {
$identy = '16'; // TODO: check why there is no "vc_col-sm-1, -5, -6, -7, -11, -12.
} elseif ( 'vc_col-sm-10' === $width ) {
$identy = '56';
}
return $identy;
}
/**
* Make any HEX color lighter or darker
* @param $colour
* @param $per
*
* @return string
* @since 4.2
*/
function vc_colorCreator( $colour, $per = 10 ) { // phpcs:ignore
require_once 'class-vc-color-helper.php';
$color = $colour;
if ( stripos( $colour, 'rgba(' ) !== false ) {
$rgb = str_replace( array(
'rgba',
'rgb',
'(',
')',
), '', $colour );
$rgb = explode( ',', $rgb );
$rgb_array = array(
'R' => $rgb[0],
'G' => $rgb[1],
'B' => $rgb[2],
);
$alpha = $rgb[3];
try {
$color = Vc_Color_Helper::rgbToHex( $rgb_array );
$color_obj = new Vc_Color_Helper( $color );
if ( $per >= 0 ) {
$color = $color_obj->lighten( $per );
} else {
$color = $color_obj->darken( abs( $per ) );
}
$rgba = $color_obj->hexToRgb( $color );
$rgba[] = $alpha;
$css_rgba_color = 'rgba(' . implode( ', ', $rgba ) . ')';
return $css_rgba_color;
} catch ( Exception $e ) {
// In case of error return same as given
return $colour;
}
} elseif ( stripos( $colour, 'rgb(' ) !== false ) {
$rgb = str_replace( array(
'rgba',
'rgb',
'(',
')',
), '', $colour );
$rgb = explode( ',', $rgb );
$rgb_array = array(
'R' => $rgb[0],
'G' => $rgb[1],
'B' => $rgb[2],
);
try {
$color = Vc_Color_Helper::rgbToHex( $rgb_array );
} catch ( Exception $e ) {
// In case of error return same as given
return $colour;
}
}
try {
$color_obj = new Vc_Color_Helper( $color );
if ( $per >= 0 ) {
$color = $color_obj->lighten( $per );
} else {
$color = $color_obj->darken( abs( $per ) );
}
return '#' . $color;
} catch ( Exception $e ) {
return $colour;
}
}
/**
* HEX to RGB converter
* @param $color
*
* @return array|bool
* @since 4.2
*/
function vc_hex2rgb( $color ) {
$color = str_replace( '#', '', $color );
if ( strlen( $color ) === 6 ) {
list( $r, $g, $b ) = array(
$color[0] . $color[1],
$color[2] . $color[3],
$color[4] . $color[5],
);
} elseif ( strlen( $color ) === 3 ) {
list( $r, $g, $b ) = array(
$color[0] . $color[0],
$color[1] . $color[1],
$color[2] . $color[2],
);
} else {
return false;
}
$r = hexdec( $r );
$g = hexdec( $g );
$b = hexdec( $b );
return array(
$r,
$g,
$b,
);
}
/**
* Parse string like "title:Hello world|weekday:Monday" to array('title' => 'Hello World', 'weekday' => 'Monday')
*
* @param $value
* @param array $default
*
* @return array
* @since 4.2
*/
function vc_parse_multi_attribute( $value, $default = [] ) {
$result = $default;
$params_pairs = is_string( $value ) ? explode( '|', $value ) : [];
if ( ! empty( $params_pairs ) ) {
foreach ( $params_pairs as $pair ) {
$param = preg_split( '/\:/', $pair );
if ( ! empty( $param[0] ) && isset( $param[1] ) ) {
$result[ $param[0] ] = trim( rawurldecode( $param[1] ) );
}
}
}
return $result;
}
/**
* @param $v
*
* @return string
* @since 4.2
*/
function vc_param_options_parse_values( $v ) {
return rawurldecode( $v );
}
/**
* @param $name
* @param $settings
*
* @return bool
* @since 4.2
*/
function vc_param_options_get_settings( $name, $settings ) {
if ( is_array( $settings ) ) {
foreach ( $settings as $params ) {
if ( isset( $params['name'] ) && $params['name'] === $name && isset( $params['type'] ) ) {
return $params;
}
}
}
return false;
}
/**
* @param $atts
*
* @return string
* @since 4.2
*/
function vc_convert_atts_to_string( $atts ) {
$output = '';
foreach ( $atts as $key => $value ) {
$output .= ' ' . $key . '="' . $value . '"';
}
return $output;
}
/**
* @param $string
* @param $tag
* @param $param
*
* @return array
* @throws \Exception
* @since 4.2
*/
function vc_parse_options_string( $string, $tag, $param ) {
$options = array();
$option_settings_list = array();
$settings = WPBMap::getParam( $tag, $param );
foreach ( preg_split( '/\|/', $string ) as $value ) {
if ( preg_match( '/\:/', $value ) ) {
$split = preg_split( '/\:/', $value );
$option_name = $split[0];
$option_settings = vc_param_options_get_settings( $option_name, $settings['options'] );
$option_settings_list[ $option_name ] = $option_settings;
if ( isset( $option_settings['type'] ) && 'checkbox' === $option_settings['type'] ) {
$option_value = array_map( 'vc_param_options_parse_values', preg_split( '/\,/', $split[1] ) );
} else {
$option_value = rawurldecode( $split[1] );
}
$options[ $option_name ] = $option_value;
}
}
if ( isset( $settings['options'] ) ) {
foreach ( $settings['options'] as $setting_option ) {
if ( 'separator' !== $setting_option['type'] && isset( $setting_option['value'] ) && empty( $options[ $setting_option['name'] ] ) ) {
$options[ $setting_option['name'] ] = 'checkbox' === $setting_option['type'] ? preg_split( '/\,/', $setting_option['value'] ) : $setting_option['value'];
}
if ( isset( $setting_option['name'] ) && isset( $options[ $setting_option['name'] ] ) && isset( $setting_option['value_type'] ) ) {
if ( 'integer' === $setting_option['value_type'] ) {
$options[ $setting_option['name'] ] = (int) $options[ $setting_option['name'] ];
} elseif ( 'float' === $setting_option['value_type'] ) {
$options[ $setting_option['name'] ] = (float) $options[ $setting_option['name'] ];
} elseif ( 'boolean' === $setting_option['value_type'] ) {
$options[ $setting_option['name'] ] = (bool) $options[ $setting_option['name'] ];
}
}
}
}
return $options;
}
/**
* Convert string to a valid css class name.
*
* @param string $class
*
* @return string
* @since 4.3
*
*/
function vc_build_safe_css_class( $class ) {
return preg_replace( '/\W+/', '', strtolower( str_replace( ' ', '_', wp_strip_all_tags( $class ) ) ) );
}
/**
* Include template from templates dir.
*
* @param $template
* @param array $variables - passed variables to the template.
*
* @param bool $once
*
* @return mixed
* @since 4.3
*
*/
function vc_include_template( $template, $variables = array(), $once = false ) {
is_array( $variables ) && extract( $variables );
if ( $once ) {
return require_once vc_template( $template );
} else {
return require vc_template( $template );
}
}
/**
* Output template from templates dir.
*
* @param $template
* @param array $variables - passed variables to the template.
*
* @param bool $once
*
* @return string
* @since 4.4
*
*/
function vc_get_template( $template, $variables = array(), $once = false ) {
ob_start();
$output = vc_include_template( $template, $variables, $once );
if ( 1 === $output ) {
$output = ob_get_contents();
}
ob_end_clean();
return $output;
}
/**
* if php version < 5.3 this function is required.
*/
if ( ! function_exists( 'lcfirst' ) ) {
/**
* @param $str
*
* @return mixed
* @since 4.3, fix #1093
*/
function lcfirst( $str ) {
$str[0] = function_exists( 'mb_strtolower' ) ? mb_strtolower( $str[0] ) : strtolower( $str[0] );
return $str;
}
}
/**
* VC Convert a value to studly caps case.
*
* @param string $value
*
* @return string
* @since 4.3
*
*/
function vc_studly( $value ) {
$value = ucwords( str_replace( array(
'-',
'_',
), ' ', $value ) );
return str_replace( ' ', '', $value );
}
/**
* VC Convert a value to camel case.
*
* @param string $value
*
* @return string
* @since 4.3
*
*/
function vc_camel_case( $value ) {
return lcfirst( vc_studly( $value ) );
}
/**
* Enqueue icon element font
* @param $font
* @since 4.4
*
* @todo move to separate folder
*/
function vc_icon_element_fonts_enqueue( $font ) {
switch ( $font ) {
case 'fontawesome':
wp_enqueue_style( 'vc_font_awesome_5' );
break;
case 'openiconic':
wp_enqueue_style( 'vc_openiconic' );
break;
case 'typicons':
wp_enqueue_style( 'vc_typicons' );
break;
case 'entypo':
wp_enqueue_style( 'vc_entypo' );
break;
case 'linecons':
wp_enqueue_style( 'vc_linecons' );
break;
case 'monosocial':
wp_enqueue_style( 'vc_monosocialiconsfont' );
break;
case 'material':
wp_enqueue_style( 'vc_material' );
break;
default:
do_action( 'vc_enqueue_font_icon_element', $font ); // hook to custom do enqueue style
}
}
/**
* Function merges defaults attributes in attributes by keeping it values
*
* Example
* array defaults | array attributes | result array
* 'color'=>'black', - 'color'=>'black',
* 'target'=>'_self', 'target'=>'_blank', 'target'=>'_blank',
* - 'link'=>'google.com' 'link'=>'google.com'
*
* @param array $defaults
* @param array $attributes
*
* @return array - merged attributes
*
* @since 4.4
*
* @see vc_map_get_attributes
*/
function vc_shortcode_attribute_parse( $defaults = array(), $attributes = array() ) {
$atts = $attributes + shortcode_atts( $defaults, $attributes );
return $atts;
}
/**
* @param string $tagregexp
* @return string
*/
function vc_get_shortcode_regex( $tagregexp = '' ) {
if ( 0 === strlen( $tagregexp ) ) {
return get_shortcode_regex();
}
return '\\[' // Opening bracket
. '(\\[?)' // 1: Optional second opening bracket for escaping shortcodes: [[tag]]
. "($tagregexp)" // 2: Shortcode name
. '(?![\\w\-])' // Not followed by word character or hyphen
. '(' // 3: Unroll the loop: Inside the opening shortcode tag
. '[^\\]\\/]*' // Not a closing bracket or forward slash
. '(?:' . '\\/(?!\\])' // A forward slash not followed by a closing bracket
. '[^\\]\\/]*' // Not a closing bracket or forward slash
. ')*?' . ')' . '(?:' . '(\\/)' // 4: Self closing tag ...
. '\\]' // ... and closing bracket
. '|' . '\\]' // Closing bracket
. '(?:' . '(' // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags
. '[^\\[]*+' // Not an opening bracket
. '(?:' . '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag
. '[^\\[]*+' // Not an opening bracket
. ')*+' . ')' . '\\[\\/\\2\\]' // Closing shortcode tag
. ')?' . ')' . '(\\]?)';
}
/**
* Used to send warning message
*
* @param $message
*
* @return string
* @since 4.5
*
*/
function vc_message_warning( $message ) {
return '<div class="wpb_element_wrapper"><div class="vc_message_box vc_message_box-standard vc_message_box-rounded vc_color-warning">
<div class="vc_message_box-icon"><i class="fa fa-exclamation-triangle"></i>
</div><p class="messagebox_text">' . $message . '</p>
</div></div>';
}
/**
* Extract video ID from youtube url
*
* @param string $url Youtube url
*
* @return string
*/
function vc_extract_youtube_id( $url ) {
parse_str( wp_parse_url( $url, PHP_URL_QUERY ), $vars );
if ( ! isset( $vars['v'] ) ) {
return '';
}
return $vars['v'];
}
/**
* @return string[]|\WP_Taxonomy[]
*/
function vc_taxonomies_types( $post_type = null ) {
global $vc_taxonomies_types;
if ( is_null( $vc_taxonomies_types ) || $post_type ) {
$query = array( 'public' => true );
$vc_taxonomies_types = get_taxonomies( $query, 'objects' );
if ( ! empty( $post_type ) && is_array( $vc_taxonomies_types ) ) {
foreach ( $vc_taxonomies_types as $key => $taxonomy ) {
$arr = (array) $taxonomy;
if ( isset( $arr['object_type'] ) && ! in_array( $post_type, $arr['object_type'] ) ) {
unset( $vc_taxonomies_types[ $key ] );
}
}
}
}
return $vc_taxonomies_types;
}
/**
* Since
*
* @param $term
*
* @return array
* @since 4.5.3
*
*/
function vc_get_term_object( $term ) {
$vc_taxonomies_types = vc_taxonomies_types();
return array(
'label' => $term->name,
'value' => $term->term_id,
'group_id' => $term->taxonomy,
'group' => isset( $vc_taxonomies_types[ $term->taxonomy ], $vc_taxonomies_types[ $term->taxonomy ]->labels, $vc_taxonomies_types[ $term->taxonomy ]->labels->name ) ? $vc_taxonomies_types[ $term->taxonomy ]->labels->name : esc_html__( 'Taxonomies', 'js_composer' ),
);
}
/**
* Check if element has specific class
*
* E.g. f('foo', 'foo bar baz') -> true
*
* @param string $class Class to check for
* @param string $classes Classes separated by space(s)
*
* @return bool
*/
function vc_has_class( $class, $classes ) {
return in_array( $class, explode( ' ', strtolower( $classes ), true ), true );
}
/**
* Remove specific class from classes string
*
* E.g. f('foo', 'foo bar baz') -> 'bar baz'
*
* @param string $class Class to remove
* @param string $classes Classes separated by space(s)
*
* @return string
*/
function vc_remove_class( $class, $classes ) {
$list_classes = explode( ' ', strtolower( $classes ) );
$key = array_search( $class, $list_classes, true );
if ( false === $key ) {
return $classes;
}
unset( $list_classes[ $key ] );
return implode( ' ', $list_classes );
}
/**
* Convert array of named params to string version
* All values will be escaped
*
* E.g. f(array('name' => 'foo', 'id' => 'bar')) -> 'name="foo" id="bar"'
*
* @param $attributes
*
* @return string
*/
function vc_stringify_attributes( $attributes ) {
$atts = array();
foreach ( $attributes as $name => $value ) {
$atts[] = $name . '="' . esc_attr( $value ) . '"';
}
return implode( ' ', $atts );
}
/**
* @return bool
*/
function vc_is_responsive_disabled() {
$disable_responsive = vc_settings()->get( 'not_responsive_css' );
return '1' === $disable_responsive;
}
/**
* Do shortcode single render point
*
* @param $atts
* @param null $content
* @param null $tag
*
* @return string
* @throws \Exception
*/
function vc_do_shortcode( $atts, $content = null, $tag = null ) {
ob_start();
echo Vc_Shortcodes_Manager::getInstance()->getElementClass( $tag )->output( $atts, $content );
$content = ob_get_clean();
// @codingStandardsIgnoreStart
global $wp_embed;
if ( is_object( $wp_embed ) ) {
$content = $wp_embed->run_shortcode( $content );
$content = $wp_embed->autoembed( $content );
// @codingStandardsIgnoreEnd
}
return $content;
}
/**
* Return random string
*
* @param int $length
*
* @return string
*/
function vc_random_string( $length = 10 ) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$len = strlen( $characters );
$str = '';
for ( $i = 0; $i < $length; $i ++ ) {
$str .= $characters[ wp_rand( 0, $len - 1 ) ];
}
return $str;
}
/**
* @param $str
* @return string|string[]|null
*/
/**
* @param $str
* @return string|string[]|null
*/
/**
* @param $str
* @return string|string[]|null
*/
/**
* @param $str
* @return string|string[]|null
*/
/**
* @param $str
* @return string|string[]|null
*/
function vc_slugify( $str ) {
$str = strtolower( $str );
$str = html_entity_decode( $str );
$str = preg_replace( '/[^\w ]+/', '', $str );
$str = preg_replace( '/ +/', '-', $str );
return $str;
}
/**
* WPBakery WPBakery Page Builder filter functions
*
* @package WPBakeryPageBuilder
*/
/**
* This filter should be applied to all content elements titles
*
* $params['extraclass'] Extra class name will be added
*
*
* To override content element title default html markup, paste this code in your theme's functions.php file
* vc_filter: wpb_widget_title
* add_filter('wpb_widget_title', 'override_widget_title', 10, 2);
* function override_widget_title($output = '', $params = array('')) {
* $extraclass = (isset($params['extraclass'])) ? " ".$params['extraclass'] : "";
* return '<h1 class="entry-title'.$extraclass.'">'.$params['title'].'</h1>';
* }
*
* @param array $params
*
* @return mixed|string
*/
function wpb_widget_title( $params = array( 'title' => '' ) ) {
if ( '' === $params['title'] ) {
return '';
}
$extraclass = ( isset( $params['extraclass'] ) ) ? ' ' . $params['extraclass'] : '';
$output = '<h2 class="wpb_heading' . esc_attr( $extraclass ) . '">' . esc_html( $params['title'] ) . '</h2>';
return apply_filters( 'wpb_widget_title', $output, $params );
}
/**
* Used to remove raw_html/raw_js elements from content
* @param $content
* @return string|string[]|null
* @since 6.3.0
*/
function wpb_remove_custom_html( $content ) {
$is_rest_request = ( defined( 'REST_REQUEST' ) && REST_REQUEST );
if ( ! empty( $content ) && ! $is_rest_request && ! vc_user_access()->part( 'unfiltered_html' )->checkStateAny( true, null )->get() ) {
// html encoded shortcodes
$regex = vc_get_shortcode_regex( implode( '|', apply_filters( 'wpb_custom_html_elements', array(
'vc_raw_html',
'vc_raw_js',
) ) ) );
// custom on click
$button_regex = vc_get_shortcode_regex( 'vc_btn' );
$content = preg_replace_callback( '/' . $button_regex . '/', 'wpb_remove_custom_onclick', $content );
$content = preg_replace( '/' . $regex . '/', '', $content );
}
return $content;
}
function wpb_remove_custom_onclick( $match ) {
if ( strpos( $match[3], 'custom_onclick' ) !== false ) {
return '';
}
return $match[0];
}
/**
* We use it only to check is current environment is wordpress.com
* @since 6.2
*
* @return bool
*/
function wpb_check_wordpress_com_env() {
return defined( 'IS_ATOMIC' ) &&
IS_ATOMIC &&
defined( 'ATOMIC_CLIENT_ID' ) &&
'2' === ATOMIC_CLIENT_ID;
}
/**
* Get name of post custom layout.
* @note it can be empty sting if post custom layout is not set
* @since 7.0
*
* @return string
*/
function wpb_get_name_post_custom_layout() {
$layout_manager = new Vc_PostCustomLayout();
return $layout_manager->getCustomLayoutName();
}
if ( ! function_exists( 'wpb_add_ai_to_text_field' ) ) {
/**
* Add AI icon to text field.
*
* @param string $type
* @param string $field_id
* @since 7.4
*/
function wpb_add_ai_icon_to_text_field( $type, $field_id ) {
if ( ! vc_user_access()->part( 'text_ai' )->can()->get() ) {
return;
}
wpb_get_ai_icon_template( $type, $field_id );
}
}
if ( ! function_exists( 'wpb_add_ai_to_code_field' ) ) {
/**
* Add AI icon to code field.
*
* @param string $type
* @param string $field_id
* @since 7.4
*/
function wpb_add_ai_icon_to_code_field( $type, $field_id ) {
if ( ! vc_user_access()->part( 'code_ai' )->can()->get() ) {
return;
}
wpb_get_ai_icon_template( $type, $field_id );
}
}
if ( ! function_exists( 'wpb_get_ai_icon_template' ) ) {
/**
* Get AI icon.
*
* @param string $type
* @param string $field_id
* @since 7.4
*
* @return mixed
*/
function wpb_get_ai_icon_template( $type, $field_id, $is_include = true ) {
$template = apply_filters( 'wpb_get_ai_icon_template', 'editors/partials/icon-ai.tpl.php', $type, $field_id );
if ( $is_include ) {
vc_include_template(
$template,
[
'type' => $type,
'field_id' => $field_id,
]
);
} else {
return vc_get_template(
$template,
[
'type' => $type,
'field_id' => $field_id,
]
);
}
}
}