????JFIF??x?x????'
Server IP : 104.21.48.1 / Your IP : 216.73.216.145 Web Server : LiteSpeed System : Linux premium151.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64 User : tempvsty ( 647) PHP Version : 8.0.30 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/./tempvsty/pontiacques.org/wp-content/themes/layerswp/core/widgets/modules/ |
Upload File : |
<?php /** * Layers Widget Class * * This file is used to register the base layers widget Class * * @package Layers * @since Layers 1.0.0 */ if( !class_exists( 'Layers_Widget' ) ) { class Layers_Widget extends WP_Widget { public $layers_widget_classname; public $field_attribute_prefixes; public $item_count; public $inline_css; public $animation_class = 'x-fade-in-up'; public $support_lightbox = false; public $custom_fonts = array(); // Defaults public $defaults = array(); public $merge_defaults = array(); public $merge_repeater_defaults = array(); /** * If there is inline CSS back it up while we run this widget * */ function backup_inline_css(){ global $layers_inline_css; $this->old_inline_css = $layers_inline_css; $layers_inline_css = ''; $this->inline_css = ''; } /** * If an animation class is specified in the class then apply the class * * @param $instance * * @return string */ public function get_animation_class($instance) { global $wp_customize; if ( 'on' === $this->check_and_return( $instance , 'design', 'advanced', 'animation' ) && strlen($this->animation_class) !== 0 && !$wp_customize ) { return 'do-animate delay-200 translucent animated-1s ' . $this->animation_class; } return ''; } /** * If there is inline CSS to print in this widget, do so at the bottom of the widget * * @return string If there is CSS to return, returns the CSS wrapped in a <style> tag */ function print_inline_css( $widget = array(), $instance = array() ){ global $layers_inline_css, $wp_customize; $this->inline_css = apply_filters( 'layers_widget_' . $this->widget_id . '_inline_css', $layers_inline_css, $widget, $instance ); if( '' !== $this->inline_css ) { echo '<style id="layers_widget_' . $this->widget_id . '_inline_css" type="text/css"> /* INLINE WIDGET CSS */ ' . trim( $this->inline_css ) . ' </style>'; } $layers_inline_css = $this->old_inline_css; if( !$wp_customize ) $this->enqueue_custom_fonts(); } /** * Get custom Google font path for use in the inline widget CSS * * @param $font_family Font family select value from widget * * @return string If there is a font path to return, do so */ function get_custom_font_uri( $font_family ){ $all_fonts = layers_get_google_fonts(); $family = urlencode( $font_family . ':' . join( ',', layers_get_google_font_variants( $font_family, $all_fonts[ $font_family ]['variants'] ) ) ); $request = '//fonts.googleapis.com/css?family=' . $family; return $request; } function enqueue_custom_fonts(){ if( !isset( $this->custom_fonts ) || ( isset( $this->custom_fonts ) && empty( $this->custom_fonts ) ) ) return; // De-dupe the fonts $this->custom_fonts = array_unique( $this->custom_fonts ); $all_fonts = layers_get_google_fonts(); // Validate each font and convert to URL format foreach ( $this->custom_fonts as $font ) { $font = trim( $font ); // Verify that the font exists if ( array_key_exists( $font, $all_fonts ) ) { // Build the family name and variant string (e.g., "Open+Sans:regular,italic,700") $family[] = urlencode( $font . ':' . join( ',', layers_get_google_font_variants( $font, $all_fonts[ $font ]['variants'] ) ) ); } } // Convert from array to string if ( empty( $family ) ) { return ''; } else { $request = '//fonts.googleapis.com/css?family=' . implode( '|', $family ); } wp_enqueue_style( LAYERS_THEME_SLUG . '-' . $this->widget_id . '-fonts', $request, array(), LAYERS_VERSION ); } /** * Check option with isset() and echo it out if it exists, if it does not exist, return false * * @param array $instance Widget Object * @param string $option Widget option to check on * @param string $array_level_1 Array level one to check for (optional) * @param string $array_level_2 Array level two to check for (optional) * @return string false if not set, otherwise returns value */ function check_and_return( $instance = NULL, $option = NULL, $array_level_1 = NULL, $array_level_2 = NULL ){ // If there is no widget object then bail if( NULL == $instance ) return; if( ! isset( $instance[$option] ) ){ return false; } else { $instance_option = $instance[$option]; } if( NULL != $array_level_1 ){ if( ! isset( $instance_option[$array_level_1] ) ){ return false; } elseif( '' != $instance_option[$array_level_1] ){ if( NULL != $array_level_2 ){ if( ! isset( $instance_option[$array_level_1][$array_level_2] ) ){ return false; } elseif( '' != $instance_option[$array_level_1][$array_level_2] ) { return $instance_option[$array_level_1][$array_level_2]; } } elseif( '' != $instance_option[$array_level_1] ) { return $instance_option[$array_level_1]; } } } elseif( '' != $instance_option ){ return $instance_option; } } /** * This function determines whether or not a widget is boxed or full width * * @return string widget layout class */ function get_widget_layout_class( $instance = NULL ){ if( NULL == $instance ) return; // Setup the layout class for boxed/full width/full screen if( 'layout-boxed' == $this->check_and_return( $instance , 'design' , 'layout' ) ) { $layout_class = 'container'; } elseif('layout-full-screen' == $this->check_and_return( $instance , 'design' , 'layout' ) ) { $layout_class = 'full-screen'; } elseif( 'layout-fullwidth' == $this->check_and_return( $instance , 'design' , 'layout' ) ) { $layout_class = 'full-width'; } else { $layout_class = ''; } return $layout_class; } /** * Get widget spacing as class names * * @return string Class names. */ function get_widget_spacing_class( $instance = NULL ){ if( NULL == $instance ) return; // Setup the class for all the kinds of margin and padding $classes = array(); if( $this->check_and_return( $instance , 'design' , 'advanced', 'margin-top' ) ) $classes[] = 'margin-top-' . $this->check_and_return( $instance , 'design' , 'advanced', 'margin-top' ); if( $this->check_and_return( $instance , 'design' , 'advanced', 'margin-right' ) ) $classes[] = 'margin-right-' . $this->check_and_return( $instance , 'design' , 'advanced', 'margin-right' ); if( $this->check_and_return( $instance , 'design' , 'advanced', 'margin-bottom' ) ) $classes[] = 'margin-bottom-' . $this->check_and_return( $instance , 'design' , 'advanced', 'margin-bottom' ); if( $this->check_and_return( $instance , 'design' , 'advanced', 'margin-left' ) ) $classes[] = 'margin-left-' . $this->check_and_return( $instance , 'design' , 'advanced', 'margin-left' ); if( $this->check_and_return( $instance , 'design' , 'advanced', 'padding-top' ) ) $classes[] = 'padding-top-' . $this->check_and_return( $instance , 'design' , 'advanced', 'padding-top' ); if( $this->check_and_return( $instance , 'design' , 'advanced', 'padding-right' ) ) $classes[] = 'padding-right-' . $this->check_and_return( $instance , 'design' , 'advanced', 'padding-right' ); if( $this->check_and_return( $instance , 'design' , 'advanced', 'padding-bottom' ) ) $classes[] = 'padding-bottom-' . $this->check_and_return( $instance , 'design' , 'advanced', 'padding-bottom' ); if( $this->check_and_return( $instance , 'design' , 'advanced', 'padding-left' ) ) $classes[] = 'padding-left-' . $this->check_and_return( $instance , 'design' , 'advanced', 'padding-left' ); $classes = implode( ' ', $classes ); return $classes; } /** * Apply advanced styles to widget instance * * @param string $widget_id id css selector of widget * @param object $instance Widget object to use */ function apply_widget_advanced_styling( $widget_id, $instance = NULL ){ // We need a widget to get the settings from if( NULL == $instance ) return; if( !isset( $this->inline_css ) ) $this->inline_css = ''; /** * Apply Margin & Padding */ $types = array( 'margin', 'padding', ); $fields = array( 'top', 'right', 'bottom', 'left', ); // Loop the Margin & Padding foreach ( $types as $type ) { // Get the TopRightBottomLeft TRBL array of values $values = $this->check_and_return( $instance , 'design' , 'advanced', $type ); if( NULL != $values && is_array( $values ) ) { foreach ( $fields as $field ) { if( isset( $values[ $field ] ) && '' != $values[ $field ] && is_numeric( $values[ $field ] ) ) { // If value is set, and is number, then add 'px' to it // $values[ $field ] .= 'px'; } } // Apply the TRBL styles if ( 'padding' == $type && isset( $instance['slides'] ) && 1 <= count( $instance['slides'] ) ){ $this->inline_css .= layers_inline_styles( ".{$widget_id} .swiper-slide > .content", $type, array( $type => $values ) ); } else{ $this->inline_css .= layers_inline_styles( ".{$widget_id}", $type, array( $type => $values ) ); } } } /** * Custom CSS */ if( $this->check_and_return( $instance, 'design', 'advanced', 'customcss' ) ) $this->inline_css .= layers_inline_styles( NULL, 'css', array( 'css' => $this->check_and_return( $instance, 'design', 'advanced', 'customcss' ) ) ); } /** * Design Bar Class Instantiation, we'd rather have it done here than in each widget * * @return html Design bar HTML */ public function design_bar( $type = 'side' , $widget = NULL, $instance = array(), $components = array( 'columns' , 'background' , 'imagealign' ) , $custom_components = array() ) { // Instantiate design bar $design_bar = new Layers_Design_Controller( $type, $widget, $instance, $components, $custom_components ); // Return design bar return $design_bar; } /** * Form Elements Class Instantiation, we'd rather have it done here than in each widget * * @return html Design bar HTML */ public function form_elements() { // Instantiate Widget Inputs $form_elements = new Layers_Form_Elements(); // Return design bar return $form_elements; } /** * Widget sub-module input name generation, for example see Slider and Content Widgets * * @param object $widget_details Widget object to use * @param string $level1 Level 1 name * @param string $level2 Level 2 name * @param string $field_name Field name * @return string Name attribute for $field_name */ function get_custom_field_name( $widget_details = NULL, $level1 = '', $level2 = '', $level3 = '', $level4 = '' ) { // If there is no widget object then ignore if( NULL == $widget_details ) return; $final_field_name = 'widget-' . $widget_details->id_base . '[' . $widget_details->number . ']'; // Add first level of input string if( '' != $level1 ) $final_field_name .= '[' . $level1 . ']'; // Add second level of input string if( '' != $level2 ) $final_field_name .= '[' . $level2 . ']'; // Add third level of input string if( '' != $level3 ) $final_field_name .= '[' . $level3 . ']'; // Add fourth level of input string if( '' != $level4 ) $final_field_name .= '[' . $level4 . ']'; return $final_field_name; } /** * Widget sub-module input id generation, for example see Slider and Content Widgets * * @param object $widget_details Widget object to use * @param string $level1 Level 1 name * @param string $level2 Level 2 name * @param string $field_name Field name * @return string Name attribute for $field_name */ function get_custom_field_id( $widget_details = NULL, $level1 = '', $level2 = '', $level3 = '', $level4 = '' ) { // If there is no widget object then ignore if( NULL == $widget_details ) return; $final_field_id = 'widget-' . $widget_details->id_base . '-' . $widget_details->number; // Add first level of input string if( '' != $level1 ) $final_field_id .= '-' . $level1; // Add second level of input string if( '' != $level2 ) $final_field_id .= '-' . $level2; // Add third level of input string if( '' != $level3 ) $final_field_id .= '-' . $level3; // Add fourth level of input string if( '' != $level4) $final_field_id .= '-' . $level4; return $final_field_id; } /** * Widget name generation (replaces get_custom_field_id) * * @param string $field_name_1 Level 1 name * @param string $field_name_2 Level 2 name * @param string $field_name_3 Level 3 name * @param string $field_name_4 Level 4 name * @return string Name attribute */ function get_layers_field_name( $field_name_1 = '', $field_name_2 = '', $field_name_3 = '', $field_name_4 = '' ) { // If we don't have these important widget details then bail. if ( ! isset( $this->id_base ) || ! isset( $this->number ) ) return; // Compile the first part. $string = 'widget-' . $this->id_base . '[' . $this->number . ']'; // If this is called in e.g. a button_item then by setting $field_attribute_prefixes args array, // before it's called the prefixes will be added at this point in the string construction. if ( isset( $this->field_attribute_prefixes ) && ! empty( $this->field_attribute_prefixes ) ) { $string .= '[' . implode( '][', $this->field_attribute_prefixes ) . ']'; } // Now add any custom strings passed as args. if( '' != $field_name_1 ) $string .= '[' . $field_name_1 . ']'; if( '' != $field_name_2 ) $string .= '[' . $field_name_2 . ']'; if( '' != $field_name_3 ) $string .= '[' . $field_name_3 . ']'; if( '' != $field_name_4 ) $string .= '[' . $field_name_4 . ']'; if ( ( bool ) layers_get_theme_mod( 'dev-switch-widget-field-names' ) ) { $debug_replace = 'widget-' . $this->id_base . '[' . $this->number . ']'; $debug_string = str_replace( $debug_replace, '', $string ); echo '<span class="layers-widget-defaults-debug">' . $debug_string . '</span><br />'; } return $string; } /** * Widget id generation (replaces get_custom_field_id) * * @param string $field_name_1 Level 1 id * @param string $field_name_2 Level 2 id * @param string $field_name_3 Level 3 id * @param string $field_name_4 Level 4 id * @return string Id attribute */ function get_layers_field_id( $field_name_1 = '', $field_name_2 = '', $field_name_3 = '', $field_name_4 = '' ) { // If we don't have these important widget details then bail. if ( ! isset( $this->id_base ) || ! isset( $this->number ) ) return; // Compile the first part. $string = 'widget-' . $this->id_base . '-' . $this->number; // If this is called in e.g. a button_item then by setting $field_attribute_prefixes args array, // before it's called the prefixes will be added at this point in the string construction. if ( isset( $this->field_attribute_prefixes ) && ! empty( $this->field_attribute_prefixes ) ) { $string .= '-' . implode( '-', $this->field_attribute_prefixes ); } // Now add any custom strings passed as args. if( '' != $field_name_1 ) $string .= '-' . $field_name_1; if( '' != $field_name_2 ) $string .= '-' . $field_name_2; if( '' != $field_name_3 ) $string .= '-' . $field_name_3; if( '' != $field_name_4 ) $string .= '-' . $field_name_4; return $string; } /** * Enqueue Masonry When Need Be */ function enqueue_masonry(){ wp_enqueue_script( LAYERS_THEME_SLUG . '-layers-masonry-js' ); } /** * Used to initialise repeater defaults * * @param string $type Unique singular slug for the type of repeater. Must just be unique to this widget e.g. button (not buttons) * @param integer $count How many pre-populated elements do you want to start with. * @param array $defaults_array A custom associative array that will become the defaults for each element. * @param array $defaults_array ... (can use any number of consecutive defaults arrays) */ function register_repeater_defaults( $type, $count = 3, $defaults_array = array() ) { // This allows to pass any number of default sets to the repeater, and they will be used in a loop to populate the required number of defaults. $count_defaults = func_num_args(); $i = 2; // Collect all the defaults arrays after the 3rd,including the 3rd. $defaults_collection = array(); while ( $i < $count_defaults ) { $defaults_collection[] = func_get_arg( $i ); $i++; } // Store the defaults so they can be merged in each time the widget is called. // It must be done now before the repeater defaults are merged into the main defaults. // Main Defaults. if ( empty( $this->merge_defaults ) && isset( $this->defaults ) ) { $this->merge_defaults = $this->defaults; } // Repeater Defaults. if ( ! isset( $this->merge_repeater_defaults[$type] ) ) { $this->merge_repeater_defaults[$type] = end( $defaults_collection ); } // Create array of random guid's to the specified size. $repeat_ids_array = array(); $i = 0; while ( $i < $count ) { $repeat_ids_array[] = rand( 1 , 1000 ); $i++; } // Store the guid's in a string for the default of the field e.g. button_ids $this->defaults["{$type}_ids"] = implode( ',', $repeat_ids_array ); // Start an empty nested array that will hold the new repeated defaults. $this->defaults["{$type}s"] = array(); // Add a default to each guid element, these will all be the same but are still needed when our defaulting methodology looks for them. $i = 0; foreach( $repeat_ids_array as $item_id ) { $this->defaults["{$type}s"][ $item_id ] = $defaults_collection[$i]; // Save them to our defaults property. $i++; if ( ! isset( $defaults_collection[$i] ) ) $i = 0; // Set back to 0 so we loop back around. } } /** * Get repeater items defaults * * @param string $type Unique singular slug for the type of repeater. Must just be unique to this widget e.g. button (not buttons) * @param integer $guid The uique ID of the default element. */ function get_repeater_defaults( $type, $guid = NULL ) { // Set blank instance defaults as backup to be safe. $instance_defaults = array(); if ( isset( $this->defaults["{$type}s"][$guid] ) ) { // Look for defaults created correctly by the register_repeater_defaults() method, with specific guid's. $instance_defaults = $this->defaults["{$type}s"][$guid]; } else if ( isset( $this->defaults["{$type}s"] ) && ! empty( $this->defaults["{$type}s"] ) ) { // Look for defaults created correctly by the register_repeater_defaults() method, without specific guid's so just get the first one. $instance_defaults = current( $this->defaults["{$type}s"] ); } return $instance_defaults; } /** * The main function that outputs the repeater form item. * * @param string $type Unique singular slug for the type of repeater. Must just be unique to this widget e.g. button (not buttons). * @param array $widget The widget object. * @param array $options Optional. Options args Array. */ function repeater( $type, $instance = array(), $options = array() ) { // Apply defaults to options. $options = wp_parse_args( $options, array( 'show_add_button' => TRUE, ) ); // If we have some items, let's break out their IDs into an array if ( isset( $instance["{$type}_ids"] ) && '' !== $instance["{$type}_ids"] ) { $items = explode( ',' , $instance["{$type}_ids"] ); } else { $items = array(); } // Compile the name of the new item function e.g. column_item. $function_name = "{$type}_item"; // Bail if the new_item method has not been defined in the custom widget class yet. if ( ! method_exists( $this, $function_name ) ) return false; // Prepare the counter index so we can write the item index to the new_item's. $this->item_count = -1; // Predefine the $repeater_id that will be used in the id="" attribute in the HTML $repeater_id = "{$type}_list_{$this->number}"; ?> <div id="<?php echo esc_attr( $repeater_id ); ?>" class="layers-widget-repeater" data-repeater-number="<?php echo esc_attr( $this->number ); ?>" data-repeater-type="<?php echo esc_attr( $type ) ?>" data-repeater-class="<?php echo esc_attr( get_class( $this ) ); ?>" data-repeater-id-base="<?php echo esc_attr( $this->id_base ); ?>" > <?php // This for element is hidden, and will be updated by javascript with the comma separated list of the guid's of the repeater items ordering. echo $this->form_elements()->input( array( 'type' => 'hidden', 'name' => $this->get_layers_field_name( "{$type}_ids" ), 'id' => $this->get_layers_field_id( "{$type}_ids" ), 'value' => ( isset( $instance["{$type}_ids"] ) ) ? $instance["{$type}_ids"] : NULL, 'class' => 'layers-repeater-input', ) ); ?> <ul id="<?php echo $repeater_id ?>_accordion" class="layers-accordions layers-accordions-sortable layers-sortable" > <?php // Loop the repeater items. if( isset( $items ) && is_array( $items ) ) { // This fixes the first-test widgets that had items with singular naming like 'slide' instead of 'slides'. if ( isset( $instance["$type"] ) ) { $instance["{$type}s"] = $instance["$type"]; unset( $instance["$type"] ); } foreach( $items as $item_guid ) { // Last check that this item definitely exists so no error while trying to render it. if ( ! isset( $instance["{$type}s"][$item_guid] ) ) continue; // Get just the required item part from the widget instance array. $item_instance = $instance["{$type}s"][$item_guid]; // Settings this will add these prefixes to both the get_layers_field_id(), // and get_layers_field_name() string construction. $this->field_attribute_prefixes = array( "{$type}s", $item_guid ); // Increment the item count - for use inside the item if needed. $this->item_count++; // Call the item function. $this->$function_name( $item_guid, $item_instance ); // Remove the extra attributes. unset( $this->field_attribute_prefixes ); } } ?> </ul> <?php // Settings this will add these prefixes to both the get_layers_field_id(), // and get_layers_field_name() string construction. $this->field_attribute_prefixes = array( "{$type}s", '{{{{guid}}}}' ); ?> <script type="text/html" id="tmpl-my-template" class="layers-widget-repeater-template"> <?php $this->$function_name( '{{{{guid}}}}', array() ); ?> </script> <?php unset( $this->field_attribute_prefixes ); ?> <?php if ( $options['show_add_button'] ) { ?> <button class="layers-button btn-full layers-widget-repeater-add-item add-new-widget"> <?php _e( 'Add New' , 'layerswp' ) ; ?> <?php echo ucfirst( $type ); ?> </button> <?php } ?> </div> <?php } /** * Helper function to display the repeater title when the Widget first loads. * There's also JS that will update this title as the title input is typed into. * * @param string $text The existing value of the widget title. * @return string Formetted title eg ` : Pretty Title...`. */ public function format_repeater_title( $text ) { $text = substr( stripslashes( strip_tags( $text ) ), 0 , 50 ); // Shorten the text to a max character width. if ( strlen( $text ) > 50 ) $text .= '...'; // Add `...` if the text is over a certain length. if ( $text ) $text = ': ' . $text; // Add ` : ` to the beginning. return $text; } /** * The main function that outputs the repeater form item. * * @param array $instance The widget object. We'll deal with the rest */ public function custom_anchor( $instance = NULL ){ if( NULL == $instance ) return; if( $this->check_and_return( $instance, 'design', 'advanced', 'anchor' ) ) { ?> <a name="<?php echo esc_attr( $this->check_and_return( $instance, 'design', 'advanced', 'anchor' ) ); ?>"></a> <?php } } public function check_and_return_link( $instance, $button_key ) { // Fix widget's that were created before dynamic linking structure. $instance = $this->convert_legacy_widget_links( $instance, $button_key ); // Collection. $link_array = array(); // Get the link based on the link type. $link_array['type'] = isset( $instance[$button_key]['link_type'] ) ? $instance[$button_key]['link_type'] : ''; switch ( $link_array['type'] ) { case 'post': if ( isset( $instance[$button_key]['link_type_post'] ) && is_numeric( $instance[$button_key]['link_type_post'] ) ) $link_array['link'] = get_permalink( $instance[$button_key]['link_type_post'] ); else $link_array['link'] = ''; break; case 'post_type_archive': break; case 'taxonomy_archive': break; case 'custom': default: $link_array['link'] = isset( $instance[$button_key]['link_type_custom'] ) ? $instance[$button_key]['link_type_custom'] : ''; break; } // Get the link_text. $link_array['text'] = isset( $instance[$button_key]['link_text'] ) ? $instance[$button_key]['link_text'] : ''; // Get the link_target. $link_array['target'] = isset( $instance[$button_key]['link_target'] ) ? '_blank' : ''; return $link_array; } public function convert_legacy_widget_links( $instance, $button_key ) { // Convert the Old Widget Format. if ( isset( $instance['link'] ) ) { $instance[$button_key]['link_type'] = 'custom'; $instance[$button_key]['link_type_custom'] = $instance['link']; unset( $instance['link'] ); } if ( isset( $instance['link_text'] ) ) { $instance[$button_key]['link_text'] = $instance['link_text']; unset( $instance['link_text'] ); } // Remove New-Old Widget Format. if ( isset( $instance['link_type'] ) ) unset( $instance['link_type'] ); if ( isset( $instance['link_post'] ) ) unset( $instance['link_post'] ); if ( isset( $instance['link_target'] ) ) unset( $instance['link_target'] ); return $instance; } /** * This helper will merge in additional defaults into the defaults of either * the main widget instance, or it's repeater-items (like columns, slides). * * @param array $instance Widget instance supplied by WP * @param string $item_key Optional - If this is specified it means it must be applied only to the repeater-items (like columns, slides) * @return array $instance with the merged in new defaults */ function apply_defaults( $instance, $item_key = NULL ) { // Store the defaults so they can be merged in each time the widget is called. // It must be done now before the repeater defaults are merged into the main defaults. // This is also done in register_repeater_defaults, but must be done again here, // in case this is not a widget with repeater(s). // Main Defaults. if ( empty( $this->merge_defaults ) && isset( $this->defaults ) ) { $this->merge_defaults = $this->defaults; } if ( $item_key ) { // Repeater instance. if ( isset( $this->merge_repeater_defaults[$item_key] ) ) { return $this->get_defaults( $instance, $this->merge_repeater_defaults[$item_key] ); } if ( isset( $this->merge_repeater_defaults[rtrim( $item_key, 's' )] ) ) { return $this->get_defaults( $instance, $this->merge_repeater_defaults[rtrim( $item_key, 's' )] ); } } else { // Main widget instance. return $this->get_defaults( $instance, $this->merge_defaults ); } } /** * Helper - Recurring function for checkling and applying additional defaults. */ function get_defaults( $instance, $defaults ) { // Loop through the supplied defaults. foreach ( $defaults as $default_key => $default_value ) { if ( is_array( $default_value ) ) { if ( ! isset( $instance[$default_key] ) ) { // This element doesnt even exist in the intance yet so apply the whole branch. $instance[$default_key] = $default_value; } else{ // Check this branch recurrsively. $instance[$default_key] = $this->get_defaults( $instance[$default_key], $default_value ); } } else { if ( ! isset( $instance[$default_key] ) && // If set means the input has had defaults applied already - hence don't apply. ! isset( $instance["{$default_key}-CHECKBOX"] ) && // look for sibling '-CHECKBOX' - If exists means the checkbox has had defaults applied already - hence don't apply. NULL !== $default_value ) { // Apply the default. $instance[$default_key] = $default_value; } } } return $instance; } /** * Helper - takes widget $args['before_widget'], strips out the needed data-attributes, * and returns it as an isolated string. This is enables Partial Widget refresh by * JavascScript in the Customizer preview (Thanks to Weston). */ function selective_refresh_atts( $args ) { $before_widget = isset( $args['before_widget'] ) ? $args['before_widget'] : '' ; preg_match_all( '/(data-customize-partial-id|data-customize-partial-type|data-customize-partial-placement-context|data-customize-widget-id)=("[^"]*")/i', $before_widget, $result ); $atts = ( isset( $result[0] ) && is_array( $result[0] ) ) ? implode( $result[0], ' ' ) : '' ; echo $atts; } /** * Display widget featured image * * @param string $css_class Optional - Specify the CSS class to apply to the wrapping <div /> * @param array $instance Widget instance supplied by WP * @return html Output of the featured media */ function featured_media( $css_class = '', $instance = array(), $show_link = true ){ if( empty( $instance ) ) return; // Set Featured Media $featureimage = $this->check_and_return( $instance , 'design' , 'featuredimage' ); $featurevideo = $this->check_and_return( $instance , 'design' , 'featuredvideo' ); // Fallback for the column width if( !isset( $instance[ 'width' ] ) ) $instance[ 'width' ] = 6; // Calculate which cut based on ratio. if( $this->check_and_return( $instance, 'design', 'imageratios' ) ){ // Translate Image Ratio into something usable $image_ratio = layers_translate_image_ratios( $this->check_and_return( $instance, 'design', 'imageratios' ) ); if( 4 >= $instance['width'] && 'layout-fullwidth' != $this->check_and_return( $instance, 'design', 'layout' ) ) $use_image_ratio = $image_ratio . '-medium'; else $use_image_ratio = $image_ratio . '-large'; } else { if( 4 > $instance['width'] ) $use_image_ratio = 'medium'; else $use_image_ratio = 'full'; } $media = layers_get_feature_media( $featureimage , $use_image_ratio , $featurevideo ); // Open in lightbox, this is a Layers Pro feature if( $this->check_and_return( $instance, 'design', 'open-lightbox' ) ){ // Get direct link to image $image_link = wp_get_attachment_url( $featureimage ); // Create link $href = 'href="' . $image_link . '" '; $target = ''; } else { // Create link $link_array = $this->check_and_return_link( $instance, 'button' ); $href = ( $link_array['link'] ) ? 'href="' . esc_url( $link_array['link'] ) . '"' : ''; $target = ( '_blank' == $link_array['target'] ) ? 'target="_blank"' : ''; } $image_container_class = array(); $image_container_class[] = $css_class; $image_container_class[] = ( 'image-round' == $this->check_and_return( $instance , 'design', 'imageratios' ) ? 'image-rounded' : '' ); $image_container_class = implode( ' ', $image_container_class ); if( NULL != $media ) { ?> <div class="<?php echo $image_container_class; ?>"> <?php if ( TRUE == $show_link && '' != $href ) { ?> <a <?php echo $href; ?> <?php echo $target; ?>> <?php // Output image or video echo $media; ?> </a> <?php } else { // Output image or video echo $media; } ?> </div> <?php } } } }