166 lines
4.8 KiB
PHP
166 lines
4.8 KiB
PHP
<?php
|
|
namespace ConnectPolylangElementor;
|
|
|
|
use Elementor\Controls_Manager;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
|
|
class LanguageVisibility {
|
|
|
|
use \ConnectPolylangElementor\Util\Singleton;
|
|
|
|
/**
|
|
* __construct
|
|
*
|
|
* @return void
|
|
*/
|
|
private function __construct() {
|
|
|
|
// Editor styles.
|
|
add_action( 'elementor/preview/enqueue_styles', array( $this, 'preview_styles' ) );
|
|
|
|
// Editor add extras settings.
|
|
$visibility_settings = array( $this, 'visibility_settings' );
|
|
add_action( 'elementor/element/section/section_advanced/after_section_end', $visibility_settings, 10, 2 );
|
|
add_action( 'elementor/element/column/section_advanced/after_section_end', $visibility_settings, 10, 2 );
|
|
add_action( 'elementor/element/container/section_layout/after_section_end', $visibility_settings, 10, 2 );
|
|
add_action( 'elementor/element/common/_section_style/after_section_end', $visibility_settings, 10, 2 );
|
|
|
|
// Front check visibility.
|
|
$visibility_check = array( $this, 'visibility_check' );
|
|
add_filter( 'elementor/frontend/section/should_render', $visibility_check, 10, 2 );
|
|
add_filter( 'elementor/frontend/column/should_render', $visibility_check, 10, 2 );
|
|
add_filter( 'elementor/frontend/container/should_render', $visibility_check, 10, 2 );
|
|
add_filter( 'elementor/frontend/widget/should_render', $visibility_check, 10, 2 );
|
|
|
|
add_filter( 'elementor/element/is_dynamic_content', array( $this, 'filter_element_caching_is_dynamic_content' ), 10, 3 );
|
|
|
|
}
|
|
|
|
/**
|
|
* Add preview styles for elements with language visibility enabled
|
|
*
|
|
* @return void
|
|
*/
|
|
public function preview_styles() {
|
|
|
|
wp_add_inline_style( 'editor-preview', '.cpel-lv--yes {outline:2px dashed #d5dadf;}' );
|
|
|
|
}
|
|
|
|
/**
|
|
* Add visibility settings
|
|
*
|
|
* @param mixed $element
|
|
* @param mixed $section_id
|
|
* @return void
|
|
*/
|
|
public function visibility_settings( $element, $section_id ) {
|
|
|
|
$languages = pll_languages_list( array( 'fields' => '' ) );
|
|
$dropdown = wp_list_pluck( $languages, 'name', 'slug' );
|
|
|
|
$element->start_controls_section(
|
|
'cpel_lv_section',
|
|
array(
|
|
'tab' => Controls_Manager::TAB_ADVANCED,
|
|
'label' => __( 'Language Visibility', 'connect-polylang-elementor' ),
|
|
)
|
|
);
|
|
|
|
$element->add_control(
|
|
'cpel_lv_enabled',
|
|
array(
|
|
'type' => Controls_Manager::SWITCHER,
|
|
'label' => __( 'Enable', 'elementor' ), // phpcs:ignore WordPress.WP.I18n
|
|
'render_type' => 'template',
|
|
'prefix_class' => 'cpel-lv--',
|
|
'style_transfer' => false,
|
|
)
|
|
);
|
|
|
|
$element->add_control(
|
|
'cpel_lv_action',
|
|
array(
|
|
'label' => __( 'Visibility', 'elementor' ), // phpcs:ignore WordPress.WP.I18n
|
|
'type' => Controls_Manager::CHOOSE,
|
|
'options' => array(
|
|
'show' => array(
|
|
'title' => __( 'Show', 'elementor' ), // phpcs:ignore WordPress.WP.I18n
|
|
'icon' => 'eicon-preview-medium',
|
|
),
|
|
'hide' => array(
|
|
'title' => __( 'Hide', 'elementor' ), // phpcs:ignore WordPress.WP.I18n
|
|
'icon' => 'eicon-ban',
|
|
),
|
|
),
|
|
'default' => 'show',
|
|
'condition' => array(
|
|
'cpel_lv_enabled' => 'yes',
|
|
),
|
|
)
|
|
);
|
|
|
|
$element->add_control(
|
|
'cpel_lv_languages',
|
|
array(
|
|
'label' => __( 'When language is:', 'connect-polylang-elementor' ),
|
|
'type' => Controls_Manager::SELECT2,
|
|
'label_block' => true,
|
|
'default' => array(),
|
|
'multiple' => true,
|
|
'options' => $dropdown,
|
|
'condition' => array(
|
|
'cpel_lv_enabled' => 'yes',
|
|
),
|
|
)
|
|
);
|
|
|
|
$element->end_controls_section();
|
|
|
|
}
|
|
|
|
/**
|
|
* Check render language visibility
|
|
*
|
|
* @param bool $should_render
|
|
* @param Element_Base $element
|
|
* @return bool
|
|
*/
|
|
public function visibility_check( $should_render, $element ) {
|
|
|
|
$settings = $element->get_settings();
|
|
$enabled = ! empty( $settings['cpel_lv_enabled'] ) ? $settings['cpel_lv_enabled'] : false;
|
|
$enabled = filter_var( $enabled, FILTER_VALIDATE_BOOLEAN );
|
|
$languages = isset( $settings['cpel_lv_languages'] ) ? (array) $settings['cpel_lv_languages'] : array();
|
|
$show = isset( $settings['cpel_lv_action'] ) ? 'hide' !== $settings['cpel_lv_action'] : true;
|
|
|
|
if ( ! $enabled || empty( $languages ) ) {
|
|
return $should_render;
|
|
}
|
|
|
|
return in_array( pll_current_language(), $languages, true ) ? $show : ! $show;
|
|
|
|
}
|
|
|
|
/**
|
|
* Mark element as dynamic content if language visibility is enabled
|
|
*
|
|
* @param bool $is_dynamic_content
|
|
* @param array $element_rqw_data
|
|
* @param Element_Base $element_instance
|
|
* @return bool
|
|
*/
|
|
public function filter_element_caching_is_dynamic_content( $is_dynamic_content, $element_rqw_data, $element_instance ) {
|
|
|
|
if ( isset( $element_rqw_data['settings']['cpel_lv_enabled'] ) && 'yes' === $element_rqw_data['settings']['cpel_lv_enabled'] ) {
|
|
$is_dynamic_content = true;
|
|
}
|
|
|
|
return $is_dynamic_content;
|
|
|
|
}
|
|
|
|
}
|