' . __( 'By default content elements "stack" one on top other when screen size is smaller than 768px. Change the value to change "stacking" size.', 'js_composer' ) . '
';
}
/**
*
*/
public function compiled_js_composer_less_callback() {
$field = 'compiled_js_composer_less';
echo ''; // VALUE must be empty
}
/**
* @param $key
*
* @return string
*/
public function getDefault( $key ) {
return ! empty( self::$defaults[ $key ] ) ? self::$defaults[ $key ] : '';
}
/**
* @deprecated 4.8 Remove after 2015-12-01
*
* @return string
*/
public function disableIfActivated() {
// _deprecated_function( '\Vc_Settings::disableIfActivated', '4.8 (will be removed in 4.11)' );
if ( ! isset( $this->deactivate_license ) ) {
$this->deactivate_license = vc_license()->deactivation();
}
return empty( $this->deactivate_license ) ? '' : ' disabled="true" class="vc_updater-passive"';
}
/**
* Callback function for settings section
*
* @param $tab
*/
public function setting_section_callback_function( $tab ) {
if ( 'wpb_js_composer_settings_color' === $tab['id'] ) : ?>
vc_excluded_post_types ) ) {
$this->vc_excluded_post_types = apply_filters( 'vc_settings_exclude_post_type',
array( 'attachment', 'revision', 'nav_menu_item', 'mediapage' ) );
}
return $this->vc_excluded_post_types;
}
/**
* @return array
* @deprecated 4.8
*/
protected function getPostTypes() {
// _deprecated_function( '\Vc_Settings::getPostTypes', '4.8 (will be removed in 4.11)' );
return get_post_types( array( 'public' => true ) );
}
/**
* Sanitize functions
*
*/
// {{
/**
* Access rules for user's groups
*
* @param $rules - Array of selected rules for each user's group
*
* @deprecated 4.8
*
* @return array
*/
public function sanitize_group_access_rules_callback( $rules ) {
// _deprecated_function( '\Vc_Settings::sanitize_group_access_rules_callback', '4.8 (will be removed in 4.11)' );
$sanitize_rules = array();
$groups = get_editable_roles();
foreach ( $groups as $key => $params ) {
if ( isset( $rules[ $key ] ) ) {
$sanitize_rules[ $key ] = $rules[ $key ];
}
}
return $sanitize_rules;
}
/**
* @param $rules
*
* @return mixed
*/
public function sanitize_not_responsive_css_callback( $rules ) {
return $rules;
}
/**
* @param $value
*
* @return mixed
*/
public function sanitize_row_css_class_callback( $value ) {
// _deprecated_function( '\Vc_Settings::row_css_class_callback', '4.4' );
return $value;
}
/**
* Post types fields sanitize
*
* @param $post_types - Post types array selected by user
*
* @deprecated 4.8
* @return array
*/
public function sanitize_post_types_callback( $post_types ) {
// _deprecated_function( '\Vc_Settings::sanitize_post_types_callback', '4.8 (will be removed in 4.11)' );
$pt_array = array();
if ( isset( $post_types ) && is_array( $post_types ) ) {
foreach ( $post_types as $pt ) {
if ( ! in_array( $pt, $this->getExcluded() ) && in_array( $pt, $this->getPostTypes() ) ) {
$pt_array[] = $pt;
}
}
}
return $pt_array;
}
/**
* @param $subsets
*
* @return array
*/
public function sanitize_google_fonts_subsets_callback( $subsets ) {
$pt_array = array();
if ( isset( $subsets ) && is_array( $subsets ) ) {
foreach ( $subsets as $pt ) {
if ( ! in_array( $pt, $this->getGoogleFontsSubsetsExcluded() ) && in_array( $pt, $this->getGoogleFontsSubsets() ) ) {
$pt_array[] = $pt;
}
}
}
return $pt_array;
}
/**
* @param $rules
*
* @return mixed
*/
public function sanitize_use_custom_callback( $rules ) {
return $rules;
}
/**
* @param $css
*
* @return mixed
*/
public function sanitize_custom_css_callback( $css ) {
return strip_tags($css);
}
/**
* @param $css
*
* @return mixed
*/
public function sanitize_compiled_js_composer_less_callback( $css ) {
return $css;
}
/**
* @param $color
*
* @return mixed
*/
public function sanitize_color_callback( $color ) {
return $color;
}
/**
* @param $margin
*
* @return mixed
*/
public function sanitize_margin_callback( $margin ) {
$margin = preg_replace( '/\s/', '', $margin );
if ( ! preg_match( '/^\d+(px|%|em|pt){0,1}$/', $margin ) ) {
add_settings_error( self::$field_prefix . 'margin', 1, __( 'Invalid Margin value.', 'js_composer' ), 'error' );
}
return $margin;
}
/**
* @param $gutter
*
* @return mixed
*/
public function sanitize_gutter_callback( $gutter ) {
$gutter = preg_replace( '/[^\d]/', '', $gutter );
if ( ! $this->_isGutterValid( $gutter ) ) {
add_settings_error( self::$field_prefix . 'gutter', 1, __( 'Invalid Gutter value.', 'js_composer' ), 'error' );
}
return $gutter;
}
/**
* @param $responsive_max
*
* @return mixed
*/
public function sanitize_responsive_max_callback( $responsive_max ) {
if ( ! $this->_isNumberValid( $responsive_max ) ) {
add_settings_error( self::$field_prefix . 'responsive_max', 1, __( 'Invalid "Responsive max" value.', 'js_composer' ), 'error' );
}
return $responsive_max;
}
// }}
/**
* @param $number
*
* @return int
*/
public static function _isNumberValid( $number ) {
return preg_match( '/^[\d]+(\.\d+){0,1}$/', $number );
}
/**
* @param $gutter
*
* @return int
*/
public static function _isGutterValid( $gutter ) {
return self::_isNumberValid( $gutter );
}
/**
* @deprecated 4.4
* @return bool
*/
public static function requireNotification() {
// _deprecated_function( '\Vc_Settings::requireNotification', '4.4 (will be removed in 4.10)' );
$row_css_class = ( $value = get_option( self::$field_prefix . 'row_css_class' ) ) ? $value : '';
$column_css_classes = ( $value = get_option( self::$field_prefix . 'column_css_classes' ) ) ? $value : '';
$notification = get_option( self::$notification_name );
if ( 'false' !== $notification && ( ! empty( $row_css_class ) || strlen( implode( '', array_values( $column_css_classes ) ) ) > 0 ) ) {
update_option( self::$notification_name, 'true' );
return true;
}
return false;
}
public function useCustomCss() {
$use_custom = get_option( self::$field_prefix . 'use_custom', false );
return $use_custom;
}
public function getCustomCssVersion() {
$less_version = get_option( self::$field_prefix . 'less_version', false );
return $less_version;
}
/**
*
*/
public function rebuild() {
/** WordPress Template Administration API */
require_once( ABSPATH . 'wp-admin/includes/template.php' );
/** WordPress Administration File API */
require_once( ABSPATH . 'wp-admin/includes/file.php' );
delete_option( self::$field_prefix . 'compiled_js_composer_less' );
$this->initAdmin();
$this->buildCustomCss(); // TODO: remove this - no needs to re-save always
}
/**
*
*/
public static function buildCustomColorCss() {
/**
* Filesystem API init.
* */
$url = wp_nonce_url( 'admin.php?page=vc-color&build_css=1', 'wpb_js_settings_save_action' );
self::getFileSystem( $url );
global $wp_filesystem;
/**
*
* Building css file.
*
*/
if ( false === ( $js_composer_upload_dir = self::checkCreateUploadDir( $wp_filesystem, 'use_custom', 'js_composer_front_custom.css' ) ) ) {
return;
}
$filename = $js_composer_upload_dir . '/js_composer_front_custom.css';
$use_custom = get_option( self::$field_prefix . 'use_custom' );
if ( ! $use_custom ) {
$wp_filesystem->put_contents( $filename, '', FS_CHMOD_FILE );
return;
}
$css_string = get_option( self::$field_prefix . 'compiled_js_composer_less' );
if ( strlen( trim( $css_string ) ) > 0 ) {
update_option( self::$field_prefix . 'less_version', WPB_VC_VERSION );
delete_option( self::$field_prefix . 'compiled_js_composer_less' );
$css_string = strip_tags( $css_string );
// HERE goes the magic
if ( ! $wp_filesystem->put_contents( $filename, $css_string, FS_CHMOD_FILE ) ) {
if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) {
add_settings_error( self::$field_prefix . 'main_color', $wp_filesystem->errors->get_error_code(), __( 'Something went wrong: js_composer_front_custom.css could not be created.', 'js_composer' ) . ' ' . $wp_filesystem->errors->get_error_message(), 'error' );
} elseif ( ! $wp_filesystem->connect() ) {
add_settings_error( self::$field_prefix . 'main_color', $wp_filesystem->errors->get_error_code(), __( 'js_composer_front_custom.css could not be created. Connection error.', 'js_composer' ), 'error' );
} elseif ( ! $wp_filesystem->is_writable( $filename ) ) {
add_settings_error( self::$field_prefix . 'main_color', $wp_filesystem->errors->get_error_code(), sprintf( __( 'js_composer_front_custom.css could not be created. Cannot write custom css to "%s".', 'js_composer' ), $filename ), 'error' );
} else {
add_settings_error( self::$field_prefix . 'main_color', $wp_filesystem->errors->get_error_code(), __( 'js_composer_front_custom.css could not be created. Problem with access.', 'js_composer' ), 'error' );
}
delete_option( self::$field_prefix . 'use_custom' );
delete_option( self::$field_prefix . 'less_version' );
}
}
}
/**
* Builds custom css file using css options from vc settings.
*
* @return bool
*/
public static function buildCustomCss() {
/**
* Filesystem API init.
* */
$url = wp_nonce_url( 'admin.php?page=vc-color&build_css=1', 'wpb_js_settings_save_action' );
self::getFileSystem( $url );
global $wp_filesystem;
/**
* Building css file.
*/
if ( false === ( $js_composer_upload_dir = self::checkCreateUploadDir( $wp_filesystem, 'custom_css', 'custom.css' ) ) ) {
return true;
}
$filename = $js_composer_upload_dir . '/custom.css';
$css_string = '';
$custom_css_string = get_option( self::$field_prefix . 'custom_css' );
if ( ! empty( $custom_css_string ) ) {
$assets_url = vc_asset_url( '' );
$css_string .= preg_replace( '/(url\(\.\.\/(?!\.))/', 'url(' . $assets_url, $custom_css_string );
$css_string = strip_tags( $css_string );
}
if ( ! $wp_filesystem->put_contents( $filename, $css_string, FS_CHMOD_FILE ) ) {
if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) {
add_settings_error( self::$field_prefix . 'custom_css', $wp_filesystem->errors->get_error_code(), __( 'Something went wrong: custom.css could not be created.', 'js_composer' ) . $wp_filesystem->errors->get_error_message(), 'error' );
} elseif ( ! $wp_filesystem->connect() ) {
add_settings_error( self::$field_prefix . 'custom_css', $wp_filesystem->errors->get_error_code(), __( 'custom.css could not be created. Connection error.', 'js_composer' ), 'error' );
} elseif ( ! $wp_filesystem->is_writable( $filename ) ) {
add_settings_error( self::$field_prefix . 'custom_css', $wp_filesystem->errors->get_error_code(), __( 'custom.css could not be created. Cannot write custom css to "' . $filename . '".', 'js_composer' ), 'error' );
} else {
add_settings_error( self::$field_prefix . 'custom_css', $wp_filesystem->errors->get_error_code(), __( 'custom.css could not be created. Problem with access.', 'js_composer' ), 'error' );
}
return false;
}
return true;
}
/**
* @param $wp_filesystem
* @param $option
* @param $filename
*
* @return bool|string
*/
public static function checkCreateUploadDir( $wp_filesystem, $option, $filename ) {
$js_composer_upload_dir = self::uploadDir();
if ( ! $wp_filesystem->is_dir( $js_composer_upload_dir ) ) {
if ( ! $wp_filesystem->mkdir( $js_composer_upload_dir, 0777 ) ) {
add_settings_error( self::$field_prefix . $option, $wp_filesystem->errors->get_error_code(), __( sprintf( '%s could not be created. Not available to create js_composer directory in uploads directory (' . $js_composer_upload_dir . ').', $filename ), 'js_composer' ), 'error' );
return false;
}
}
return $js_composer_upload_dir;
}
/**
* @return string
*/
public static function uploadDir() {
$upload_dir = wp_upload_dir();
global $wp_filesystem;
return $wp_filesystem->find_folder( $upload_dir['basedir'] ) . vc_upload_dir();
}
/**
* @return string
*/
public static function uploadURL() {
$upload_dir = wp_upload_dir();
return $upload_dir['baseurl'] . vc_upload_dir();
}
/**
* @return string
*/
public static function getFieldPrefix() {
return self::$field_prefix;
}
/**
* @param string $url
*/
protected static function getFileSystem( $url = '' ) {
if ( empty( $url ) ) {
$url = wp_nonce_url( 'admin.php?page=vc-general', 'wpb_js_settings_save_action' );
}
if ( false === ( $creds = request_filesystem_credentials( $url, '', false, false, null ) ) ) {
_e( 'This is required to enable file writing for js_composer', 'js_composer' );
exit(); // stop processing here
}
$upload_dir = wp_upload_dir();
if ( ! WP_Filesystem( $creds, $upload_dir['basedir'] ) ) {
request_filesystem_credentials( $url, '', true, false, null );
_e( 'This is required to enable file writing for js_composer', 'js_composer' );
exit();
}
}
/**
* @return string
*/
public function getOptionGroup() {
return $this->option_group;
}
}
/**
* Backward capability for third-party-plugins
*/
class WPBakeryVisualComposerSettings extends Vc_Settings {
}