field_names = array(); } /** * @since 4.3.2 */ public function __destruct() { if( method_exists( $this, 'parent::__destruct' ) ) { parent::__destruct(); } unset( $this->field_names ); } /** * Returns an array that contains all default instance members filled with default values * * @since 4.3.2 * @param array $instance * @return array */ abstract protected function parse_args_instance( array $instance ); /** * Returns an array of all default fields * * @since 4.3.2 * @return array */ protected function get_field_names() { if( empty( $this->field_names ) ) { $fields = $this->parse_args_instance( array() ); $this->field_names = array_keys( $fields ); } return $this->field_names; } /** * Iterates over form elements (uses structure as in admin options page) * * @since 4.7.3.1 * @param array $elements * @return string */ protected function render_form_elements( array $elements ) { $html = new avia_htmlhelper(); $output = ''; foreach( $elements as $element ) { $output .= $html->render_single_element( $element ); } return $output; } /** * Output the '; } return $out; } } } /** * AVIA FACEBOOK WIDGET */ if ( ! class_exists( 'avia_fb_likebox' ) ) { class avia_fb_likebox extends Avia_Widget { const AJAX_NONCE = 'avia_fb_likebox_nonce'; const FB_SCRIPT_ID = 'facebook-jssdk'; /** * * @var int */ static protected $script_loaded = 0; /** * */ public function __construct() { //Constructor $widget_ops = array( 'classname' => 'avia_fb_likebox', 'description' => __( 'A widget that displays a facebook Likebox to a facebook page of your choice', 'avia_framework' ) ); parent::__construct( 'avia_fb_likebox', THEMENAME.' Facebook Likebox', $widget_ops ); add_action( 'init', array( $this, 'handler_wp_register_scripts' ), 500 ); add_action( 'wp_enqueue_scripts', array( $this, 'handler_wp_enqueue_scripts' ), 500 ); } /** * @since 4.3.2 */ public function __destruct() { parent::__destruct(); } /** * * @since 4.3.2 */ public function handler_wp_register_scripts() { $vn = avia_get_theme_version(); wp_register_script( 'avia_facebook_front_script' , AVIA_JS_URL . 'conditional_load/avia_facebook_front.js', array( 'jquery' ), $vn, true ); } /** * @since 4.3.2 */ public function handler_wp_enqueue_scripts() { $instances = $this->get_settings(); if( count( $instances ) > 0 ) { $need_js = array( 'confirm_link' ); foreach( $instances as $instance ) { if( isset( $instance['fb_link'] ) && in_array( $instance['fb_link'], $need_js ) ) { wp_enqueue_script( 'avia_facebook_front_script' ); break; } } } } /** * * @since 4.3.2 * @param array $instance * @return array */ protected function parse_args_instance( array $instance ) { $new_instance = wp_parse_args( $instance, array( 'url' => 'https://www.facebook.com/kriesi.at', 'title' => __( 'Follow us on Facebook', 'avia_framework' ), 'fb_link' => '', 'fb_banner' => '', 'page_title' => '', 'fb_logo' => '', 'content' => '', 'add_info' => __( 'Join our Facebook community', 'avia_framework' ), 'confirm_button' => __( 'Click to load facebook widget', 'avia_framework' ), 'page_link_text' => __( 'Open facebook page now', 'avia_framework' ) ) ); return $new_instance; } /** * Outputs the widget * * @param array $args * @param array $instance */ public function widget( $args, $instance ) { $instance = $this->parse_args_instance( $instance ); extract( $args, EXTR_SKIP ); extract( $instance, EXTR_SKIP ); if( empty( $url ) ) { return; } /** * Allow to change the conditional display setting - e.g. if user is opt in and allows to connect directly * * @since 4.4 * @param string $google_link '' | 'confirm_link' | 'page_only' * @param string $context * @param mixed $object * @param array $args * @param array $instance * @return string */ $original_fb_link = $fb_link; $fb_link = apply_filters( 'avf_conditional_setting_external_links', $fb_link, __CLASS__, $this, $args, $instance ); if( ! in_array( $fb_link, array( '', 'confirm_link', 'page_only' ) ) ) { $fb_link = $original_fb_link; } $title = apply_filters( 'widget_title', $title ); echo $before_widget; if ( ! empty( $title ) ) { echo $before_title . $title . $after_title; }; $banner_bg = ""; if( ! empty( $fb_link ) ) { if( ! empty( $fb_banner ) && ! empty( $fb_link ) ) { $banner_bg = 'style="background-image:url(' . $fb_banner . ');"'; } $link_title = avia_targeted_link_rel( '' . esc_html( $page_title ) . '' ); echo '
'; echo '
'; echo ''; echo $link_title; echo ''; echo ''; echo esc_html( $content ); echo ''; echo '
'; $html_logo = ''; if( ! empty( $fb_logo ) ) { $html_logo .= '
'; $html_logo .= '' . __( 'Logo image', 'avia_framework' ) . ''; $html_logo .= '
'; } echo '
'; echo ''; $data = ""; if( 'confirm_link' == $fb_link ) { $data = ' data-fbhtml="' . htmlentities( $this->html_facebook_page( $url ), ENT_QUOTES, get_bloginfo( 'charset' ) ) . '"'; $data .= ' data-fbscript="' . htmlentities( $this->get_fb_page_js_src(), ENT_QUOTES, get_bloginfo( 'charset' ) ) . '"'; $data .= ' data-fbscript_id="' . avia_fb_likebox::FB_SCRIPT_ID . '"'; } $btn_text = ( 'confirm_link' == $fb_link ) ? $confirm_button : $page_link_text; $icon = ""; echo avia_targeted_link_rel( '' .$icon . esc_html( $btn_text ) . '' ); if( ! empty( $fb_link ) ) { echo '
'; echo '
'; echo ''; echo esc_html( $add_info ); echo ''; echo '
'; echo '
'; echo '
'; echo '
'; } echo '
'; // class="av_facebook_widget_main_wrap" } if( empty( $fb_link ) ) { echo $this->html_facebook_page( $url ); add_action( 'wp_footer', array( $this,'handler_output_fb_page_script' ), 10 ); } echo $after_widget; } /** * Create the HTML for the facebook page widget * * @since 4.3.2 * @param string $url * @return string */ protected function html_facebook_page( $url ) { $extraClass = ''; $style = ''; // $height = 151; // remainings from original widget ????? // $faces = "true"; // $extraClass = ""; // $style = ""; // // // if( strpos( $height, "%" ) !== false ) // { // $extraClass = "av_facebook_widget_wrap_positioner"; // $style = "style='padding-bottom:{$height}%'"; // $height = "100%"; // } $html = ''; $html .= "
"; $html .= '
'; $html .= '
'; $html .= '
'; $html .= "
"; return $html; } /** * * @since 4.3.2 */ public function handler_output_fb_page_script() { if( self::$script_loaded >= 1 ) { return; } self::$script_loaded = 1; $script = ' '; echo $script; } /** * Return the js function * @since 4.3.2 * @return string */ protected function get_fb_page_js_src() { $langcode = get_locale(); /** * Change language code for facebook page widget * * @used_by enfold\config-wpml\config.php 10 * @since 4.3.2 */ $langcode = apply_filters( 'avf_fb_widget_lang_code', $langcode, 'fb-page' ); $src = '//connect.facebook.net/'. $langcode .'/sdk.js#xfbml=1&version=v2.7'; return $src; } /** * * @param array $new_instance * @param array $old_instance * @return array */ public function update( $new_instance, $old_instance ) { $instance = $this->parse_args_instance( $old_instance ); $fields = $this->get_field_names(); foreach( $new_instance as $key => $value ) { if( in_array( $key, $fields ) ) { $instance[ $key ] = strip_tags( $value ); } } return $instance; } /** * Outputs Widgetform in backend * * @param array $instance */ public function form( $instance ) { $instance = $this->parse_args_instance( $instance ); $fields = $this->get_field_names(); foreach( $instance as $key => $value ) { if( in_array( $key, $fields ) ) { $instance[ $key ] = esc_attr( $value ); } } extract( $instance ); $html = new avia_htmlhelper(); $banner_element = array( 'name' => __( 'Banner image', 'avia_framework' ), 'desc' => __( 'Upload a banner image or enter the URL', 'avia_framework' ), 'id' => $this->get_field_id( 'fb_banner'), 'id_name' => $this->get_field_name( 'fb_banner' ), 'std' => $fb_banner, 'type' => 'upload', 'label' => __('Use image as banner', 'avia_framework') ); $logo_element = array( 'name' => __( 'Logo', 'avia_framework' ), 'desc' => __( 'Upload a logo or enter the URL', 'avia_framework' ), 'id' => $this->get_field_id( 'fb_logo'), 'id_name' => $this->get_field_name( 'fb_logo' ), 'std' => $fb_logo, 'type' => 'upload', 'label' => __('Use image as logo', 'avia_framework') ); ?>

render_single_element( $banner_element );?>

'tweetbox', 'description' => 'A widget to display your latest twitter messages' ); parent::__construct( 'tweetbox', THEMENAME.' Twitter Widget', $widget_ops ); } function widget($args, $instance) { // prints the widget extract($args, EXTR_SKIP); echo $before_widget; $title = empty($instance['title']) ? '' : apply_filters('widget_title', $instance['title']); $count = empty($instance['count']) ? '' : $instance['count']; $username = empty($instance['username']) ? '' : $instance['username']; $exclude_replies = empty($instance['exclude_replies']) ? '' : $instance['exclude_replies']; $time = empty($instance['time']) ? 'no' : $instance['time']; $display_image = empty($instance['display_image']) ? 'no' : $instance['display_image']; if ( !empty( $title ) ) { echo $before_title . "".$title ."". $after_title; }; $messages = tweetbox_get_tweet($count, $username, $widget_id, $time, $exclude_replies, $display_image); echo $messages; echo $after_widget; } function update($new_instance, $old_instance) { //save the widget $instance = $old_instance; foreach($new_instance as $key=>$value) { $instance[$key] = strip_tags($new_instance[$key]); } delete_transient(THEMENAME.'_tweetcache_id_'.$instance['username'].'_'.$this->id_base."-".$this->number); return $instance; } function form($instance) { //widgetform in backend $instance = wp_parse_args( (array) $instance, array( 'title' => 'Latest Tweets', 'count' => '3', 'username' => avia_get_option('twitter') ) ); $title = isset($instance['title']) ? strip_tags($instance['title']): ""; $count = isset($instance['count']) ? strip_tags($instance['count']): ""; $username = isset($instance['username']) ? strip_tags($instance['username']): ""; $exclude_replies = isset($instance['exclude_replies']) ? strip_tags($instance['exclude_replies']): ""; $time = isset($instance['time']) ? strip_tags($instance['time']): ""; $display_image = isset($instance['display_image']) ? strip_tags($instance['display_image']): ""; ?>

"; echo $list; ?>

"; echo $list; ?>

"; echo $list; ?>

"; echo $list; ?>

status->user->followers_count if( empty( $xml->error ) ) { if ( isset($xml->status[0])) { $tweets = array(); foreach ($xml->status as $tweet) { if($iterations == $count) break; $text = (string) $tweet->text; if($exclude_replies == 'no' || ($exclude_replies == 'yes' && $text[0] != "@")) { $iterations++; $tweets[] = array( 'text' => tweetbox_filter( $text ), 'created' => strtotime( $tweet->created_at ), 'user' => array( 'name' => (string)$tweet->user->name, 'screen_name' => (string)$tweet->user->screen_name, 'image' => (string)$tweet->user->profile_image_url, 'utc_offset' => (int) $tweet->user->utc_offset[0], 'follower' => (int) $tweet->user->followers_count )); } } set_transient(THEMENAME.'_tweetcache_id_'.$username.'_'.$widget_id, 'true', 60*30); update_option(THEMENAME.'_tweetcache_'.$username.'_'.$widget_id, $tweets); } } } } if(!isset($tweets[0])) { $tweets = get_option(THEMENAME.'_tweetcache_'.$username.'_'.$widget_id); } if(isset($tweets[0])) { $time_format = apply_filters( 'avia_widget_time', get_option('date_format')." - ".get_option('time_format'), 'tweetbox' ); foreach ($tweets as $message) { $output .= '
  • '; if($avatar == "yes") $output .= '
    '; $output .= '
    '.$message['text']; if($time == "yes") $output .= '
    '.date_i18n( $time_format, $message['created'] + $message['user']['utc_offset']).'
    '; $output .= '
  • '; } } if($output != "") { $filtered_message = ""; } else { $filtered_message = ""; } return $filtered_message; } } if(!function_exists('tweetbox_filter')) { function tweetbox_filter($text) { // Props to Allen Shaw & webmancers.com & Michael Voigt $text = preg_replace('/\b([a-zA-Z]+:\/\/[\w_.\-]+\.[a-zA-Z]{2,6}[\/\w\-~.?=&%#+$*!]*)\b/i',"$1", $text); $text = preg_replace('/\b(?$1", $text); $text = preg_replace("/\b([a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]*\@[a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]{2,6})\b/i","$1", $text); $text = preg_replace("/#([\p{L}\p{Mn}]+)/u", "#\\1", $text); $text = preg_replace("/@([\p{L}\p{Mn}]+)/u", "@\\1", $text); return $text; } } /** * AVIA NEWSBOX * * Widget that creates a list of latest news entries * * @package AviaFramework * @todo replace the widget system with a dynamic one, based on config files for easier widget creation */ if (!class_exists('avia_newsbox')) { class avia_newsbox extends WP_Widget { var $avia_term = ''; var $avia_post_type = ''; var $avia_new_query = ''; function __construct() { $widget_ops = array('classname' => 'newsbox', 'description' => __('A Sidebar widget to display latest post entries in your sidebar', 'avia_framework') ); parent::__construct( 'newsbox', THEMENAME.' Latest News', $widget_ops ); } function widget($args, $instance) { global $avia_config; extract($args, EXTR_SKIP); echo $before_widget; $title = empty($instance['title']) ? '' : apply_filters('widget_title', $instance['title']); $count = empty($instance['count']) ? '' : $instance['count']; $cat = empty($instance['cat']) ? '' : $instance['cat']; $excerpt = empty($instance['excerpt']) ? '' : $instance['excerpt']; $image_size = isset($avia_config['widget_image_size']) ? $avia_config['widget_image_size'] : 'widget'; /** * @since 4.5.4 * @return string */ $image_size = apply_filters( 'avf_newsbox_image_size', $image_size, $args, $instance ); if ( !empty( $title ) ) { echo $before_title . $title . $after_title; }; if(empty($this->avia_term)) { $additional_loop = new WP_Query("cat=".$cat."&posts_per_page=".$count); } else { $catarray = explode(',', $cat); if(empty($catarray[0])) { $new_query = array("posts_per_page"=>$count,"post_type"=>$this->avia_post_type); } else { if($this->avia_new_query) { $new_query = $this->avia_new_query; } else { $new_query = array( "posts_per_page"=>$count, 'tax_query' => array( array( 'taxonomy' => $this->avia_term, 'field' => 'id', 'terms' => explode(',', $cat), 'operator' => 'IN') ) ); } } $additional_loop = new WP_Query($new_query); } if($additional_loop->have_posts()) : echo '"; wp_reset_postdata(); endif; echo $after_widget; } function update($new_instance, $old_instance) { $instance = $old_instance; $instance['title'] = strip_tags($new_instance['title']); $instance['count'] = strip_tags($new_instance['count']); $instance['excerpt'] = strip_tags($new_instance['excerpt']); $instance['cat'] = implode(',',$new_instance['cat']); return $instance; } function form($instance) { $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'count' => '', 'cat' => '', 'excerpt'=>'' ) ); $title = strip_tags($instance['title']); $count = strip_tags($instance['count']); $excerpt = strip_tags($instance['excerpt']); $elementCat = array("name" => __("Which categories should be used for the portfolio?", 'avia_framework'), "desc" => __("You can select multiple categories here", 'avia_framework'), "id" => $this->get_field_name('cat')."[]", "type" => "select", "std" => strip_tags($instance['cat']), "class" => "", "multiple"=>6, "subtype" => "cat"); //check if a different taxonomy than the default is set if(!empty($this->avia_term)) { $elementCat['taxonomy'] = $this->avia_term; } $html = new avia_htmlhelper(); ?>

    "; echo $list; ?>

    "; echo $list; ?>

    avia_term = 'portfolio_entries'; $this->avia_post_type = 'portfolio'; $this->avia_new_query = ''; //set a custom query here $widget_ops = array('classname' => 'newsbox', 'description' => __('A Sidebar widget to display latest portfolio entries in your sidebar', 'avia_framework') ); WP_Widget::__construct( 'portfoliobox', THEMENAME.' Latest Portfolio', $widget_ops ); } } } /** * AVIA SOCIALCOUNT * * Widget that retrieves, stores and displays the number of twitter and rss followers * * @package AviaFramework * @todo replace the widget system with a dynamic one, based on config files for easier widget creation */ if (!class_exists('avia_socialcount')) { class avia_socialcount extends WP_Widget { function __construct() { //Constructor $widget_ops = array('classname' => 'avia_socialcount', 'description' => __('A widget to display a link to your twitter profile and rss feed', 'avia_framework') ); parent::__construct( 'avia_socialcount', THEMENAME.' RSS Link and Twitter Account', $widget_ops ); } function widget($args, $instance) { // prints the widget extract($args, EXTR_SKIP); $twitter = empty($instance['twitter']) ? '' : $instance['twitter']; $rss = empty($instance['rss']) ? '' : $instance['rss']; $rss = preg_replace('!https?:\/\/feeds.feedburner.com\/!','',$rss); if(!empty($twitter) || !empty($rss)) { $addClass = "asc_multi_count"; if(!isset($twitter) || !isset($rss)) $addClass = 'asc_single_count'; echo $before_widget; $output = ""; if(!empty($twitter)) { $link = 'http://twitter.com/'.$twitter.'/'; $before = apply_filters('avf_social_widget', "", 'twitter'); $output .= "{$before}".__('Follow','avia_framework')."".__('on Twitter','avia_framework').""; } if($rss) { $output .= "".apply_filters('avf_social_widget',"", 'rss')."".__('Subscribe','avia_framework')."".__('to RSS Feed','avia_framework').""; } echo $output; echo $after_widget; } } function update($new_instance, $old_instance) { //save the widget $instance = $old_instance; foreach($new_instance as $key=>$value) { $instance[$key] = strip_tags($new_instance[$key]); } return $instance; } function form($instance) { //widgetform in backend $instance = wp_parse_args( (array) $instance, array('rss' => avia_get_option('feedburner'), 'twitter' => avia_get_option('twitter') ) ); $twitter = empty($instance['twitter']) ? '' : strip_tags($instance['twitter']); $rss = empty($instance['rss']) ? '' : strip_tags($instance['rss']); ?>

    add_cont = 2; //Constructor $widget_ops = array('classname' => 'avia_partner_widget', 'description' => __('An advertising widget that displays 2 images with 125 x 125 px in size', 'avia_framework') ); parent::__construct( 'avia_partner_widget', THEMENAME.' Advertising Area', $widget_ops ); } function widget($args, $instance) { extract($args, EXTR_SKIP); echo $before_widget; global $kriesiaddwidget, $firsttitle; $kriesiaddwidget ++; $title = empty($instance['title']) ? '' : apply_filters('widget_title', $instance['title']); $image_url = empty($instance['image_url']) ? ''.__('Advertise here','avia_framework').'' : ''.$title.''; $ref_url = empty($instance['ref_url']) ? '#' : apply_filters('widget_comments_title', $instance['ref_url']); $image_url2 = empty($instance['image_url2']) ? ''.__('Advertise here','avia_framework').'' : ''.$title.''; $ref_url2 = empty($instance['ref_url2']) ? '#' : apply_filters('widget_comments_title', $instance['ref_url2']); if ( ! empty( $title ) ) { echo $before_title . $title . $after_title; } echo avia_targeted_link_rel( '' . $image_url . '' ); if( $this->add_cont == 2 ) { echo avia_targeted_link_rel( '' . $image_url2 . '' ); } echo $after_widget; if($title == '') { $firsttitle = 'no_top_margin'; } } function update($new_instance, $old_instance) { //save the widget $instance = $old_instance; foreach($new_instance as $key=>$value) { $instance[$key] = strip_tags($new_instance[$key]); } return $instance; } function form($instance) { $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'image_url' => '', 'ref_url' => '', 'image_url2' => '', 'ref_url2' => '' ) ); $title = strip_tags($instance['title']); $image_url = strip_tags($instance['image_url']); $ref_url = strip_tags($instance['ref_url']); $image_url2 = strip_tags($instance['image_url2']); $ref_url2 = strip_tags($instance['ref_url2']); ?>

    add_cont == 2) { ?>

    add_cont = 1; $widget_ops = array('classname' => 'avia_one_partner_widget', 'description' => __('An advertising widget that displays 1 big image', 'avia_framework') ); parent::__construct( 'avia_one_partner_widget', THEMENAME.' Big Advertising Area', $widget_ops ); } } } /** * * * Widget that retrieves, stores and displays the number of twitter and rss followers * * * @todo replace the widget system with a dynamic one, based on config files for easier widget creation */ if( ! class_exists( 'avia_combo_widget' ) ) { /** * AVIA COMBO WIDGET * * Widget that displays your popular posts, recent posts, recent comments and a tagcloud in a tabbed section * * @package AviaFramework * * @since 4.4.2 extended and modified by günter */ class avia_combo_widget extends Avia_Widget { /** * Constructor */ public function __construct() { $widget_ops = array( 'classname' => 'avia_combo_widget', 'description' => __( 'A widget that displays your popular posts, recent posts, recent comments and a tagcloud', 'avia_framework' ) ); parent::__construct( 'avia_combo_widget', THEMENAME.' Combo Widget', $widget_ops ); /** * Hook to enable */ add_filter( 'avf_disable_frontend_assets', array( $this, 'handler_enable_shortcodes' ), 50, 1 ); } /** * * @since 4.4.2 */ public function __destruct() { parent::__destruct(); } /** * * @since 4.4.2 * @param array $instance * @return array */ protected function parse_args_instance( array $instance ) { /** * Backwards comp. only * * @since 4.4.2 'count' was removed */ $fallback = isset( $instance['count'] ); $new_instance = wp_parse_args( $instance, array( 'show_popular' => 4, 'show_recent' => 4, 'show_comments' => 4, 'show_tags' => 45, 'tab_1' => 'popular', 'tab_2' => 'recent', 'tab_3' => 'comments', 'tab_4' => 'tagcloud', ) ); if( $fallback ) { $new_instance['show_popular'] = $instance['count']; $new_instance['show_recent'] = $instance['count']; $new_instance['show_comments'] = $instance['count']; unset( $new_instance['count'] ); } return $new_instance; } /** * prints the widget * * @param array $args * @param array $instance */ public function widget( $args, $instance ) { $instance = $this->parse_args_instance( $instance ); extract( $args ); echo $before_widget; $used_tabs = 0; for( $tab_nr = 1; $tab_nr < 5; $tab_nr++ ) { $key = 'tab_' . $tab_nr; if( empty( $instance[ $key ] ) ) { continue; } if( ! in_array( $instance[ $key ], array( 'popular', 'recent', 'comments', 'tagcloud' ) ) ) { continue; } $used_tabs++; $add_class = ''; $add_class2 = ''; if( 1 == $used_tabs ) { echo "
    "; $add_class = ' first_tab active_tab '; $add_class2 = 'active_tab_content'; } switch( $instance[ $key ] ) { case 'popular': $args = array( 'posts_per_page' => $instance['show_popular'], 'orderby' => 'comment_count', 'order' => 'desc' ); echo '
    ' . __( 'Popular', 'avia_framework' ) . '
    '; echo "
    "; avia_combo_widget::get_post_list( $args ); echo "
    "; break; case 'recent': $args = array( 'posts_per_page' => $instance['show_recent'], 'orderby' => 'post_date', 'order' => 'desc' ); echo '
    '.__('Recent', 'avia_framework').'
    '; echo "
    "; avia_combo_widget::get_post_list( $args ); echo "
    "; break; case 'comments': $args = array( 'number' => $instance['show_comments'], 'status' => 'approve', 'order' => 'DESC' ); echo '
    '.__('Comments', 'avia_framework').'
    '; echo "
    "; avia_combo_widget::get_comment_list( $args ); echo "
    "; break; case 'tagcloud': $args = array( 'number' => $instance['show_tags'], 'smallest' => 12, 'largest' => 12, 'unit' => 'px' ); echo '
    '.__('Tags', 'avia_framework').'
    '; echo "
    "; wp_tag_cloud( $args ); echo "
    "; break; } } if( $used_tabs > 0 ) { echo "
    "; } echo $after_widget; } /** * * @param array $new_instance * @param array $old_instance * @return array */ public function update( $new_instance, $old_instance ) { $instance = $this->parse_args_instance( $old_instance ); $fields = $this->get_field_names(); foreach( $new_instance as $key => $value ) { if( in_array( $key, $fields ) ) { $instance[ $key ] = strip_tags( $value ); } } return $instance; } /** * Widgetform in backend * * @param array $instance */ public function form( $instance ) { $instance = $this->parse_args_instance( $instance ); extract( $instance ); $tab_content = array( 0 => __( 'No content', 'avia_framework' ), 'popular' => __( 'Popular posts', 'avia_framework' ), 'recent' => __( 'Recent posts', 'avia_framework' ), 'comments' => __( 'Newest comments', 'avia_framework' ), 'tagcloud' => __( 'Tag cloud', 'avia_framework' ), ); ?>

    get_settings(); /** * Search page might lead to no result and in this case we activate this widget manually */ if( ( count( $settings ) > 0 ) || is_search() ) { unset( $disabled['av_tab_container'] ); } return $disabled; } /** * Get postlist by query args * (up to 4.4.2 this was function avia_get_post_list( $avia_new_query , $excerpt = false) * * @since 4.4.2 * @added_by Günter * @param array $args * @param type $excerpt */ static public function get_post_list( array $args , $excerpt = false ) { global $avia_config; $image_size = isset( $avia_config['widget_image_size'] ) ? $avia_config['widget_image_size'] : 'widget'; $additional_loop = new WP_Query($args); if( $additional_loop->have_posts() ) { echo '"; wp_reset_postdata(); } } /** * Get commentlist by query args * (up to 4.4.2 this was function avia_get_comment_list( $avia_new_query ) * * @since 4.4.2 * @added_by Günter * @param array $args */ static public function get_comment_list( array $args ) { $time_format = apply_filters( 'avia_widget_time', get_option( 'date_format' ) . " - " . get_option( 'time_format' ), 'avia_get_comment_list' ); $comments = get_comments( $args ); if( ! empty( $comments ) ) { echo '"; wp_reset_postdata(); } } } } /*----------------------------------------------------------------------------------- get posts posts -----------------------------------------------------------------------------------*/ if ( ! function_exists('avia_get_post_list')) { function avia_get_post_list( $avia_new_query , $excerpt = false) { _deprecated_function( 'avia_get_post_list', '4.4.2', 'avia_combo_widget::get_post_list( $args )'); $avia_new_query = wp_parse_args( $avia_new_query ); avia_combo_widget::get_post_list( $avia_new_query, $excerpt ); } } if (!function_exists('avia_get_comment_list')) { function avia_get_comment_list( $avia_new_query ) { _deprecated_function( 'avia_get_comment_list', '4.4.2', 'avia_combo_widget::get_comment_list( $args )'); $avia_new_query = wp_parse_args( $avia_new_query ); avia_combo_widget::get_comment_list( $avia_new_query); } } /* Google Maps Widget Copyright 2009 Clark Nikdel Powell (email : taylor@cnpstudio.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ if( ! class_exists('avia_google_maps') ) { class avia_google_maps extends Avia_Widget { /** * */ public function __construct() { $widget_ops = array( 'classname' => 'avia_google_maps', 'description' => __( 'Add a google map to your blog or site', 'avia_framework' ) ); parent::__construct( 'avia_google_maps', THEMENAME.' Google Maps Widget', $widget_ops ); // add_action( 'admin_enqueue_scripts', array( $this,'handler_print_google_maps_scripts' ) ); } /** * @since 4.3.2 */ public function __destruct() { parent::__destruct(); } /** * * @since 4.3.2 * @param array $instance * @return array */ protected function parse_args_instance( array $instance ) { $SGMoptions = get_option( 'SGMoptions', array() ); // get options defined in admin page ???? $SGMoptions = wp_parse_args( $SGMoptions, array( 'zoom' => '15', // 1 - 19 'type' => 'ROADMAP', // ROADMAP, SATELLITE, HYBRID, TERRAIN 'content' => '', ) ); $new_instance = wp_parse_args( $instance, array( 'title' => '', 'lat' => '0', 'lng' => '0', 'zoom' => $SGMoptions['zoom'], 'type' => $SGMoptions['type'], 'directionsto' => '', 'content' => $SGMoptions['content'], 'width' => '', 'height' => '', 'street-address' => '', 'city' => '', 'state' => '', 'postcode' => '', 'country' => '', 'icon' => '', 'google_link' => '', 'confirm_button' => __( 'Click to load Google Maps', 'avia_framework' ), 'page_link_text' => __( 'Open Google Maps in a new window', 'avia_framework' ), 'google_fallback' => '' ) ); return $new_instance; } /** * Output the content of the widget * * @param array $args * @param array $instance */ public function widget( $args, $instance ) { if( true === Av_Google_Maps()->is_loading_prohibited() ) { if( current_user_can( 'edit_posts' ) ) { echo '

    ' . __( 'Widget Google Maps is disabled in theme options "Google Services".', 'avia_framework' ) . '

    '; echo '

    ' . __( '(Visible to admins only.)', 'avia_framework' ) . '

    '; } return; } $instance = $this->parse_args_instance( $instance ); $fields = $this->get_field_names(); foreach( $instance as $key => $value ) { if( in_array( $key, $fields ) ) { $instance[ $key ] = esc_attr( $value ); } } extract( $args ); extract( $instance ); $street_address = $instance['street-address']; if( empty( $lat ) || empty( $lng ) ) { return; } /** * Allow to change the conditional display setting - e.g. if user is opt in and allows to connect directly * * @since 4.4 * @param string $google_link '' | 'confirm_link' | 'page_only' * @param string $context * @param mixed $object * @param array $args * @param array $instance * @return string */ $original_google_link = $google_link; $google_link = apply_filters( 'avf_conditional_setting_external_links', $google_link, __CLASS__, $this, $args, $instance ); if( ! in_array( $google_link, array( '', 'confirm_link', 'page_only' ) ) ) { $google_link = $original_google_link; } $title = apply_filters('widget_title', $title ); echo $before_widget; if( ! empty( $title ) ) { echo $before_title . $title . $after_title; } $html_fallback_url = ''; if( ! empty( $google_fallback ) ) { $html_fallback_url .= 'background-image:url(' . $google_fallback . ');'; } $html_overlay = ''; if( ( 'confirm_link' == $google_link ) || ( 'page_only' == $google_link ) ) { $button_class = empty( $html_fallback_url ) ? ' av_text_confirm_link_visible' : ''; $text_overlay = ''; if( 'confirm_link' == $google_link ) { $html_overlay = ''; $text_overlay = esc_html( $confirm_button ); } else { if( empty( $street_address ) ) { $adress1 = $lat; $adress2 = $lng; } else { $adress1 = $street_address . ' ' . $postcode . ' ' . $city . ' ' . $state . ' ' . $country; $adress2 = ''; } $url = av_google_maps::api_destination_url( $adress1, $adress2 ); $html_overlay = avia_targeted_link_rel( '' ); $text_overlay = esc_html( $page_link_text ); } $html_overlay .= '' . $text_overlay . ''; /** * @since 4.4.2 * @param string output string * @param object context * @param array * @param array */ $filter_args = array( $html_overlay, $this, $args, $instance ); $html_overlay = apply_filters_ref_array( 'avf_google_maps_confirm_overlay', $filter_args ); } $map_id = ''; if( 'page_only' != $google_link ) { /** * Add map data to js */ $content = htmlspecialchars( $content, ENT_QUOTES ); $content = str_replace( '<', '<', $content ); $content = str_replace( '>', '>', $content ); $content = str_replace( '"', '"', $content ); $content = str_replace( ''', '"', $content ); // $content = json_encode( $content ); $content = wpautop( $content ); $data = array( 'hue' => '', 'zoom' => $zoom, 'saturation' => '', 'zoom_control' => true, // 'pan_control' => true, not needed in > 4.3.2 'streetview_control' => false, 'mobile_drag_control' => true, 'maptype_control' => 'dropdown', 'maptype_id' => $type ); $data['marker'] = array(); $data['marker'][0] = array( 'address' => $postcode . ' ' . $street_address, 'city' => $city, 'country' => $country, 'state' => $state, 'long' => $lng, 'lat' => $lat, 'icon' => $icon, 'imagesize' => 40, 'content' => $content, ); /** * Does not work since 4.4 */ if( ! empty( $directionsto ) ) { $data['marker'][0]['directionsto'] = $directionsto; } $add = empty( $google_link ) ? 'unconditionally' : 'delayed'; /** * Allow to filter Google Maps data array * * @since 4.4 * @param array $data * @param string context * @param object * @param array additional args * @return array */ $data = apply_filters( 'avf_google_maps_data', $data, __CLASS__, $this, array( $args, $instance ) ); $map_id = Av_Google_Maps()->add_map( $data, $add ); } switch( $google_link ) { case 'confirm_link': $show_class = 'av_gmaps_show_delayed'; break; case 'page_only': $show_class = 'av_gmaps_show_page_only'; break; case '': default: $show_class = 'av_gmaps_show_unconditionally'; break; } if( empty( $html_fallback_url ) ) { $show_class .= ' av-no-fallback-img'; } $style = ''; // $this->define_height($height) if( ! empty( $height ) ) { $height = str_replace( ';', '', $height ); $style .= " height: {$height};"; } if( ! empty( $width ) ) { $width = str_replace( ';', '', $width ); $style .= " width: {$width};"; } if( ! empty( $html_fallback_url ) ) { $html_fallback_url = str_replace( ';', '', $html_fallback_url ); $style .= " {$html_fallback_url};"; } if( ! empty( $style ) ) { $style = "style='{$style}'"; } echo '
    '; if( empty( $map_id ) ) { echo "
    "; } else { echo "
    "; } echo $html_overlay; echo '
    '; echo '
    '; echo $after_widget; } /** * Process widget options to be saved * * @param array $new_instance * @param array $old_instance * @return array */ public function update( $new_instance, $old_instance ) { $instance = $this->parse_args_instance( $old_instance ); $fields = $this->get_field_names(); foreach( $new_instance as $key => $value ) { if( in_array( $key, $fields ) ) { $instance[ $key ] = strip_tags( $value ); } } return $instance; } /** * output the options form on admin * * @param array $instance */ public function form( $instance ) { $instance = $this->parse_args_instance( $instance ); $fields = $this->get_field_names(); foreach( $instance as $key => $value ) { if( in_array( $key, $fields ) ) { $instance[ $key ] = esc_attr( $value ); } } extract( $instance ); $street_address = $instance['street-address']; $html = new avia_htmlhelper(); $marker_icon_element = array( 'name' => __( 'Custom Marker Icon', 'avia_framework' ), 'desc' => __( 'Upload a custom marker icon or enter the URL', 'avia_framework' ), 'id' => $this->get_field_id( 'icon'), 'id_name' => $this->get_field_name( 'icon' ), 'std' => $icon, 'type' => 'upload', 'label' => __('Use image as custom marker icon', 'avia_framework') ); $fallback_element = array( 'name' => __( 'Fallback image to replace Google Maps', 'avia_framework' ), 'desc' => __( 'Upload a fallback image or enter the URL to an image to replace Google Maps or until Google Maps is loaded', 'avia_framework' ), 'id' => $this->get_field_id( 'google_fallback'), 'id_name' => $this->get_field_name( 'google_fallback' ), 'std' => $google_fallback, 'type' => 'upload', 'label' => __('Use image as Google Maps fallback image', 'avia_framework') ); ?>

    render_single_element( $marker_icon_element );?>

    render_single_element( $fallback_element );?>
    is_loading_prohibited() ) { echo '

    ' . __( 'This element is disabled in frontend with theme option', 'avia_framework' ) . '

    '; } ?>
    __( "Too many requests at once, please refresh the page to complete geocoding", 'avia_framework' ), 'latitude' => __( "Latitude and longitude for", 'avia_framework' ), 'notfound' => __( "couldn't be found by Google, please add them manually", 'avia_framework' ), 'insertaddress' => __( "Please insert a valid address in the fields above", 'avia_framework' ) ); if( $load_google_map_api ) { wp_localize_script( 'avia-google-maps-api', 'AviaMapTranslation', $args ); } } } /** * Returns the js script * * @param string $lat * @param string $lng * @param string $zoom * @param string $type * @param string $content * @param string $directionsto * @param string $width * @param string $height * @param string $icon * @return string * * @deprecated since version 4.4 no longer needed */ protected function print_map( $lat, $lng, $zoom, $type, $content, $directionsto, $width, $height, $icon ) { global $avia_config; _deprecated_function( 'print_map', '4.4', 'see class av_google_maps' ); $output = ""; $unique = uniqid(); $prefix = isset($_SERVER['HTTPS'] ) ? "https" : "http"; $width = ! empty( $width ) ? 'width:'.$width.';' : 'width:100%;'; $height = ! empty( $height ) ? 'height:'.$height.';' : ''; $content = htmlspecialchars( $content, ENT_QUOTES ); $content = str_replace( '<', '<', $content ); $content = str_replace( '>', '>', $content ); $content = str_replace( '"', '"', $content ); $content = str_replace( ''', '"', $content ); $content = json_encode( $content ); $directionsForm = ""; if( empty( $avia_config['g_maps_widget_active'] ) ) { $avia_config['g_maps_widget_active'] = 0; } if( apply_filters( 'avia_google_maps_widget_load_api', true, $avia_config[ 'g_maps_widget_active'] ) ) { $api_key = avia_get_option('gmap_api'); $api_url = av_google_maps::api_url( $api_key ); wp_register_script( 'avia-google-maps-api', $api_url, array( 'jquery' ), null, true ); wp_enqueue_script( 'avia-google-maps-api' ); } $avia_config['g_maps_widget_active'] ++; $output .= "
    "; return $output; } } // SGMwidget widget } if( ! class_exists('avia_instagram_widget') ) { /** * Extended and improved version. * Adds a background caching of images on own server to avoid to access instagram to display the images * * @since 4.3.1 * @by Günter */ class avia_instagram_widget extends Avia_Widget { /** * * @since 4.3.1 * @var array */ protected $upload_folders; /** * Stores the expire time for cached images in seconds. * Do not make intervall too short to avoid unnecessary requests. * Also make it large enough to allow a complete update of all instances in that period. * * @since 4.3.1 * @var int */ protected $expire_time; /** * * @since 4.3.1 * @var boolean */ protected $activate_cron; /** * Holds all caching info for each widget instance. * * @since 4.3.1 * @var array */ protected $cache; /** * * @since 4.3.1 * @var array */ protected $cached_file_sizes; /** * */ public function __construct() { parent::__construct( 'avia-instagram-feed', THEMENAME ." ". __( 'Instagram', 'avia_framework' ), array( 'classname' => 'avia-instagram-feed', 'description' => __( 'Displays your latest Instagram photos', 'avia_framework' ) ) ); $this->upload_folders = wp_upload_dir(); if( is_ssl() ) { $this->upload_folders['baseurl'] = str_replace( 'http://', 'https://', $this->upload_folders['baseurl'] ); } $folder = apply_filters( 'avf_instagram_cache_folder_name', 'avia_instagram_cache' ); $this->upload_folders['instagram_dir'] = trailingslashit( trailingslashit( $this->upload_folders['basedir'] ) . $folder ); $this->upload_folders['instagram_url'] = trailingslashit( trailingslashit( $this->upload_folders['baseurl'] ) . $folder ); $this->expire_time = HOUR_IN_SECONDS * 2; $this->expire_time = apply_filters_deprecated( 'null_instagram_cache_time', array( $this->expire_time ), '4.3.1', 'avf_instagram_file_cache_time', __( 'Adding possible file caching on server might need a longer period of time to invalidate cache.', 'avia_framework' ) ); $this->expire_time = apply_filters( 'avf_instagram_file_cache_time', $this->expire_time ); $this->activate_cron = ! ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ); $this->activate_cron = apply_filters( 'avf_instagram_activate_cron', $this->activate_cron ); $this->cache = $this->get_cache(); $this->cached_file_sizes = array( 'thumbnail', 'small', 'large', 'original' ); /** * WP Cron job events */ if( $this->activate_cron ) { add_action( 'av_instagram_scheduled_filecheck', array( $this, 'handler_scheduled_filecheck' ), 10 ); } /** * Makes sure to keep cron job alive as fallback */ if( is_admin() ) { add_action( 'admin_init', array( $this, 'handler_init_filecheck' ), 99999 ); add_action( 'delete_widget', array( $this, 'handler_delete_widget' ), 10, 3 ); } else { add_action( 'init', array( $this, 'handler_init_filecheck' ), 99999 ); } } /** * * @since 4.3.1 */ public function __destruct() { parent::__destruct(); unset( $this->upload_folders ); unset( $this->cache ); unset( $this->cached_file_sizes ); } /** * Returns the cache info array * * @since 4.3.1 * @return array */ public function get_cache() { if( is_null( $this->cache ) ) { $cache = get_option( 'avia_instagram_widgets_cache', '' ); /** * backwards comp only */ if( is_array( $cache ) ) { $this->cache = $cache; } else if( ! is_string( $cache ) || empty( $cache ) ) { $this->cache = null; } else { $cache = json_decode( $cache, true ); $this->cache = is_array( $cache ) ? $cache : null; } if( empty( $this->cache ) ) { $this->cache = array( 'last_updated' => 0, // time() when last complete check has run 'instances' => array() ); } } return $this->cache; } /** * Update the cache array in DB * * @since 4.3.1 * @param array|null $cache */ public function update_cache( array $cache = null ) { if( ! is_null( $cache) ) { $this->cache = $cache; } $save = json_encode( $this->cache ); update_option( 'avia_instagram_widgets_cache', $save ); } /** * Ensure a valid instance array filled with defaults * * @since 4.3.1 * @param array $instance * @return array */ protected function parse_args_instance( array $instance ) { $instance = wp_parse_args( $instance, array( 'title' => __( 'Instagram', 'avia_framework' ), 'username' => '', 'cache' => apply_filters( 'avf_instagram_default_cache_location', '' ), // '' | 'server' 'number' => 9, 'columns' => 3, 'size' => 'thumbnail', 'target' => 'lightbox' , 'link' => __( 'Follow Me!', 'avia_framework' ), 'avia_key' => '' ) ); return $instance; } /** * Ensure a valid instance array filled with defaults * * @since 4.3.1 * @param array $instance_cache * @return array */ protected function parse_args_instance_cache( array $instance_cache ) { $instance_cache = wp_parse_args( (array) $instance_cache, array( 'upload_folder' => '', // not the complete path, only the last folder name 'path_error' => '', // Error message if upload_folder could not be created 'instagram_error' => '', 'upload_errors' => false, // number of errors found when caching files to show 'last_update' => 0, // time() of last update 'cached_list' => array(), // in the order how to display the files and file info on server 'instagram_list' => array() // returned info from instagramm )); return $instance_cache; } /** * Creates a unique key for the given instance for our cache array * * @since 4.3.1 * @param array $instance * @param string $id_widget * @return string */ protected function create_avia_key( array $instance, $id_widget ) { $k = 0; $key = str_replace( $this->id_base . '-', '', $id_widget ) . '-' . AviaHelper::save_string( $instance['title'], '-' ); $orig_key = $key; while( array_key_exists( $key, $this->cache['instances'] ) ) { $key = $orig_key . "-{$k}"; $k++; } return $key; } /** * Output the widget in frontend * * @param array $args * @param array $instance */ public function widget( $args, $instance ) { $instance = $this->parse_args_instance( $instance ); $fields = $this->get_field_names(); foreach( $instance as $key => $value ) { if( in_array( $key, $fields ) ) { $instance[ $key ] = esc_attr( $value ); } } extract( $args, EXTR_SKIP ); extract( $instance, EXTR_SKIP ); /** * Allow to change the conditional display setting - e.g. if user is opt in and allows to connect directly * * @since 4.4 * @param string $google_link '' | 'server' * @param string $context * @param mixed $object * @param array $args * @param array $instance * @return string */ $original_cache = $cache; $cache = apply_filters( 'avf_conditional_setting_external_links', $cache, __CLASS__, $this, $args, $instance ); if( ! in_array( $cache, array( '', 'server' ) ) ) { $cache = $original_cache; } $title = apply_filters( 'widget_title', $title, $args ); /** * Skip for non logged in users in frontend */ if( ( trim( $username ) == '' ) && ! is_user_logged_in() && ! current_user_can( 'edit_posts' ) ) { return; } echo $before_widget; if ( ! empty( $title ) ) { echo $before_title . $title . $after_title; } do_action( 'aviw_before_widget', $instance ); if( $username != '' ) { $errors = array(); $media_array = array(); $instance_cache = isset( $this->cache['instances'][ $instance['avia_key'] ] ) ? $this->cache['instances'][ $instance['avia_key'] ] : null; if( ! is_null( $instance_cache ) ) { if( ! empty( $instance_cache['instagram_error'] ) ) { $errors = array( $instance_cache['instagram_error'] ); } if( ! empty( $instance_cache['upload_errors'] ) && ( 'server' == $instance['cache'] ) ) { foreach( $instance_cache['cached_list'] as $img ) { if( ! empty( $img['errors'] ) ) { $errors = array_merge( $errors, $img['errors'] ); } } } if( 'server' == $instance['cache'] ) { $media_array = $instance_cache['cached_list']; $url = trailingslashit( trailingslashit( $this->upload_folders['instagram_url'] ) . $instance_cache['upload_folder'] ); foreach( $media_array as $key => $media ) { if( ! empty( $media['errors'] ) ) { $errors = array_merge( $errors, $media['errors'] ); } if( ! empty( $media[ $size ] ) ) { $media_array[ $key ][ $size ] = $url . $media[ $size ]; } if( ! empty( $media[ 'original' ] ) ) { $media_array[ $key ]['original'] = $url . $media['original']; } } } else { $media_array = $instance_cache['instagram_list']; } } /** * Only show error messages to admins and authors */ if( ! empty( $errors ) && is_user_logged_in() && current_user_can( 'edit_posts' ) ) { $errors = array_map( 'esc_html__', $errors ); $out = ''; $out .= '
    '; $out .= '

    ' . esc_html__( 'Only visible for admins:', 'avia_framework' ) . '

    '; $out .= '

    '; $out .= implode( '
    ', $errors ); $out .= '

    '; $out .= '
    '; echo $out; } if( count( $media_array ) > 0 ) { // filters for custom classes $ulclass = esc_attr( apply_filters( 'aviw_list_class', 'av-instagram-pics av-instagram-size-' . $size ) ); $rowclass = esc_attr( apply_filters( 'aviw_row_class', 'av-instagram-row' ) ); $liclass = esc_attr( apply_filters( 'aviw_item_class', 'av-instagram-item' ) ); $aclass = esc_attr( apply_filters( 'aviw_a_class', '' ) ); $imgclass = esc_attr( apply_filters( 'aviw_img_class', '' ) ); ?>
    "; } $rowcount ++; $itemcount ++; $targeting = $target; if( $target == "lightbox" ) { $targeting = ""; $item['link'] = ! empty( $item['original'] ) ? $item['original'] : $item[ $size ]; } echo '
    '; echo ''; echo '
    '; if( $rowcount % $columns == 0 || $last_id == $item['id'] || ( $itemcount >= $number ) ) { echo '
    '; $rowcount = 0; if( $itemcount >= $number ) { break; } } } echo '
    '; } else { echo '

    ' . esc_html__( 'No images available at the moment', 'avia_framework' ) . '

    '; } } else { echo '

    ' . esc_html__( 'For admins only: Missing intagram user name !!', 'avia_framework' ) . '

    '; } if ( $link != '' ) { ?> parse_args_instance( $instance ); $fields = $this->get_field_names(); foreach( $instance as $key => $value ) { if( in_array( $key, $fields ) ) { switch( $key ) { case 'number': case 'columns': $instance[ $key ] = absint( $value ); break; default: $instance[ $key ] = esc_attr( $value ); break; } } } extract( $instance ); ?>

    activate_cron ) { echo '

    '; echo __( 'WP Cron jobs are disabled. To assure a regular update of cached data and an optimal pageload in frontend and backend we recommend to activate this.', 'avia_framework' ); echo '

    '; $timestamp = ( $this->cache['last_updated'] != 0 ) ? $this->cache['last_updated'] + $this->expire_time : false; $time = ( false !== $timestamp ) ? date( 'Y/m/d H:i a', $timestamp ) . __( ' UTC', 'avia_framework' ) : __( 'No time available', 'avia_framework' ); echo '

    '; echo __( 'The widget preloads and caches Instagram data for better performance.', 'avia_framework' )." "; echo sprintf( __( 'Next update: %s', 'avia_framework' ), $time ); echo '

    '; } else { $timestamp = wp_next_scheduled( 'av_instagram_scheduled_filecheck' ); $time = ( false !== $timestamp ) ? date( "Y/m/d H:i", $timestamp ) . __( ' UTC', 'avia_framework' ) : __( 'No time available', 'avia_framework' ); echo '

    '; echo __( 'The widget preloads and caches Instagram data for better performance.', 'avia_framework' )." "; echo sprintf( __( 'Next update: %s', 'avia_framework' ), $time ); echo '

    '; } if( empty( $instance['avia_key'] ) ) { return; } if( empty( $this->cache['instances'][ $instance['avia_key'] ] ) ) { return; } $instance_cache = $this->cache['instances'][ $instance['avia_key'] ]; $errors = array(); if( ! empty( $instance_cache['instagram_error'] ) ) { $errors = (array) $instance_cache['instagram_error']; } if( 'server' == $instance['cache'] ) { foreach( $instance_cache['cached_list'] as $image ) { if( ! empty( $image['errors'] ) ) { $errors = array_merge( $errors, $image['errors'] ); } } } if( ! empty( $errors ) ) { $errors = array_map( 'esc_html__', $errors ); $out = '
    '; $out .= '

    ' . esc_html__( 'Errors found:', 'avia_framework' ) . '

    '; $out .= '

    '; $out .= implode( '
    ', $errors ); $out .= '

    '; $out .= '
    '; echo $out; } } /** * Update the form data * * @param array $new_instance * @param array $old_instance * @return array */ public function update( $new_instance, $old_instance ) { $instance = $this->parse_args_instance( $old_instance ); $instance['title'] = strip_tags( $new_instance['title'] ); $instance['username'] = trim( strip_tags( $new_instance['username'] ) ); $instance['cache'] = ( $new_instance['cache'] == 'server' || $new_instance['cache'] == '' ) ? $new_instance['cache'] : apply_filters( 'avf_instagram_default_cache_location', 'server' ); $instance['number'] = ! absint( $new_instance['number'] ) ? 9 : $new_instance['number']; $instance['columns'] = ! absint( $new_instance['columns'] ) ? 3 : $new_instance['columns']; $instance['size'] = ( $new_instance['size'] == 'thumbnail' || $new_instance['size'] == 'large' || $new_instance['size'] == 'small' || $new_instance['size'] == 'original' ) ? $new_instance['size'] : 'large'; $instance['target'] = ( $new_instance['target'] == '_self' || $new_instance['target'] == '_blank'|| $new_instance['target'] == 'lightbox' ) ? $new_instance['target'] : '_self'; $instance['link'] = strip_tags( $new_instance['link'] ); /** * We have a new widget (or an existing from an older theme version) */ if( empty( $instance['avia_key'] ) ) { $key = $this->create_avia_key( $instance, $this->id ); $instance['avia_key'] = $key; $this->cache['instances'][ $key ] = array(); $this->update_cache(); } $this->update_single_instance( $instance, $this->id ); if( $this->activate_cron ) { $this->restart_cron_job(); } return $instance; } /** * Get info from instagram * based on https://gist.github.com/cosmocatalano/4544576 * * @param string $username * * @return array|\WP_Error */ protected function scrape_instagram( $username ) { $username = strtolower( $username ); $username = str_replace( '@', '', $username ); $remote = wp_remote_get( 'https://www.instagram.com/' . trim( $username ), array( 'sslverify' => false, 'timeout' => 60 ) ); if ( is_wp_error( $remote ) ) { return new WP_Error( 'site_down', __( 'Unable to communicate with Instagram.', 'avia_framework' ) ); } $code = wp_remote_retrieve_response_code( $remote ); if ( 200 != $code ) { $msg = wp_remote_retrieve_response_message( $remote ); if( empty( $msg ) ) { $msg = __( 'Unknown error code', 'avia_framework' ); } return new WP_Error( 'invalid_response', sprintf( __( 'Instagram returned error %d (= %s).', 'avia_framework' ), $code, $msg ) ); } $shards = explode( 'window._sharedData = ', $remote['body'] ); $insta_json = explode( ';', $shards[1] ); $insta_array = json_decode( $insta_json[0], true ); if ( ! $insta_array ) { return new WP_Error( 'bad_json', __( 'Instagram has returned invalid data.', 'avia_framework' ) ); } if ( isset( $insta_array['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['edges'] ) ) { $images = $insta_array['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['edges']; } else { return new WP_Error( 'bad_json_2', __( 'Instagram has returned invalid data.', 'avia_framework' ) ); } if ( ! is_array( $images ) ) { return new WP_Error( 'bad_array', __( 'Instagram has returned invalid data.', 'avia_framework' ) ); } $instagram = array(); foreach ( $images as $image ) { // see https://github.com/stevenschobert/instafeed.js/issues/549 if ( $image['node']['is_video'] == true ) { $type = 'video'; } else { $type = 'image'; } $caption = __( 'Instagram Image', 'avia_framework' ); if ( ! empty( $image['node']['edge_media_to_caption']['edges'][0]['node']['text'] ) ) { $caption = wp_kses( $image['node']['edge_media_to_caption']['edges'][0]['node']['text'], array() ); } $instagram[] = array( 'description' => $caption, 'link' => trailingslashit( '//instagram.com/p/' . $image['node']['shortcode'] ), 'time' => $image['node']['taken_at_timestamp'], 'comments' => $image['node']['edge_media_to_comment']['count'], 'likes' => $image['node']['edge_liked_by']['count'], 'thumbnail' => preg_replace( '/^https?\:/i', '', $image['node']['thumbnail_resources'][0]['src'] ), 'small' => preg_replace( '/^https?\:/i', '', $image['node']['thumbnail_resources'][2]['src'] ), 'large' => preg_replace( '/^https?\:/i', '', $image['node']['thumbnail_resources'][4]['src'] ), 'original' => preg_replace( '/^https?\:/i', '', $image['node']['display_url'] ), 'type' => $type, 'id' => $image['node']['id'] ); } $aviw_images_only = false; $aviw_images_only = apply_filters_deprecated( 'aviw_images_only', array( $aviw_images_only ), '4.3.1', 'avf_instagram_filter_files', __( 'Filter extended to filter images or videos', 'avia_framework' ) ); /** * Filter which type of elements will be displayed. * Return an empty array to show all files. * * Possible values: 'video' | 'image' * * @since 4.3.1 * @return array */ $show = $aviw_images_only ? array( 'image' ) : array(); $show = apply_filters( 'avf_instagram_filter_files', $show, $username ); if( ! empty( $show ) ) { foreach( $instagram as $key => $media_item ) { if( ! in_array( $media_item['type'], $show ) ) { unset( $instagram[ $key ] ); } } $instagram = array_merge( $instagram ); } if ( empty( $instagram ) ) { return new WP_Error( 'no_images', __( 'Instagram did not return any images.', 'avia_framework' ) ); } return $instagram; } /** * WP Cron handler for background uploads * * @since 4.3.1 */ public function handler_scheduled_filecheck() { if( defined( 'WP_DEBUG ') && WP_DEBUG ) { error_log( '****************** In avia_instagram_widget::handler_scheduled_filecheck started' ); } /** * Create a scheduled event to prevent double checks running on parallel pageloads */ $this->schedule_cron_job( $this->expire_time * 2 ); $settings = $this->get_settings(); if( ! empty( $settings ) ) { $this->check_all_instances(); } $this->schedule_cron_job( $this->expire_time * 2 ); $this->sync_data(); $this->schedule_cron_job( $this->expire_time ); if( defined( 'WP_DEBUG ') && WP_DEBUG ) { error_log( '****************** In avia_instagram_widget::handler_scheduled_filecheck ended' ); } } /** * Synchronises directory and cache data structure. * It might happen, that the update cronjob is running and user removes the last widget. * This leads to an inconsistent cache and directory structure. * * As user might have added new widgets again we have to sync cache with latest settings * * @since 4.3.1 */ public function sync_data() { if( defined( 'WP_DEBUG ') && WP_DEBUG ) { error_log( '****************** In avia_instagram_widget::sync_data started' ); } $settings = $this->get_settings(); if( empty( $settings ) && empty( $this->cache['instances'] ) ) { if( is_dir( $this->upload_folders['instagram_dir'] ) ) { avia_backend_delete_folder( $this->upload_folders['instagram_dir'] ); $this->cache['last_updated'] = time(); $this->update_cache(); } return; } $instance_infos = (array) $this->cache['instances']; /** * Remove all entries from cache that have no more entry in settings */ $keys = array_keys( $instance_infos ); $keys_to_keep = array(); foreach ( $settings as $index => $setting ) { if( in_array( $setting['avia_key'], $keys ) ) { $keys_to_keep[] = $setting['avia_key']; } } $keys_to_remove = array_diff( $keys, $keys_to_keep ); foreach( $keys_to_remove as $key ) { $folder = $this->upload_folders['instagram_dir'] . $instance_infos[ $key ]['upload_folder']; avia_backend_delete_folder( $folder ); unset( $this->cache['instances'][ $key ] ); } /** * Now we check that all directories belong to a cache entry */ $cache_dirs = is_dir( $this->upload_folders['instagram_dir'] ) ? scandir( $this->upload_folders['instagram_dir'] ) : false; if( ! is_array( $cache_dirs ) ) { /** * Something went wrong reading directory - folder does not exist, access denied, ..... * There is nothing we can do. */ return; } $cache_dirs = array_diff( $cache_dirs, array( '.', '..' ) ); $ref_dirs = array(); foreach( $this->cache['instances'] as $key => $instance_info ) { if( isset( $instance_info['upload_folder'] ) ) { $ref_dirs[] = $instance_info['upload_folder']; } } $remove_dirs = array_diff( $cache_dirs, $ref_dirs ); foreach( $remove_dirs as $remove_dir ) { avia_backend_delete_folder( $this->upload_folders['instagram_dir'] . $remove_dir ); } if( empty( $this->cache['instances'] ) ) { avia_backend_delete_folder( $this->upload_folders['instagram_dir'] ); } $this->cache['last_updated'] = time(); $this->update_cache(); } /** * WP Cron is disabled - we have to load files during pageload in admin area * * @since 4.3.1 */ public function handler_init_filecheck() { $settings = $this->get_settings(); if( empty( $settings ) ) { /** * Keep alive to allow to clean up in case when deleting a widget and check_all_instances() have run at same time. * Due to internal WP caching this might have lead to inconsistent data structure. */ if( $this->activate_cron ) { $this->restart_cron_job(); } return; } /** * Fallback on version update - we need to switch to new data structure * Can be removed in very very future versions. * * @since 4.3.1 */ $instance = array_shift( $settings ); if( ! isset( $instance['avia_key'] ) || empty( $instance['avia_key'] ) ) { $instances = $this->get_settings(); foreach( $instances as $key => &$instance ) { $key = $this->create_avia_key( $instance, $this->id_base . "-{$key}" ); $instance['avia_key'] = $key; $this->cache['instances'][ $key ] = array(); } unset( $instance ); $this->save_settings( $instances ); $this->cache['last_updated'] = 0; $this->update_cache(); $this->check_all_instances(); } if( $this->activate_cron ) { $this->restart_cron_job(); return; } /** * Check if we need to run an update */ if( $this->cache['last_updated'] + $this->expire_time > time() ) { return; } /** * Only run update in backend */ if( is_admin() ) { $this->check_all_instances(); } } /** * Is called, when an instance of a widget is deleted - Both from active sidebars or inactive widget area. * * @since 4.3.1 * @param string $widget_id * @param string $sidebar_id * @param string $id_base */ public function handler_delete_widget( $widget_id, $sidebar_id, $id_base ) { $id = str_replace( $id_base . '-', '', $widget_id ); $settings = $this->get_settings(); if( empty( $settings ) || empty( $settings[ $id ] ) ) { return; } $instance = $settings[ $id ]; $instance_info = isset( $this->cache['instances'][ $instance['avia_key'] ] ) ? $this->cache['instances'][ $instance['avia_key'] ] : array(); if( empty( $instance_info ) ) { return; } $instance = $this->parse_args_instance( $instance ); $instance_info = $this->parse_args_instance_cache( $instance_info ); if( count( $settings ) <= 1 ) { avia_backend_delete_folder( $this->upload_folders['instagram_dir'] ); $this->cache['instances'] = array(); } else { $folder = $this->upload_folders['instagram_dir'] . $instance_info['upload_folder']; avia_backend_delete_folder( $folder ); unset( $this->cache['instances'][ $instance['avia_key'] ] ); } $this->update_cache(); } /** * This is a fallback function to ensure that the cron job is running * * @since 4.3.1 */ protected function restart_cron_job() { $timestamp = wp_next_scheduled( 'av_instagram_scheduled_filecheck' ); if( false === $timestamp ) { $this->schedule_cron_job( $this->expire_time ); return; } /** * This is a fallback to prevent a blocking of updates */ if( $timestamp > ( time() + $this->expire_time * 2 ) ) { $this->schedule_cron_job( $this->expire_time * 2 ); } } /** * Removes an existing cron job and creates a new one * * @since 4.3.1 * @param int $delay_seconds * @return boolean */ protected function schedule_cron_job( $delay_seconds = 0 ) { $timestamp = wp_next_scheduled( 'av_instagram_scheduled_filecheck' ); if( false !== $timestamp ) { wp_unschedule_hook( 'av_instagram_scheduled_filecheck' ); } $timestamp = time() + $delay_seconds; $scheduled = wp_schedule_single_event( $timestamp, 'av_instagram_scheduled_filecheck' ); return false !== $scheduled; } /** * Scan all instances of this widget and update cache data * * @since 4.3.1 */ protected function check_all_instances() { $settings = $this->get_settings(); foreach ( $settings as $key => $instance ) { $id_widget = $this->id_base . "-{$key}"; if( false === is_active_widget( false, $id_widget, $this->id_base, false ) ) { continue; } $this->update_single_instance( $instance, $id_widget ); } $this->cache['last_updated'] = time(); $this->update_cache(); } /** * Updates the cache for the given instance. * As a fallback for older versions the instance is updated and returned. * * @since 4.3.1 * @param array $instance * @param string $id_widget * @return array */ protected function update_single_instance( array $instance, $id_widget ) { set_time_limit( 0 ); $instance = $this->parse_args_instance( $instance ); /** * Fallback for old versions - update to new datastructure */ if( empty( $instance['avia_key'] ) ) { $key = $this->create_avia_key( $instance, $id_widget ); $instance['avia_key'] = $key; $this->cache['instances'][ $key ] = array(); } $instance_cache = isset( $this->cache['instances'][ $instance['avia_key'] ] ) ? $this->cache['instances'][ $instance['avia_key'] ] : array(); $instance_cache = $this->parse_args_instance_cache( $instance_cache ); /** * Create upload directory if not exist. Upload directory will be deleted when widget instance is removed. */ if( ( 'server' == $instance['cache'] ) && empty( $instance_cache['upload_folder'] ) && ! empty( $instance['username'] ) ) { $id = str_replace( $this->id_base . '-', '', $id_widget ); $f = empty( $instance['title'] ) ? $instance['username'] : $instance['title']; $folder_name = substr( AviaHelper::save_string( $id . '-' . $f, '-' ), 0, 30 ); $folder = $this->upload_folders['instagram_dir'] . $folder_name; $created = avia_backend_create_folder( $folder, false, 'unique' ); if( $created ) { $split = pathinfo( $folder ); $instance_cache['upload_folder'] = $split['filename']; $instance_cache['path_error'] = ''; $instance_cache['cached_list'] = array(); } else { $instance_cache['path_error'] = sprintf( __( 'Unable to create cache folder "%s". Files will be loaded directly from instagram', 'avia_framework' ), $folder ); } } $username = $instance['username']; $number = $instance['number']; if( ! empty( $username) ) { $media_array = $this->scrape_instagram( $username ); if ( ! is_wp_error( $media_array ) ) { $instance_cache['instagram_error'] = ''; $instance_cache['instagram_list'] = array_slice( $media_array, 0, $number ); if( 'server' == $instance['cache'] ) { $instance_cache = $this->cache_files_in_upload_directory( $media_array, $instance, $instance_cache ); } } else { /** * We only store error message but keep existing files for fallback so we do not break widget */ $instance_cache['instagram_error'] = $media_array->get_error_message(); } } else { $instance_cache['instagram_error'] = __( 'You need to specify an Instagram username.', 'avia_framework' ); $instance_cache['instagram_list'] = array(); $instance_cache['cached_list'] = array(); } $instance_cache['last_update'] = time(); $this->cache['instances'][ $instance['avia_key'] ] = $instance_cache; $this->update_cache(); return $instance; } /** * Updates the local stored files in upload directory * Already downloaded files are not updated. * If an error occurs, we try to download more files as fallback to provide requested number of files * in frontend. * * No longer needed files are removed from cache. * * @since 4.3.1 * @param array $instagram_files * @param array $instance * @param array $instance_cache * @return array */ protected function cache_files_in_upload_directory( array $instagram_files, array $instance, array $instance_cache ) { set_time_limit( 0 ); $cached_files = $instance_cache['cached_list']; $new_cached_files = array(); $no_errors = 0; foreach( $instagram_files as $instagram_file ) { $id = $instagram_file['id']; $found = false; foreach( $cached_files as $key_cache => $cached_file ) { if( $id == $cached_file['id'] ) { /** * If an error occurred in a previous file load we try to reload all files again */ if( ! empty( $cached_file['errors'] ) ) { $this->remove_single_cached_files( $cached_file, $instance_cache ); unset( $cached_files[ $key_cache ] ); break; } /** * As a fallback (or if other sizes were added later) we check if the cached files exist */ $path = trailingslashit( $this->upload_folders['instagram_dir'] . $instance_cache['upload_folder'] ); foreach( $this->cached_file_sizes as $size ) { if( empty( $cached_file[ $size ] ) || ! file_exists( $path . $cached_file[ $size ] ) ) { $this->remove_single_cached_files( $cached_file, $instance_cache ); unset( $cached_files[ $key_cache ] ); break; } } if( ! isset( $cached_files[ $key_cache ] ) ) { break; } $ncf = $cached_file; $ncf['description'] = $instagram_file['description']; $ncf['link'] = $instagram_file['link']; $ncf['time'] = $instagram_file['time']; $ncf['comments'] = $instagram_file['comments']; $ncf['likes'] = $instagram_file['likes']; $ncf['type'] = $instagram_file['type']; $new_cached_files[] = $ncf; unset( $cached_files[ $key_cache ] ); $found = true; break; } } if( ! $found ) { $new_cached_files[] = $this->download_from_instagram( $instagram_file, $instance, $instance_cache ); } $last = $new_cached_files[ count( $new_cached_files ) - 1 ]; /** * Check if we could cache the file in requested size - we might have got a warning from chmod */ if( empty( $last['errors'] ) || ! empty( $last[ $instance['size'] ] ) ) { $no_errors++; } /** * Also break if we get too many errors */ if( $no_errors >= $instance['number'] || count( $new_cached_files ) > ( $instance['number'] * 2 ) ) { break; } } /** * Now we add all remaining cached files to fill up requested number of files */ if( $no_errors < $instance['number'] ) { foreach( $cached_files as $key_cache => $cached_file ) { $new_cached_files[] = $cached_file; if( empty( $cached_file['errors'] ) ) { $no_errors++; } unset( $cached_files[ $key_cache ] ); if( $no_errors >= $instance['number'] ) { break; } } } /** * Now we delete no longer needed files */ foreach( $cached_files as $key_cache => $cached_file ) { $this->remove_single_cached_files( $cached_file, $instance_cache ); unset( $cached_files[ $key_cache ] ); } /** * Save results and count errors */ $err_cnt = 0; $count = 1; foreach( $new_cached_files as $new_file ) { if( ! empty( $new_file['errors'] ) ) { $err_cnt++; } $count++; if( $count > $instance['number'] ) { break; } } $instance_cache['upload_errors'] = ( 0 == $err_cnt ) ? false : $err_cnt; $instance_cache['cached_list'] = $new_cached_files; return $instance_cache; } /** * Downloads the files from instagram and stores them in local cache * * @since 4.3.1 * @param array $instagram_file * @param array $instance * @param array $instance_cache * @return array */ protected function download_from_instagram( array $instagram_file, array $instance, array $instance_cache ) { $new_cached_file = $instagram_file; $new_cached_file['errors'] = array(); $instagram_schema = 'https:'; $cache_path = trailingslashit( $this->upload_folders['instagram_dir'] . $instance_cache['upload_folder'] ); foreach( $this->cached_file_sizes as $size ) { $file_array = array(); // instagram returns link to file with ?...... $fn = explode( '?', basename( $instagram_file[ $size ] ) ); $file_array['name'] = $fn[0]; // Download file to temp location - include file if called from frontend. if( ! function_exists( 'download_url' ) ) { $s = trailingslashit( ABSPATH ) . 'wp-admin/includes/file.php'; require_once $s; } $file_array['tmp_name'] = download_url( $instagram_schema . $instagram_file[ $size ] ); // If error storing temporarily, return the error. if( is_wp_error( $file_array['tmp_name'] ) ) { $new_cached_file[ $size ] = ''; $new_cached_file['errors'] = array_merge( $new_cached_file['errors'], $file_array['tmp_name']->get_error_messages() ); continue; } $new_file_name = $size . '_' . $file_array['name']; $new_name = $cache_path . $new_file_name; $moved = avia_backend_rename_file( $file_array['tmp_name'], $new_name ); if( is_wp_error( $moved ) ) { $new_cached_file[ $size ] = ''; $new_cached_file['errors'] = array_merge( $new_cached_file['errors'], $moved->get_error_messages() ); continue; } /** * Try to change accessability of file */ if( ! chmod( $new_name, 0777 ) ) { $new_cached_file['errors'][] = sprintf( __( 'Could not change user rights of file %s to 777 - file might not be visible in frontend.', 'avia_framework' ), $new_name ); } $new_cached_file[ $size ] = $new_file_name; } return $new_cached_file; } /** * Removes all cashed files from $cached_file_info * * @since 4.3.1 * @param array $cached_file_info * @param array $instance_cache * @return array */ protected function remove_single_cached_files( array $cached_file_info, array $instance_cache ) { $cache_path = trailingslashit( $this->upload_folders['instagram_dir'] . $instance_cache['upload_folder'] ); foreach( $this->cached_file_sizes as $size ) { if( ! empty( $cached_file_info[ $size ] ) ) { $file = $cache_path . $cached_file_info[ $size ]; if( file_exists( $file ) ) { unlink( $file ); } $cached_file_info[ $size ] = ''; } } return $cached_file_info; } } } /** * AVIA TABLE OF CONTENTS WIDGET * * Widget that displays a 'table of contents' genereated from the headlines of the page it is viewed on * * @package AviaFramework * @author tinabillinger * @todo replace the widget system with a dynamic one, based on config files for easier widget creation */ if (!class_exists('avia_auto_toc')) { class avia_auto_toc extends WP_Widget { static $script_loaded = 0; function __construct() { //Constructor $widget_ops = array('classname' => 'avia_auto_toc', 'description' => __('Widget that displays a table of contents genereated from the headlines of the page it is viewed on', 'avia_framework') ); parent::__construct( 'avia_auto_toc', THEMENAME.' Table of Contents', $widget_ops ); } function widget($args, $instance) { extract($args, EXTR_SKIP); if ($instance['single_only'] && ! is_single()) return false; $title = empty($instance['title']) ? '' : apply_filters('widget_title', $instance['title']); $indent_class = $instance['indent'] ? ' avia-toc-indent' : ''; $smoothscroll_class = $instance['smoothscroll'] ? ' avia-toc-smoothscroll' : ''; echo $before_widget; if ( !empty( $title ) ) { echo $before_title . $title . $after_title; }; $exclude = ""; if ( $instance['exclude'] !== '' ){ $exclude = 'data-exclude="'.$instance['exclude'].'"'; } $instance['style'] = "elegant"; echo '
    '; echo $after_widget; } function update($new_instance, $old_instance) { $instance = $old_instance; $instance['title'] = trim(strip_tags($new_instance['title'])); $instance['exclude'] = strip_tags($new_instance['exclude']); $instance['style'] = strip_tags($new_instance['style']); $instance['level'] = implode(',',$new_instance['level']); $instance['single_only'] = isset( $new_instance['single_only'] ) ? 1 : 0; $instance['indent'] = isset( $new_instance['indent'] ) ? 1 : 0; $instance['smoothscroll'] = isset( $new_instance['smoothscroll'] ) ? 1 : 0; return $instance; } function form( $instance ) { $instance = wp_parse_args( (array) $instance, array( 'exclude' => '', 'level' => 'h1', 'title' => '', 'style' => 'simple', ) ); $title = sanitize_text_field( $instance['title'] ); $single_only = isset( $instance['single_only'] ) ? (bool) $instance['single_only'] : true; $indent = isset( $instance['indent'] ) ? (bool) $instance['indent'] : true; $smoothscroll = isset( $instance['smoothscroll'] ) ? (bool) $instance['smoothscroll'] : true; $levels = array( 'h1' => 'H1 Headlines', 'h2' => 'H2 Headlines', 'h3' => 'H3 Headlines', 'h4' => 'H4 Headlines', 'h5' => 'H5 Headlines', 'h6' => 'H6 Headlines' ); $styles = array( 'simple' => 'Simple', 'elegant' => 'Elegant', ); ?>

    Provice a classname without a dot

    />
    />
    />