99 lines
2.8 KiB
PHP
99 lines
2.8 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Class WPML_Compatibility_Plugin_Visual_Composer
|
|
*
|
|
* @author OnTheGoSystems
|
|
*/
|
|
class WPML_Compatibility_Plugin_Visual_Composer {
|
|
|
|
/** @var WPML_Debug_BackTrace $debug_backtrace */
|
|
private $debug_backtrace;
|
|
|
|
/** @var array $filters_to_restore */
|
|
private $filters_to_restore = array();
|
|
|
|
/**
|
|
* WPML_Compatibility_Plugin_Visual_Composer constructor.
|
|
*
|
|
* @param WPML_Debug_BackTrace $debug_backtrace
|
|
*/
|
|
public function __construct( WPML_Debug_BackTrace $debug_backtrace ) {
|
|
$this->debug_backtrace = $debug_backtrace;
|
|
}
|
|
|
|
public function add_hooks() {
|
|
$this->prevent_registering_widget_strings_twice();
|
|
}
|
|
|
|
private function prevent_registering_widget_strings_twice() {
|
|
add_filter( 'widget_title', array( $this, 'suspend_vc_widget_translation' ), - PHP_INT_MAX );
|
|
add_filter( 'widget_text', array( $this, 'suspend_vc_widget_translation' ), - PHP_INT_MAX );
|
|
add_filter( 'widget_title', array( $this, 'restore_widget_translation' ), PHP_INT_MAX );
|
|
add_filter( 'widget_text', array( $this, 'restore_widget_translation' ), PHP_INT_MAX );
|
|
add_filter( 'wpml_pb_shortcode_encode', array( $this, 'vc_safe_encode' ), 10, 2 );
|
|
add_filter( 'wpml_pb_shortcode_decode', array( $this, 'vc_safe_decode' ), 10, 3 );
|
|
}
|
|
|
|
/**
|
|
* @param string $text
|
|
*
|
|
* @return string
|
|
*/
|
|
public function suspend_vc_widget_translation( $text ) {
|
|
if ( $this->debug_backtrace->is_function_in_call_stack( 'vc_do_shortcode' )
|
|
&& ! $this->debug_backtrace->is_function_in_call_stack( 'dynamic_sidebar', false )
|
|
) {
|
|
$filter = new stdClass();
|
|
$filter->hook = current_filter();
|
|
$filter->name = 'icl_sw_filters_' . $filter->hook;
|
|
$filter->priority = has_filter( $filter->hook, $filter->name );
|
|
|
|
if ( false !== $filter->priority ) {
|
|
remove_filter( $filter->hook, $filter->name, $filter->priority );
|
|
$this->filters_to_restore[] = $filter;
|
|
}
|
|
}
|
|
|
|
return $text;
|
|
}
|
|
|
|
/**
|
|
* @param string $text
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function restore_widget_translation( $text ) {
|
|
foreach ( $this->filters_to_restore as $filter ) {
|
|
add_filter( $filter->hook, $filter->name, $filter->priority );
|
|
}
|
|
|
|
return $text;
|
|
}
|
|
|
|
function vc_safe_encode( $string, $encoding ) {
|
|
if ( 'vc_safe' === $encoding ) {
|
|
if ( is_array( $string ) ) {
|
|
$string = implode( ',', $string );
|
|
}
|
|
$string = '#E-8_' . base64_encode( rawurlencode( $string ) );
|
|
}
|
|
|
|
return $string;
|
|
}
|
|
|
|
function vc_safe_decode( $string, $encoding, $encoded_string ) {
|
|
if ( 'vc_safe' === $encoding ) {
|
|
$values = rawurldecode( base64_decode( substr( $string, 5 ) ) );
|
|
$values = explode( ',', $values );
|
|
$string = array();
|
|
foreach ( $values as $index => $value ) {
|
|
$string[ $index ] = array( 'value' => $value, 'translate' => true );
|
|
}
|
|
}
|
|
|
|
return $string;
|
|
}
|
|
|
|
}
|