templates = $templates; $this->settings = $settings; $this->model_build = $model_build; } public function init_hooks() { add_action( 'wp_enqueue_scripts', array( $this, 'wp_enqueue_scripts_action' ), 20 ); } /** * @param WPML_LS_Slot $slot * * @return string */ private function get_slot_color_picker_css( $slot ) { $css = ''; if ( $slot->is_menu() ) { $css = $this->get_slot_color_picker_css_for_menus( $slot ); } elseif ( ! $slot->is_post_translations() ) { $css = $this->get_slot_color_picker_css_for_widgets_and_statics( $slot ); } return $this->sanitize_css( $css ); } /** * @param WPML_LS_Slot $slot * * @return string */ private function get_slot_color_picker_css_for_menus( $slot ) { $css = ''; $prefix = '.' . $this->model_build->get_css_prefix(); $menu_item_class = $prefix . 'slot-' . $slot->slug(); if ( $slot->get( 'background_other_normal' ) || $slot->get( 'font_other_normal' ) ) { $css .= "$menu_item_class,"; $css .= " $menu_item_class a,"; $css .= " $menu_item_class a:visited{"; $css .= $slot->get( 'background_other_normal' ) ? "background-color:{$slot->get( 'background_other_normal' )};" : ''; $css .= $slot->get( 'font_other_normal' ) ? "color:{$slot->get( 'font_other_normal' )};" : ''; $css .= "}"; } if ( $slot->get( 'font_other_hover' ) || $slot->get( 'background_other_hover' ) ) { $css .= "$menu_item_class:hover,"; $css .= " $menu_item_class:hover a,"; $css .= " $menu_item_class a:hover{"; $css .= $slot->get( 'font_other_hover' ) ? "color:{$slot->get( 'font_other_hover' )};" : ''; $css .= $slot->get( 'background_other_hover' ) ? "background-color:{$slot->get( 'background_other_hover' )};" : ''; $css .= "}"; } if ( $slot->get( 'font_current_normal' ) || $slot->get( 'background_current_normal' ) ) { $css .= "$menu_item_class{$prefix}current-language,"; $css .= " $menu_item_class{$prefix}current-language a,"; $css .= " $menu_item_class{$prefix}current-language a:visited{"; $css .= $slot->get( 'font_current_normal' ) ? "color:{$slot->get( 'font_current_normal' )};" : ''; $css .= $slot->get( 'background_current_normal' ) ? "background-color:{$slot->get( 'background_current_normal' )};" : ''; $css .= "}"; } if ( $slot->get( 'font_current_hover' ) || $slot->get( 'background_current_hover' ) ) { $css .= "$menu_item_class{$prefix}current-language:hover,"; $css .= " $menu_item_class{$prefix}current-language:hover a,"; $css .= " $menu_item_class{$prefix}current-language a:hover{"; $css .= $slot->get( 'font_current_hover' ) ? "color:{$slot->get( 'font_current_hover' )};" : ''; $css .= $slot->get( 'background_current_hover' ) ? "background-color:{$slot->get( 'background_current_hover' )};" : ''; $css .= "}"; } // Override parent menu styles for hierarchical menus if ( $slot->get( 'is_hierarchical' ) ) { if ( $slot->get( 'background_other_normal' ) || $slot->get( 'font_other_normal' ) ) { $css .= "$menu_item_class{$prefix}current-language $menu_item_class,"; $css .= " $menu_item_class{$prefix}current-language $menu_item_class a,"; $css .= " $menu_item_class{$prefix}current-language $menu_item_class a:visited{"; $css .= $slot->get( 'background_other_normal' ) ? "background-color:{$slot->get( 'background_other_normal' )};" : ''; $css .= $slot->get( 'font_other_normal' ) ? "color:{$slot->get( 'font_other_normal' )};" : ''; $css .= "}"; } if ( $slot->get( 'font_other_hover' ) || $slot->get( 'background_other_hover' ) ) { $css .= "$menu_item_class{$prefix}current-language $menu_item_class:hover,"; $css .= " $menu_item_class{$prefix}current-language $menu_item_class:hover a,"; $css .= " $menu_item_class{$prefix}current-language $menu_item_class a:hover {"; $css .= $slot->get( 'font_other_hover' ) ? "color:{$slot->get( 'font_other_hover' )};" : ''; $css .= $slot->get( 'background_other_hover' ) ? "background-color:{$slot->get( 'background_other_hover' )};" : ''; $css .= "}"; } } return $css; } /** * @param WPML_LS_Slot $slot * * @return string */ private function get_slot_color_picker_css_for_widgets_and_statics ($slot ) { $css = ''; $prefix = '.' . $this->model_build->get_css_prefix(); $wrapper_class = '.' . $this->model_build->get_slot_css_main_class( $slot->group(), $slot->slug() ); if ( $slot->get( 'background_normal' ) ) { $css .= "$wrapper_class{"; $css .= "background-color:{$slot->get( 'background_normal' )};"; $css .= "}"; } if ( $slot->get( 'border_normal' ) ) { $css .= "$wrapper_class, $wrapper_class {$prefix}sub-menu, $wrapper_class a {"; $css .= "border-color:{$slot->get( 'border_normal' )};"; $css .= "}"; } if ( $slot->get( 'font_other_normal' ) || $slot->get( 'background_other_normal' ) ) { $css .= "$wrapper_class a {"; $css .= $slot->get( 'font_other_normal' ) ? "color:{$slot->get( 'font_other_normal' )};" : ''; $css .= $slot->get( 'background_other_normal' ) ? "background-color:{$slot->get( 'background_other_normal' )};" : ''; $css .= "}"; } if ( $slot->get( 'font_other_hover' ) || $slot->get( 'background_other_hover' ) ) { $css .= "$wrapper_class a:hover,$wrapper_class a:focus {"; $css .= $slot->get( 'font_other_hover' ) ? "color:{$slot->get( 'font_other_hover' )};" : ''; $css .= $slot->get( 'background_other_hover' ) ? "background-color:{$slot->get( 'background_other_hover' )};" : ''; $css .= "}"; } if ( $slot->get( 'font_current_normal' ) || $slot->get( 'background_current_normal' ) ) { $css .= "$wrapper_class {$prefix}current-language>a {"; $css .= $slot->get( 'font_current_normal' ) ? "color:{$slot->get( 'font_current_normal' )};" : ''; $css .= $slot->get( 'background_current_normal' ) ? "background-color:{$slot->get( 'background_current_normal' )};" : ''; $css .= "}"; } if ( $slot->get( 'font_current_hover' ) || $slot->get( 'background_current_hover' ) ) { $css .= "$wrapper_class {$prefix}current-language:hover>a, $wrapper_class {$prefix}current-language>a:focus {"; $css .= $slot->get( 'font_current_hover' ) ? "color:{$slot->get( 'font_current_hover' )};" : ''; $css .= $slot->get( 'background_current_hover' ) ? "background-color:{$slot->get( 'background_current_hover' )};" : ''; $css .= "}"; } return $css; } /** * @param array $slots * * @return string */ public function get_slots_inline_styles( $slots ) { $all_styles = ''; if ( $this->settings->can_load_styles() ) { foreach ( $slots as $slot ) { /* @var WPML_LS_Slot $slot */ $css = $this->get_slot_color_picker_css( $slot ); if ( $css ) { $style_id = 'wpml-ls-inline-styles-' . $slot->group() . '-' . $slot->slug(); $all_styles .= '' . PHP_EOL; } } } return $all_styles; } /** * @return string */ public function get_additional_style() { $css = $this->sanitize_css( $this->settings->get_setting( 'additional_css' ) ); if ( $css ) { $css = '' . PHP_EOL; } return $css; } public function wp_enqueue_scripts_action() { $this->enqueue_inline_styles(); } private function enqueue_inline_styles() { if ( $this->settings->can_load_styles() ) { $active_slots = $this->settings->get_active_slots(); $first_valid_handler = $this->get_first_valid_style_handler( $active_slots ); foreach ( $active_slots as $slot ) { /* @var WPML_LS_Slot $slot */ $css = $this->get_slot_color_picker_css( $slot ); if ( empty( $css ) ) { continue; } $template = $this->templates->get_template( $slot->template() ); if ( $template->has_styles() ) { wp_add_inline_style( $template->get_inline_style_handler(), $css ); } else if ( $first_valid_handler ) { wp_add_inline_style( $first_valid_handler, $css ); } else { echo $this->get_raw_inline_style_tag( $slot, $css ); } } if ( $first_valid_handler ) { $additional_css = $this->sanitize_css( $this->settings->get_setting( 'additional_css' ) ); if ( ! empty( $additional_css ) ) { wp_add_inline_style( $first_valid_handler, $additional_css ); } } else { echo $this->get_additional_style(); } } } /** * @param array $active_slots * * @return bool|mixed|null|string */ private function get_first_valid_style_handler( $active_slots ) { $first_handler = null; foreach ( $active_slots as $slot ) { /* @var WPML_LS_Slot $slot */ $template = $this->templates->get_template( $slot->template() ); $handler = $template->get_inline_style_handler(); if ( $handler ) { $first_handler = $handler; break; } } return $first_handler; } public function admin_output() { if ( $this->settings->can_load_styles() ) { $active_slots = $this->settings->get_active_slots(); foreach ( $active_slots as $slot ) { /* @var WPML_LS_Slot $slot */ $css = $this->get_slot_color_picker_css( $slot ); echo $this->get_raw_inline_style_tag( $slot, $css ); } echo $this->get_additional_style(); } } /** * @param WPML_LS_Slot $slot * @param string $css * * @return string */ private function get_raw_inline_style_tag( $slot, $css ) { $style_id = 'wpml-ls-inline-styles-' . $slot->group() . '-' . $slot->slug(); return '' . PHP_EOL; } /** * @param string $css * * @return string */ private function sanitize_css( $css ) { $css = wp_strip_all_tags( $css ); $css = preg_replace('/\s+/S', " ", trim( $css ) ); return $css; } }