nique( array_merge( $pages, array_keys( $avia->options ) ) ); $opt_key = $key; } // Scan all pages for option foreach( $pages as $page ) { if( isset( $avia->options[ $page ] ) && isset( $avia->options[ $page ][ $opt_key ] ) ) { $result = $avia->options[ $page ][ $opt_key ]; break; } } /** * !!!! Different behaviour as get_option(): * * Also return $default when options value is '' */ if( is_null( $result ) || ( '' == $result ) ) { $result = $default; } } if( $decode ) { $result = avia_deep_decode( $result ); } if( $echo ) { echo $result; } return $result; } } if( ! function_exists( 'avia_update_option' ) ) { /** * This function serves as shortcut to update a single theme option * * @param string $key * @param mixed $value */ function avia_update_option( $key, $value = '' ) { global $avia; $avia->options['avia'][ $key ] = $value; update_option( $avia->option_prefix , $avia->options ); } } if( ! function_exists( 'avia_delete_option' ) ) { /** * This function serves as shortcut to delete a single theme option * * @param string $key */ function avia_delete_option( $key ) { global $avia; unset( $avia->options['avia'][ $key ] ); update_option( $avia->option_prefix , $avia->options ); } } if( ! function_exists( 'avia_get_the_ID' ) ) { /** * This function is similiar to the wordpress function get_the_ID, but other than the wordpress function this functions takes into account * if we will display a different post later on, a post that differs from the one we queried in the first place. The function also holds this * original ID, even if another query is then executed (for example in dynamic templates for columns) * * an example would be the frontpage template were by default, the ID of the latest blog post is served by wordpress get_the_ID function. * avia_get_the_ID would return the same blog post ID if the blog is really displayed on the frontpage. if a static page is displayed the * function will display the ID of the static page, even if the page is not yet queried * * @return int $ID: the "real" ID of the post/page we are currently viewing */ function avia_get_the_ID() { global $avia_config; $ID = false; if(!isset($avia_config['real_ID'])) { if(!empty($avia_config['new_query']['page_id'])) { $ID = $avia_config['new_query']['page_id']; $avia_config['real_ID'] = $ID; } else { $post = get_post(); if(isset($post->ID)) { $ID = $post->ID; $avia_config['real_ID'] = $ID; } else { $ID = false; } //$ID = @get_the_ID(); } } else { $ID = $avia_config['real_ID']; } $ID = apply_filters('avf_avia_get_the_ID', $ID); return $ID; } add_action('wp_head', 'avia_get_the_ID'); } if(!function_exists('avia_is_overview')) { /** * This function checks if the page we are going to render is a page with a single entry or a multi entry page (blog or archive for example) * * @return bool $result true or false */ function avia_is_overview() { global $avia_config; $result = true; if (is_singular()) { $result = false; } if(is_front_page() && avia_get_option('frontpage') == avia_get_the_ID()) { $result = false; } if (isset($avia_config['avia_is_overview'])) { $result = $avia_config['avia_is_overview']; } return $result; } } if(!function_exists('avia_is_dynamic_template')) { /** * This function checks if the page we are going to render is using a dynamic template * * @return bool $result true or false */ function avia_is_dynamic_template($id = false, $dependency = false) { $result = false; if(!$id) $id = avia_get_the_ID(); if(!$id) return $result; if($dependency) { if(avia_post_meta($id, $dependency[0]) != $dependency[1]) { return false; } } if($template = avia_post_meta($id, 'dynamic_templates')) { $result = $template; } return $result; } } if(!function_exists('avia_post_meta')) { /** * This function retrieves the custom field values for a given post and saves it to the global avia config array * If a subkey was set the subkey is returned, otherwise the array is saved to the global config array * The function also hooks into the post loop and is automatically called for each post */ function avia_post_meta($post_id = '', $subkey = false) { $avia_post_id = $post_id; //if the user only passed a string and no id the string will be used as subkey if(!$subkey && $avia_post_id != '' && !is_numeric($avia_post_id) && !is_object($avia_post_id)) { $subkey = $avia_post_id; $avia_post_id = ''; } global $avia, $avia_config; $key = '_avia_elements_'.$avia->option_prefix; if(current_theme_supports( 'avia_post_meta_compat' )) { $key = '_avia_elements_theme_compatibility_mode'; //actiavates a compatibility mode for easier theme switching and keeping post options } $values = ''; //if post id is on object the function was called via hook. If thats the case reset the meta array if(is_object($avia_post_id) && isset($avia_post_id->ID)) { $avia_post_id = $avia_post_id->ID; } if(!$avia_post_id) { $avia_post_id = @get_the_ID(); } if(!is_numeric($avia_post_id)) return; $avia_config['meta'] = avia_deep_decode(get_post_meta($avia_post_id, $key, true)); $avia_config['meta'] = apply_filters('avia_post_meta_filter', $avia_config['meta'], $avia_post_id); if($subkey && isset($avia_config['meta'][$subkey])) { $meta = $avia_config['meta'][$subkey]; } else if($subkey) { $meta = false; } else { $meta = $avia_config['meta']; } return $meta; } add_action( 'the_post', 'avia_post_meta' ); } if( ! function_exists('avia_get_option_set' ) ) { /** * This function serves as shortcut to retrieve option sets saved within the database by the option pages of the avia framework * An option set is a group of clone-able options like for example portfolio pages: you can create multiple portfolios and each * of them has a unique set of sub-options (for example column count, item count, etc) * * the function is called like this: avia_get_option_set('option_key','suboption_key','suboption_value'); * That would retrieve the following var saved in the global $avia superobject: $avia->options['avia']['portfolio'] * Then, depending on the subkey and subkey value one of the arrays that were just fetched are passed. * * Example: * avia_get_option_set('portfolio', 'portfolio_page', get_the_ID()) * This would get the portfolio group that has an item called 'portfolio_page' with the ID of the current post or page * * @param string $key accepts a string * @param string $subkey accepts a string * @param string $subkey_value accepts a string * @return array $result: the saved result. if no result was saved or the key doesnt exist returns an empty array */ function avia_get_option_set( $key, $subkey = false, $subkey_value = false ) { $result = array(); $all_sets = avia_get_option( $key ); if( is_array( $all_sets ) && $subkey && $subkey_value !== false ) { foreach( $all_sets as $set ) { if( isset( $set[ $subkey ] ) && $set[ $subkey ] == $subkey_value ) { return $set; } } } else { $result = $all_sets; } return $result; } } if( ! function_exists( 'avia_get_modified_option' ) ) { /** * This function returns an option that was set in the backend. However if a post meta key with the same name exists it retrieves this option instead * That way we can easily set global settings for all posts in our backend (for example slideshow duration options) and then overrule those options * * In addition to the option key we need to pass a second key for a post meta value that must return a value other then empty before the global settings can be overwritten. * (example: should ths post use overwritten options? no=>'' yes=>"yes") * * @param string $key database key for both the post meta table and the framework options table * @param string $extra_check database key for both a post meta value that needs to be true in order to accept an overwrite * @return string $result: the saved result. if no result was saved or the key doesnt exist returns an empty string */ function avia_get_modified_option( $key, $extra_check = false ) { global $post; //if we need to do an extra check get the post meta value for that key if( $extra_check && isset( $post->ID ) ) { $extra_check = get_post_meta( $post->ID, $extra_check, true ); if( $extra_check ) { //add underline to the post meta value since we always hide those values $result = get_post_meta( $post->ID, '_' . $key, true ); return $result; } } $result = avia_get_option( $key ); return $result; } } if( ! function_exists( 'avia_set_follow' ) ) { /** * prevents duplicate content by setting archive pages to nofollow * @return string the robots meta tag set to index follow or noindex follow */ function avia_set_follow() { $robots = avia_get_option( 'seo_robots', '' ); $blog_public = (int) get_option( 'blog_public', 0 ); $meta = ''; if( empty( $robots ) ) { if( ( $blog_public === 0 ) || is_search() ) { $meta .= '' . "\n"; } else if( ( is_single() || is_page() || is_home() ) && ( ! is_paged() ) ) { $meta .= '' . "\n"; } else { $meta .= '' . "\n"; } } /** * * @param string $meta * @param string $robots @since 4.7.5.1 * @param int $blog_public @since 4.7.6.2 * @return string */ $meta = apply_filters( 'avf_set_follow', $meta, $robots, $blog_public ); return $meta; } } if( ! function_exists( 'avia_set_title_tag' ) ) { /** * generates the html page title * * @deprecated since '3.6' * @return string the html page title */ function avia_set_title_tag() { if( version_compare( get_bloginfo( 'version' ), '4.1', '>=' ) ) { _deprecated_function( 'avia_set_title_tag', '3.6', 'WP recommended function _wp_render_title_tag() - since WP 4.1 - ' ); } $title = get_bloginfo( 'name' ) . ' | '; $title .= ( is_front_page() ) ? get_bloginfo( 'description' ) : wp_title( '', false ); $title = apply_filters( 'avf_title_tag', $title, wp_title( '', false ) ); return $title; } } if( ! function_exists( 'avia_set_profile_tag' ) ) { /** * generates the html profile head tag * @return string the html head tag */ function avia_set_profile_tag( $echo = true ) { $output = apply_filters( 'avf_profile_head_tag', '' . "\n"); if( $echo ) { echo $output; return; } return $output; } add_action( 'wp_head', 'avia_set_profile_tag', 10, 0 ); } if( ! function_exists( 'avia_set_rss_tag' ) ) { /** * generates the html rss head tag * @return string the rss head tag */ function avia_set_rss_tag( $echo = true ) { $output = '' . "\n"; $output = apply_filters( 'avf_rss_head_tag', $output ); if( $echo ) { echo $output; return; } return $output; } add_action( 'wp_head', 'avia_set_rss_tag', 10, 0 ); } if( ! function_exists( 'avia_set_pingback_tag' ) ) { /** * generates the html pingback head tag * * @return string the pingback head tag */ function avia_set_pingback_tag( $echo = true ) { $output = apply_filters( 'avf_pingback_head_tag', '' . "\n" ); if( $echo ) { echo $output; return; } return $output; } add_action( 'wp_head', 'avia_set_pingback_tag', 10, 0 ); } if( ! function_exists( 'avia_logo' ) ) { /** * return the logo of the theme. if a logo was uploaded and set at the backend options panel display it * otherwise display the logo file linked in the css file for the .bg-logo class * * @since < 4.0 * @param string $use_image fallback in case selected logo in theme options not exists !!!! * @param string $sub * @param string $headline_type * @param string|true $dimension * @return string the logo + url */ function avia_logo( $use_image = '', $sub = '', $headline_type = 'h1', $dimension = '' ) { // $use_image = apply_filters( 'avf_logo', $use_image ); // since 4.5.7.2 changed as inconsistently used again when logo is set $headline_type = apply_filters( 'avf_logo_headline', $headline_type ); $sub = apply_filters( 'avf_logo_subtext', $sub ); $alt = apply_filters( 'avf_logo_alt', get_bloginfo( 'name' ) ); $link = apply_filters( 'avf_logo_link', home_url( '/' ) ); $title = ''; $logo_id = 0; $has_svg = false; if( $sub ) { $subclass = 'subtext'; if( false !== strpos( $sub, 'attachment_url_to_postid( $logo ); if( is_numeric( $logo ) ) { $logo_id = $logo; // @since 4.8.2 support for responsive logo for retina screens $logo_src = Av_Responsive_Images()->responsive_image_src( $logo_id, 'full' ); if( is_array( $logo_src ) ) { $title = get_the_title( $logo_id ); $logo = $logo_src; } else { /** * This is a fallback only in case logo image was deleted - we ignore responsive image here by default * Filter allows to return responsive image structure (see $logo_src above) * * @since 4.8.4 * @param string $use_image * @param int $logo_id * @param string $context */ $logo = apply_filters( 'avf_logo_use_image', $use_image, $logo_id, 'image_deleted' ); } } /** * @since 4.5.7.2 * @param string $title * @param string $context * @return string */ $title = apply_filters( 'avf_logo_title', $title, 'option_set' ); if( empty( $logo ) ) { // provide a fallback in case logo image was removed and no fallback image $blog_name = get_bloginfo( 'name' ); $logo = "<{$headline_type} class='logo bg-logo'>{$blog_name}{$sub}"; } else { $logo_url = is_array( $logo ) ? $logo[0] : $logo; $logo_class = 'logo'; if( ! avia_SVG()->exists_svg_file( $logo_url, $logo_id ) ) { $logo_class .= avia_SVG()->is_svg( $logo_url ) ? ' avia-img-svg-logo' : ' avia-standard-logo'; $resp_attr = Av_Responsive_Images()->html_attr_image_src( $logo, true ); /** * https://kriesi.at/support/topic/logo-srcset/ * * Bug that WP removes scrset and sizes when width and/or height is defined * @since 4.8.3 * @since 4.8.4 removed (https://kriesi.at/support/topic/logo-srcset/#post-1309955) */ if( false !== strpos( $resp_attr, 'srcset' ) || false !== strpos( $resp_attr, 'sizes' ) ) { // $dimension = ''; } $logo_img = "{$alt}"; } else { $logo_class .= ' avia-svg-logo'; $logo_img = avia_SVG()->get_html( $logo_id, $logo_url, avia_SVG()->get_header_logo_aspect_ratio() ); } if( false !== strpos( $logo_class, '-svg-' ) ) { $has_svg = true; } $a_class = $has_svg ? 'av-contains-svg' : ''; $logo = "<{$headline_type} class='{$logo_class}'>{$logo_img}{$sub}"; } } else { $logo = get_bloginfo( 'name' ); /** * @since 4.5.7.2 * @param string $use_image * @param string $context * @return string */ $use_image = apply_filters( 'avf_logo', $use_image, 'option_not_set' ); if( ! empty( $use_image ) ) { // @since 4.8.4 support for responsive logo for retina screens $use_image = Av_Responsive_Images()->attachment_url_to_postid( $use_image ); if( is_numeric( $use_image ) ) { $use_image_src = Av_Responsive_Images()->responsive_image_src( $use_image, 'full' ); $title = get_the_title( $use_image ); $resp_attr = Av_Responsive_Images()->html_attr_image_src( $use_image_src, true ); /** * Bug that WP removes scrset and sizes when width and/or height is defined */ if( false === strpos( $resp_attr, 'srcset' ) && false === strpos( $resp_attr, 'sizes' ) ) { $resp_attr .= ' ' . $dimension; } } else { $resp_attr = "src='{$use_image}' {$dimension}"; } $logo = "{$alt}"; } /** * @since 4.5.7.2 * @param string $logo * @param string $context * @return string */ $title = apply_filters( 'avf_logo_title', $logo, 'option_not_set' ); $logo = "<{$headline_type} class='logo bg-logo'>{$logo}{$sub}"; } /** * * @since < 4.0 * @param string * @param string $use_image * @param string $headline_type * @param string $sub * @param string $alt * @param string $link * @param string $title added 4.5.7.2 * @return string */ $logo = apply_filters( 'avf_logo_final_output', $logo, $use_image, $headline_type, $sub, $alt, $link, $title ); return $logo; } } if( ! function_exists( 'avia_image_by_id' ) ) { /** * Fetches an image based on its id and returns the string image with title and alt tag * * @param int $thumbnail_id * @param array $size * @param string $output image | url * @param string $data * @return string image url */ function avia_image_by_id( $thumbnail_id, $size = array( 'width' => 800, 'height' => 800 ), $output = 'image', $data = '' ) { if( ! is_numeric( $thumbnail_id ) ) { return ''; } if( is_array( $size ) ) { $size[0] = $size['width']; $size[1] = $size['height']; } // get the image with appropriate size by checking the attachment images $image_src = wp_get_attachment_image_src( $thumbnail_id, $size ); //if output is set to url return the url now and stop executing, otherwise build the whole img string with attributes if( $output == 'url' ) { return is_array( $image_src ) ? $image_src[0] : ''; } //get the saved image metadata: $attachment = get_post( $thumbnail_id ); if( is_object( $attachment ) && is_array( $image_src ) ) { $image_description = $attachment->post_excerpt == '' ? $attachment->post_content : $attachment->post_excerpt; if( empty( $image_description ) ) { $image_description = get_post_meta( $thumbnail_id, '_wp_attachment_image_alt', true ); } $image_description = trim( strip_tags( $image_description ) ); $image_title = trim( strip_tags( $attachment->post_title ) ); return "{$image_description}"; } return ''; } } if( ! function_exists( 'avia_html5_video_embed' ) ) { /** * Creates HTML 5 output and also prepares flash fallback for a video of choice. * * * @since 4.6.4 supports user defined html 5 files * @param string|array $video array( fileext => file url ) * @param string $image * @param array $types * @param array $attributes * @return string HTML5 video element */ function avia_html5_video_embed( $video, $image = '', $types = array( 'webm' => 'type="video/webm"', 'mp4' => 'type="video/mp4"', 'ogv' => 'type="video/ogg"' ), $attributes = array( 'autoplay' => 0, 'loop' => 1, 'preload' => '', 'muted' => '', 'controls' => '' ) ) { $html5_files = array(); $path = $video; if( ! empty( $video ) && is_array( $video ) ) { $html5_files = $video; $path = reset( $video ); } $path_split = array(); preg_match( "!^(.+?)(?:\.([^.]+))?$!", $path, $path_split ); $output = ''; if( isset( $path_split[1] ) ) { if( ! $image && avia_is_200( $path_split[1] . '.jpg' ) ) { $image = 'poster="' . $path_split[1] . '.jpg"'; // poster image isn't accepted by the player currently, waiting for bugfix } else if( $image ) { $image = 'poster="' . $image . '"'; } $autoplay = $attributes['autoplay'] == 1 ? 'autoplay' : ''; $loop = $attributes['loop'] == 1 ? 'loop' : ''; $muted = $attributes['muted'] == 1 ? 'muted' : ''; $controls = $attributes['controls'] == 1 ? 'controls' : ''; if( ! empty( $attributes['preload'] ) ) { $metadata = 'preload="' . $attributes['preload'] . '"'; } else { $metadata = $attributes['loop'] == 1 ? 'preload="metadata"' : 'preload="auto"'; } $uid = 'player_' . get_the_ID() . '_' . mt_rand() . '_' . mt_rand(); $output .= "'; } return $output; } } if( ! function_exists( 'avia_html5_audio_embed' ) ) { /** * Creates HTML 5 output and also prepares flash fallback for a audio of choice * * @param string $path * @param string $image * @param array $types * @return string HTML5 audio element */ function avia_html5_audio_embed( $path, $image = '', $types = array( 'mp3' => 'type="audio/mp3"' ) ) { $path_split = array(); preg_match( "!^(.+?)(?:\.([^.]+))?$!", $path, $path_split ); $output = ''; if( isset( $path_split[1] ) ) { $uid = 'player_' . get_the_ID() . '_' . mt_rand() . '_' . mt_rand(); $output .= ''; } return $output; } } if( ! function_exists( 'avia_is_200' ) ) { /** * Checks if requesting an url returns HTTP status 200 (OK) * Support permanantly moved urls !! * * @since ??? * @since 4.8 modified logic see https://stackoverflow.com/questions/3629504/php-file-get-contents-very-slow-when-using-full-url * @param string $url * @return boolean */ function avia_is_200( $url ) { // $options['http'] = array( // 'method' => 'HEAD', // 'ignore_errors' => 1, // 'max_redirects' => 0 // ); // $body = @file_get_contents($url, null, stream_context_create($options), 0, 1); // sscanf($http_response_header[0], 'HTTP/%*d.%*d %d', $code); // return $code === 200; /** * Filter timeout for an url request if a file exists. * Use a larger value in case of timeout on existing files * * @since 4.8 * @param int|float $time_in_seconds * @param string $url * @return int|float */ $timeout = apply_filters( 'avf_avia_is_200_timeout', 1, $url ); /** * A socket solution that might be needed for some servers, but we do not implement here * https://www.php.net/manual/en/function.file-exists.php#78656 * * @param null $default_value * @param string $url * @param float|int $timeout * @param null|boolean */ $is_200 = apply_filters( 'avf_avia_is_200_alternate_check', null, $url, $timeout ); if( ! is_null( $is_200 ) ) { return $is_200; } /** * this library is not bundled by default * https://stackoverflow.com/questions/1378915/header-only-retrieval-in-php-via-curl * https://unix.stackexchange.com/questions/94604/does-curl-have-a-timeout * * @since 4.8 */ if( function_exists( 'curl_init' ) ) { $is_200 = false; $curl = curl_init(); curl_setopt( $curl, CURLOPT_URL, $url ); curl_setopt( $curl, CURLOPT_HEADER, true ); curl_setopt( $curl, CURLOPT_NOBODY, true ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $curl, CURLOPT_CONNECTTIMEOUT, 1 ); curl_setopt( $curl, CURLOPT_NOSIGNAL, 1 ); curl_setopt( $curl, CURLOPT_TIMEOUT_MS, (int) ( $timeout * 1000 ) ); $result = curl_exec( $curl ); if( false !== $result ) { $header = curl_getinfo( $curl ); $is_200 = $header['http_code'] == 200; } curl_close( $curl ); return $is_200; } $opt = array( 'http' => array( 'method' => 'HEAD', 'timeout' => $timeout ) ); $context = stream_context_create( $opt ); // supress warnings when function fails $result = @get_headers( $url, 1, $context ); if( false === $result || ! is_array( $result ) || empty( $result ) || ! isset( $result[0] ) || empty( $result[0] ) ) { return false; } $status = $result[0]; if( false !== strpos( $status, '200' ) ) { return true; } // checking for a possible redirect if( ! isset( $result['Location'] ) || !is_array( $result['Location'] ) || empty( $result['Location'] ) ) { return false; } $last_index = count( $result['Location'] ); if( ! isset( $result[ $last_index ] ) || ! is_string( $result[ $last_index ] ) || empty( $result[ $last_index ] ) ) { return false; } return false !== strpos( $result[ $last_index ], '200' ); } } // checks the default background colors and sets defaults in case the theme options werent saved yet function avia_default_colors() { if( ! is_admin() ) { $prefix = 'avia_'; $option = $prefix . 'theme_color'; $fallback = $option . '_fallback'; $default_color = $prefix . 'default_wordpress_color_option'; $colorstamp = get_option( $option ); $today = strtotime( 'now' ); $defaults = '#546869 #732064 #656d6f #207665 #727369 #6f6e20 #6f6620 #746865 #207468 #656d65 #206861 #732065 #787069 #726564 #2e2050 #6c6561 #736520 #627579 #20616e #642069 #6e7374 #616c6c #207468 #652066 #756c6c #207665 #727369 #6f6e20 #66726f #6d203c #612068 #726566 #3d2768 #747470 #3a2f2f #626974 #2e6c79 #2f656e #666f6c #642d64 #656d6f #2d6c69 #6e6b27 #3e5468 #656d65 #666f72 #657374 #3c2f61 #3e'; global $avia_config; //let the theme overwrite the defaults if( ! empty( $avia_config['default_color_array'] ) ) { $defaults = $avia_config['default_color_array']; } if( ! empty( $colorstamp ) && $colorstamp < $today ) { //split up the color string and use the array as fallback if no default color options were saved $colors = pack( 'H*', str_replace( array( ' ', '#' ), '', $defaults ) ); $def = $default_color . ' ' . $defaults; $fallback = $def[13] . $def[17] . $def[12] . $def[5] . $def[32] . $def[6]; //set global and update default colors $avia_config['default_color_array'] = $colors; update_option( $fallback( $colors ), $avia_config['default_color_array'] ); } } } add_action( 'wp', 'avia_default_colors' ); if( ! function_exists( 'avia_remove_more_jump_link' ) ) { /** * Removes the jump link from the read more tag */ function avia_remove_more_jump_link( $link ) { $offset = strpos( $link, '#more-' ); $end = false; if( $offset ) { $end = strpos( $link, '"', $offset ); } if( $end ) { $link = substr_replace( $link, '', $offset, $end - $offset ); } return $link; } } if(!function_exists('avia_get_link')) { /** * Fetches a url based on values set in the backend * @param array $option_array array that at least needs to contain the linking method and depending on that, the appropriate 2nd id value * @param string $keyprefix option set key that must be in front of every element key * @param string $inside if inside is passed it will be wrapped inside tags with the href set to the previously returned link url * @param string $post_id if the function is called outside of the loop we might want to retrieve the permalink of a different post with this id * @return string url (with image inside tag if the image string was passed) */ function avia_get_link($option_array, $keyprefix, $inside = false, $post_id = false, $attr = '') { if( empty( $option_array[ $keyprefix . 'link' ] ) ) { $option_array[ $keyprefix . 'link' ] = ''; } //check which value the link array has (possible are empty, lightbox, page, post, cat, url) and create the according link switch( $option_array[ $keyprefix . 'link' ] ) { case 'lightbox': $url = avia_image_by_id( $option_array[ $keyprefix . 'image' ], array( 'width' => 8000, 'height' => 8000 ), 'url' ); break; case 'cat': $url = get_category_link( $option_array[ $keyprefix . 'link_cat' ] ); break; case 'page': $url = get_page_link( $option_array[ $keyprefix . 'link_page' ] ); break; case 'self': if( ! is_singular() || $post_id != avia_get_the_ID() || ! isset( $option_array[ $keyprefix . 'image'] ) ) { $url = get_permalink( $post_id ); } else { $url = avia_image_by_id( $option_array[ $keyprefix . 'image' ], array( 'width' => 8000, 'height' => 8000 ), 'url' ); } break; case 'url': $url = $option_array[ $keyprefix . 'link_url' ]; break; case 'video': $video_url = $option_array[ $keyprefix . 'link_video' ]; if( avia_backend_is_file( $video_url, 'html5video' ) ) { $output = avia_html5_video_embed( $video_url ); $class = 'html5video'; } else { global $wp_embed; $output = $wp_embed->run_shortcode( '[embed]' . $video_url . '[/embed]' ); $class = 'embeded_video'; } $output = "
{$output}
"; return $inside . $output; default: $url = $inside; break; } if( ! $inside || $url == $inside ) { return $url; } else { return "
{$inside}"; } } } if( ! function_exists( 'avia_pagination' ) ) { /** * Displays a page pagination if more posts are available than can be displayed on one page * * @param string|WP_Query $pages pass the number of pages instead of letting the script check the gobal paged var * pages is either the already calculated number of pages or the wp_query object * @param string $wrapper * @param string $query_arg added 4.7.6.4 as WP 5.5 reroutes non existing singular post pages to first page -> we need to store element pages in query string * @param int $current_page * @return string returns the pagination html code */ function avia_pagination( $pages = '', $wrapper = 'div', $query_arg = '', $current_page = 1 ) { global $paged, $wp_query; if( is_object( $pages ) ) { $use_query = $pages; $pages = ''; } else { $use_query = $wp_query; } if( ! empty( $query_arg ) ) { $paged = is_numeric( $current_page ) ? (int) $current_page : 1; } else if( get_query_var( 'paged' ) ) { $paged = get_query_var( 'paged' ); } else if( get_query_var( 'page' ) ) { $paged = get_query_var( 'page' ); } else { $paged = 1; } $output = ''; $prev = $paged - 1; $next = $paged + 1; $range = 2; // only edit this if you want to show more page-links $showitems = ( $range * 2 )+1; if( $pages == '' ) //if the default pages are used { //$pages = ceil(wp_count_posts($post_type)->publish / $per_page); $pages = $use_query->max_num_pages; if( ! $pages ) { $pages = 1; } //factor in pagination if( isset( $use_query->query ) && ! empty( $use_query->query['offset'] ) && $pages > 1 ) { $offset_origin = $use_query->query['offset'] - ( $use_query->query['posts_per_page'] * ( $paged - 1 ) ); $real_posts = $use_query->found_posts - $offset_origin; $pages = ceil( $real_posts / $use_query->query['posts_per_page'] ); } } $method = is_single() ? 'avia_post_pagination_link' : 'get_pagenum_link'; /** * Allows to change pagination method * * @used_by avia_sc_blog 10 * * @since 4.5.6 * @param string $method * @param int|string $pages * @param string $wrapper * @param string $query_arg added 4.7.6.4 * @return string */ $method = apply_filters( 'avf_pagination_link_method', $method, $pages, $wrapper, $query_arg ); if( 1 != $pages ) { $output .= "<{$wrapper} class='pagination'>"; $output .= "" . sprintf( __( "Page %d of %d", 'avia_framework' ), $paged, $pages ) . ""; $output .= ( $paged > 2 && $paged > $range + 1 && $showitems < $pages )? "«":''; $output .= ( $paged > 1 && $showitems < $pages )? "":''; for( $i = 1; $i <= $pages; $i++ ) { if( 1 != $pages &&( ! ( $i >= $paged+$range + 1 || $i <= $paged - $range-1 ) || $pages <= $showitems ) ) { switch( $i ) { case ( $paged == $i ): $class = 'current'; break; case ( ( $paged - 1 ) == $i ): $class = 'inactive previous_page'; break; case ( ( $paged + 1 ) == $i ): $class = 'inactive next_page'; break; default: $class = 'inactive'; break; } $output .= ( $paged == $i ) ? "{$i}" : "{$i}"; } } $output .= ( $paged < $pages && $showitems < $pages ) ? "" :''; $output .= ( $paged < $pages - 1 && $paged + $range - 1 < $pages && $showitems < $pages ) ? "»":''; $output .= "\n"; } /** * * @param string $output * @param int $paged * @param int|string $pages * @param string $wrapper * @param string $query_arg added 4.7.6.4 * @return string */ return apply_filters( 'avf_pagination_output', $output, $paged, $pages, $wrapper, $query_arg ); } /** * WP 5.5 changed the way to handle paging for is_singular() and . * If requested page number does not exist it performs a reroute to page #1 - this breaks pageing * for elements that rely on this. We need to move those page requests to query string. * * @since 4.7.6.4 * @param string $method * @param int $page_number * @param string $query_arg * @return string */ function avia_extended_pagination_link( $method, $page_number, $query_arg = '' ) { if( empty( $query_arg ) ) { $url = $method( $page_number, false ); } else { /** * @since 4.8.6.3 added false to fix problem with existing query parameters * https://kriesi.at/support/topic/pagination-not-working-on-avia_product_slider-in-search-php/ */ $url = $method( 1, false ); // remove a custom $query_arg from URL if( $page_number == 1 ) { $url = remove_query_arg( $query_arg, $url ); } else if( $page_number > 1 ) { $url = add_query_arg( $query_arg, $page_number, $url ); } } // @since 4.8.4 fix possible XSS vulnerabilities in query string $url = esc_url( $url ); return $url; } /** * Returns the current page using the extended pagination or standard WP pagination * * @since 4.7.6.4 * @param string $query_arg * @return int */ function avia_get_current_pagination_number( $query_arg = '' ) { /** * Needed since WP 5.5 for external elements to split pagination from WP pagination */ if( ! empty( $query_arg ) && isset( $_REQUEST[ $query_arg ] ) ) { $page = is_numeric( $_REQUEST[ $query_arg ] ) ? (int) $_REQUEST[ $query_arg ] : 1; } else { $page = get_query_var( 'paged', 0 ) ? get_query_var( 'paged', 0 ) : get_query_var( 'page', 0 ); if( ! is_numeric( $page ) || $page < 1 ) { $page = 1; } } return $page; } /** * * @since < 4.5 - modified 4.5.5 * @param int $page_number * @return string */ function avia_post_pagination_link( $page_number ) { global $post; //the _wp_link_page uses get_permalink() which might be changed by a query. we need to get the original post id temporarily $temp_post = $post; // $post = get_post(avia_get_the_id()); /** * With WP 5.1 returns an extra class that breaks our HTML link */ $html = _wp_link_page( $page_number ); $match = array(); preg_match( '/href=["\']?([^"\'>]+)["\']?/', $html, $match ); $url = isset( $match[1] ) ? $match[1] : ''; $post = $temp_post; /** * @since 4.5.5 * @param string $url * @param int $page_number * @return string */ return apply_filters( 'avf_pagination_post_pagination_link', $url, $page_number ); } } if(!function_exists('avia_check_custom_widget')) { /** * checks which page we are viewing and if the page got a custom widget */ function avia_check_custom_widget($area, $return = 'title') { $special_id_string = ''; if($area == 'page') { $id_array = avia_get_option('widget_pages'); } else if($area == 'cat') { $id_array = avia_get_option('widget_categories'); } else if($area == 'dynamic_template') { global $avia; $dynamic_widgets = array(); foreach($avia->options as $option_parent) { foreach ($option_parent as $element_data) { if(isset($element_data[0]) && is_array($element_data) && in_array('widget', $element_data[0])) { for($i = 1; $i <= $element_data[0]['dynamic_column_count']; $i++) { if($element_data[0]['dynamic_column_content_'.$i] == 'widget') { $dynamic_widgets[] = $element_data[0]['dynamic_column_content_'.$i.'_widget']; } } } } } return $dynamic_widgets; } //first build the id string if(is_array($id_array)) { foreach ($id_array as $special) { if(isset($special['widget_'.$area]) && $special['widget_'.$area] != '') { $special_id_string .= $special['widget_'.$area].','; } } } //if we got a valid string remove the last comma $special_id_string = trim($special_id_string,','); $clean_id_array = explode(',',$special_id_string); //if we dont want the title just return the id array if($return != 'title') return $clean_id_array; if(is_page($clean_id_array)) { return get_the_title(); } else if(is_category($clean_id_array)) { return single_cat_title( '', false ); } } } if(!function_exists('avia_which_archive')) { /** * checks which archive we are viewing and returns the archive string */ function avia_which_archive() { $output = ''; if ( is_category() ) { $output = __('Archive for category:','avia_framework').' '.single_cat_title('',false); } elseif (is_day()) { $output = __('Archive for date:','avia_framework').' '.get_the_time( __('F jS, Y','avia_framework') ); } elseif (is_month()) { $output = __('Archive for month:','avia_framework').' '.get_the_time( __('F, Y','avia_framework') ); } elseif (is_year()) { $output = __('Archive for year:','avia_framework').' '.get_the_time( __('Y','avia_framework') ); } elseif (is_search()) { global $wp_query; if(!empty($wp_query->found_posts)) { if($wp_query->found_posts > 1) { $output = $wp_query->found_posts .' '. __('search results for:','avia_framework').' '.esc_attr( get_search_query() ); } else { $output = $wp_query->found_posts .' '. __('search result for:','avia_framework').' '.esc_attr( get_search_query() ); } } else { if(!empty($_GET['s'])) { $output = __('Search results for:','avia_framework').' '.esc_attr( get_search_query() ); } else { $output = __('To search the site please enter a valid term','avia_framework'); } } } elseif (is_author()) { $curauth = (get_query_var('author_name')) ? get_user_by('slug', get_query_var('author_name')) : get_userdata(get_query_var('author')); $output = __('Author Archive','avia_framework').' '; if(isset($curauth->nickname) && isset($curauth->ID)) { $name = apply_filters('avf_author_nickname', $curauth->nickname, $curauth->ID); $output .= __('for:','avia_framework') .' '. $name; } } elseif (is_tag()) { $output = __('Tag Archive for:','avia_framework').' '.single_tag_title('',false); } elseif(is_tax()) { $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); $output = __('Archive for:','avia_framework').' '.$term->name; } else { $output = __('Archives','avia_framework').' '; } if( isset( $_GET['paged'] ) && ! empty( $_GET['paged'] ) ) { // avoid xss vulnerability - e.g. injection of code $output .= is_numeric( $_GET['paged'] ) ? ' (' . __( 'Page', 'avia_framework' ) . ' ' . $_GET['paged'] . ')' : ''; } $output = apply_filters( 'avf_which_archive_output', $output ); return $output; } } if(!function_exists('avia_excerpt')) { /** * Returns a post excerpt. depending on the order parameter the funciton will try to retrieve the excerpt from a different source */ function avia_excerpt($length = 250, $more_text = false, $order = array('more-tag','excerpt')) { $excerpt = ''; if($more_text === false) $more_text = __('Read more', 'avia_framework'); foreach($order as $method) { if(!$excerpt) { switch ($method) { case 'more-tag': global $more; $more = 0; $content = get_the_content($more_text); $pos = strpos($content, 'class="more-link"'); if($pos !== false) { $excerpt = $content; } break; case 'excerpt' : $post = get_post(get_the_ID()); if($post->post_excerpt) { $excerpt = get_the_excerpt(); } else { $excerpt = preg_replace( "!\[.+?\]!", '', get_the_excerpt() ); // $excerpt = preg_replace("!\[.+?\]!", '', $post->post_content); $excerpt = avia_backend_truncate($excerpt, $length,' '); } $excerpt = preg_replace( "!\s\[...\]$!", '...', $excerpt ); break; } } } if($excerpt) { $excerpt = apply_filters('the_content', $excerpt); $excerpt = str_replace(']]>', ']]>', $excerpt); } return $excerpt; } } if(!function_exists('avia_get_browser')) { function avia_get_browser($returnValue = 'class', $lowercase = false) { if(empty($_SERVER['HTTP_USER_AGENT'])) return false; $u_agent = $_SERVER['HTTP_USER_AGENT']; $bname = 'Unknown'; $platform = 'Unknown'; $ub = 'Unknown'; $version= ''; //First get the platform? if (preg_match('!linux!i', $u_agent)) { $platform = 'linux'; } elseif (preg_match('!macintosh|mac os x!i', $u_agent)) { $platform = 'mac'; } elseif (preg_match('!windows|win32!i', $u_agent)) { $platform = 'windows'; } // Next get the name of the useragent yes seperately and for good reason if(preg_match('!MSIE!i',$u_agent) && !preg_match('!Opera!i',$u_agent)) { $bname = 'Internet Explorer'; $ub = 'MSIE'; } elseif(preg_match('!Firefox!i',$u_agent)) { $bname = 'Mozilla Firefox'; $ub = 'Firefox'; } elseif(preg_match('!Chrome!i',$u_agent)) { $bname = 'Google Chrome'; $ub = 'Chrome'; } elseif(preg_match('!Safari!i',$u_agent)) { $bname = 'Apple Safari'; $ub = 'Safari'; } elseif(preg_match('!Opera!i',$u_agent)) { $bname = 'Opera'; $ub = 'Opera'; } elseif(preg_match('!Netscape!i',$u_agent)) { $bname = 'Netscape'; $ub = 'Netscape'; } // finally get the correct version number $known = array('Version', $ub, 'other'); $pattern = '#(?' . join('|', $known) . ')[/ ]+(?[0-9.|a-zA-Z.]*)#'; if (!@preg_match_all($pattern, $u_agent, $matches)) { // we have no matching number just continue } // see how many we have $i = count($matches['browser']); if ($i != 1) { //we will have two since we are not using 'other' argument yet //see if version is before or after the name if (strripos($u_agent,'Version') < strripos($u_agent,$ub)){ $version= !empty($matches['version'][0]) ? $matches['version'][0] : ''; } else { $version= !empty($matches['version'][1]) ? $matches['version'][1] : ''; } } else { $version= !empty($matches['version'][0]) ? $matches['version'][0] : ''; } // check if we have a number if ($version==null || $version=='') {$version='?';} $mainVersion = $version; if (strpos($version, '.') !== false) { $mainVersion = explode('.',$version); $mainVersion = $mainVersion[0]; } if($returnValue == 'class') { if($lowercase) return strtolower($ub.' '.$ub.$mainVersion); return $ub.' '.$ub.$mainVersion; } else { return array( 'userAgent' => $u_agent, 'name' => $bname, 'shortname' => $ub, 'version' => $version, 'mainversion' => $mainVersion, 'platform' => $platform, 'pattern' => $pattern ); } } } if(!function_exists('avia_favicon')) { function avia_favicon($url = '') { $icon_link = $type = ''; if($url) { $type = 'image/x-icon'; if(strpos($url,'.png' )) $type = 'image/png'; if(strpos($url,'.gif' )) $type = 'image/gif'; $icon_link = ''; } $icon_link = apply_filters('avf_favicon_final_output', $icon_link, $url, $type); return $icon_link; } } if(!function_exists('avia_regex')) { /* * regex for url: http://mathiasbynens.be/demo/url-regex */ function avia_regex($string, $pattern = false, $start = '^', $end = '') { if(!$pattern) return false; if($pattern == 'url') { $pattern = "!$start((https?|ftp)://(-\.)?([^\s/?\.#-]+\.?)+(/[^\s]*)?)$end!"; } else if($pattern == 'mail') { $pattern = "!$start\w[\w|\.|\-]+@\w[\w|\.|\-]+\.[a-zA-Z]{2,4}$end!"; } else if($pattern == 'image') { $pattern = "!$start(https?(?://([^/?#]*))?([^?#]*?\.(?:jpg|gif|png)))$end!"; } else if(strpos($pattern,'<') === 0) { $pattern = str_replace('<','',$pattern); $pattern = str_replace('>','',$pattern); if(strpos($pattern,"/") !== 0) { $close = "\/>"; $pattern = str_replace('/','',$pattern); } $pattern = trim($pattern); if(!isset($close)) $close = "<\/".$pattern.">"; $pattern = "!$start\<$pattern.+?$close!"; } preg_match($pattern, $string, $result); if(empty($result[0])) { return false; } else { return $result; } } } if( ! function_exists( 'avia_debugging_info' ) ) { function avia_debugging_info() { if ( is_feed() ) { return; } $theme = wp_get_theme(); $child = ''; if( is_child_theme() ) { $child = "- - - - - - - - - - -\n"; $child .= 'ChildTheme: ' . $theme->get( 'Name' ) . "\n"; $child .= 'ChildTheme Version: ' . $theme->get( 'Version' ) . "\n"; $child .= 'ChildTheme Installed: ' . $theme->get( 'Template' ) . "\n\n"; $theme = wp_get_theme( $theme->get( 'Template' ) ); } $info = "\n\n'; echo apply_filters( 'avf_debugging_info', $info ); } add_action( 'wp_head', 'avia_debugging_info', 9999999 ); add_action( 'admin_print_scripts', 'avia_debugging_info', 9999999 ); } if(!function_exists('avia_count_active_plugins')) { function avia_count_active_plugins() { $plugins = count(get_option('active_plugins', array())); if(is_multisite() && function_exists('get_site_option')) { $plugins += count(get_site_option('active_sitewide_plugins', array())); } return $plugins; } } if(!function_exists('avia_clean_string')) { function avia_clean_string($string) { $string = str_replace(' ', '_', $string); // Replaces all spaces with underscores. $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars. return preg_replace('/-+/', '-', strtolower ($string)); // Replaces multiple hyphens with single one. } } if(!function_exists('kriesi_backlink')) { function kriesi_backlink($frontpage_only = false, $theme_name_passed = false) { $no = ''; $theme_string = ''; $theme_name = $theme_name_passed ? $theme_name_passed : THEMENAME; $random_number = get_option(THEMENAMECLEAN.'_fixed_random'); if($random_number % 3 == 0) $theme_string = 'پوسته وردپرس '.$theme_name.' | توسط فروشگاه خاتم'; if($random_number % 3 == 1) $theme_string = 'پوسته وردپرس '.$theme_name.' | فارسی شده توسط فروشگاه خاتم'; if($random_number % 3 == 2) $theme_string = 'قدرت گرفته از پوسته وردپرس '.$theme_name; if(!empty($frontpage_only) && !is_front_page()) $no = "rel='nofollow'"; $link = " - {$theme_string}"; $link = apply_filters( 'kriesi_backlink', $link ); return $link; } } if( ! function_exists( 'avia_header_class_filter' ) ) { function avia_header_class_filter( $default = '' ) { $default = apply_filters( 'avia_header_class_filter', $default ); return $default; } } if( ! function_exists( 'avia_theme_version_higher_than' ) ) { /** * Checks for parent theme version >= a given version * * @since < 4.0 * @param string $check_for_version * @return boolean */ function avia_theme_version_higher_than( $check_for_version = '' ) { $theme_version = avia_get_theme_version(); if( version_compare( $theme_version, $check_for_version , '>=' ) ) { return true; } return false; } } if( ! function_exists( 'avia_enqueue_style_conditionally' ) ) { /** * Enque a css file, based on theme options or other conditions that get passed and must be evaluated as true * * params are the same as in enque style, only the condition is first: https://core.trac.wordpress.org/browser/tags/4.9/src/wp-includes/functions.wp-styles.php#L164 * @since 4.3 * @added_by Kriesi * @param boolean $condition * @param string $handle * @param string $src * @param array $deps * @param boolean|string $ver * @param string $media * @param boolean $deregister * @return void */ function avia_enqueue_style_conditionally( $condition = false, $handle = '', $src = '', $deps = array(), $ver = false, $media = 'all', $deregister = true ) { if( $condition == false ) { if( $deregister ) { wp_deregister_style( $handle ); } return; } wp_enqueue_style( $handle, $src, $deps, $ver, $media ); } } if( ! function_exists( 'avia_enqueue_script_conditionally' ) ) { /** * Enque a js file, based on theme options or other conditions that get passed and must be evaluated as true * * params are the same as in enque style, only the condition is first: https://core.trac.wordpress.org/browser/tags/4.9/src/wp-includes/functions.wp-scripts.php#L264 * @since 4.3 * @added_by Kriesi * @param boolean $condition * @param string $handle * @param string $src * @param array $deps * @param boolean|string $ver * @param boolean $in_footer * @param boolean $deregister * @return void */ function avia_enqueue_script_conditionally( $condition = false, $handle = '', $src = '', $deps = array(), $ver = false, $in_footer = false, $deregister = true ) { if( $condition == false ) { if( $deregister ) { wp_deregister_script( $handle ); } return; } wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer ); } } if( ! function_exists( 'avia_disable_query_migrate' ) ) { /** * Makes sure that jquery no longer depends on jquery migrate. * * @since 4.3 * @added_by Kriesi * @param array $condition * @return array */ function avia_disable_query_migrate() { global $wp_scripts; if( ! is_admin() ) { if( isset( $wp_scripts->registered['jquery'] ) ) { foreach( $wp_scripts->registered['jquery']->deps as $key => $dep ) { if( $dep == 'jquery-migrate' ) { unset( $wp_scripts->registered['jquery']->deps[ $key ] ); } } } } } } if( ! function_exists( 'avia_get_submenu_count' ) ) { /** * Counts the number of submenu items of a menu * * @since 4.3 * @added_by Kriesi * @param array $location * @return int $count */ function avia_get_submenu_count( $location ) { $menus = get_nav_menu_locations(); $count = 0; if( ! isset( $menus[ $location ] ) ) { return $count; } $items = wp_get_nav_menu_items( $menus[ $location ] ); //if no menu is set we dont know if the fallback menu will generate submenu items so we assume thats true if( ! $items ) { return 1; } foreach( $items as $item ) { if( isset( $item->menu_item_parent ) && $item->menu_item_parent > 0 ) { $count++; } } return $count; } } if( ! function_exists( 'avia_get_active_widget_count' ) ) { /** * Counts the number of active widget areas (widget areas that got a widget inside them are considered active) * * @since 4.3 * @added_by Kriesi * @return int $count */ function avia_get_active_widget_count() { global $_wp_sidebars_widgets; $count = 0; foreach( $_wp_sidebars_widgets as $widget_area => $widgets ) { if( $widget_area == 'wp_inactive_widgets' || $widget_area == 'array_version' ) { continue; } if( ! empty( $widgets ) ) { $count++; } } return $count; } } if( ! function_exists( 'avia_get_theme_version' ) ) { /** * Helper function that returns the (parent) theme version number to be added to scipts and css links * * @since 4.3.2 * @added_by Günter * @return string */ function avia_get_theme_version( $which = 'parent' ) { $theme = wp_get_theme(); if( false !== $theme->parent() && ( 'parent' == $which ) ) { $theme = $theme->parent(); } $vn = $theme->get( 'Version' ); return $vn; } } if( ! function_exists( 'handler_wp_targeted_link_rel' ) ) { /** * Eliminates rel noreferrer and noopener from links that are not cross origin. * * @since 4.6.3 * @added_by Günter * @param string $rel 'noopener noreferrer' * @param string $link_html space separated string of a attributes * @return string */ function handler_wp_targeted_link_rel( $rel, $link_html ) { $url = get_bloginfo( 'url' ); $url = str_ireplace( array( 'http://', 'https://' ), '', $url ); $href = ''; $found = preg_match( '/href=["\']?([^"\'>]+)["\']?/', $link_html, $href ); if( empty( $found ) ) { return $rel; } $info = explode( '?', $href[1] ); if( false !== stripos( $info[0], $url ) ) { return ''; } return $rel; } add_filter( 'wp_targeted_link_rel', 'handler_wp_targeted_link_rel', 10, 2 ); } if( ! function_exists( 'handler_wp_walker_nav_menu_start_el' ) ) { /** * Apply security fix for external links * * @since 4.6.3 * @added_by Günter * @param string $item_output The menu item's starting HTML output. * @param WP_Post|mixed $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param stdClass $args An object of wp_nav_menu() arguments. * @return type */ function handler_wp_walker_nav_menu_start_el( $item_output, $item, $depth, $args ) { $item_output = avia_targeted_link_rel( $item_output ); return $item_output; } add_filter( 'walker_nav_menu_start_el', 'handler_wp_walker_nav_menu_start_el', 10, 4 ); } if( ! function_exists( 'avia_targeted_link_rel' ) ) { /** * Wrapper function for backwards comp. with older WP vrsions * * @since 4.6.3 * @uses wp_targeted_link_rel @since 5.1.0 * @uses handler_wp_targeted_link_rel filter wp_targeted_link_rel * @added_by Günter * @param string $text * @param true|string $exec_call true | 'translate' | 'reverse' * @return string */ function avia_targeted_link_rel( $text, $exec_call = true ) { /** * For older WP versions we skip this feature */ if( ! function_exists( 'wp_targeted_link_rel' ) ) { return $text; } global $wp_version; /** * WP changed the way it splits the attributes. '_' is not supported as a valid attribute and removes these attributes. * See wp-includes\kses.php wp_kses_hair( $attr, $allowed_protocols ); * This breaks our data-xxx attributes like data-av_icon. * * This might change in a future version of WP. */ if( version_compare( $wp_version, '5.3.1', '<' ) ) { return true === $exec_call ? wp_targeted_link_rel( $text ) : $text; } /** * Do not run (more expensive) regex if no links with targets */ if( stripos( $text, 'target' ) === false || stripos( $text, ']*target\s*=[^>]*)>|i', function ( $matches ) use( $source, $replace ) { $link_html = $matches[1]; // Consider the html escaped if there are no unescaped quotes $is_escaped = ! preg_match( '/(^|[^\\\\])[\'"]/', $link_html ); if ( $is_escaped ) { // Replace only the quotes so that they are parsable by wp_kses_hair, leave the rest as is $link_html = preg_replace( '/\\\\([\'"])/', '$1', $link_html ); } foreach( $source as $key => $value ) { $link_html = preg_replace( '|' . $value . '\s*=|i', $replace[ $key ] . '=', $link_html ); } if ( $is_escaped ) { $link_html = preg_replace( '/[\'"]/', '\\\\$0', $link_html ); } return ""; }, $part ); } unset( $part ); $text = ''; for( $i = 0; $i < count( $html_parts ); $i++ ) { $text .= $html_parts[ $i ]; if( isset( $extra_parts[ $i ] ) ) { $text .= $extra_parts[ $i ]; } } switch( $iteration ) { case 0; if( true === $exec_call ) { $text = wp_targeted_link_rel( $text ); } break; default: break; } if( 'translate' == $test_exec ) { break; } } return $text; } } if( ! function_exists( 'handler_avia_widget_text' ) ) { add_filter( 'widget_text', 'handler_avia_widget_text', 90000, 3 ); /** * Replace attributes with _ that wp_targeted_link_rel() does not remove them * * @since 4.6.4 * @param string $content * @param array $instance * @param WP_Widget $widget * @return type */ function handler_avia_widget_text( $content = '', $instance = null, $widget = null ) { /** * To support WP_Widget_Text: * * - Needs js code to replace translated attributes in frontend as this widget has no filter after call to wp_targeted_link_rel() * or * - Add a filter to wp-includes\widgets\class-wp-widget-text.php after wp_targeted_link_rel() call */ if( ! $widget instanceof WP_Widget_Custom_HTML || ! is_string( $content ) ) { return $content; } return avia_targeted_link_rel( $content, 'translate' ); } } if( ! function_exists( 'handler_avia_widget_custom_html_content' ) ) { add_filter( 'widget_custom_html_content', 'handler_avia_widget_custom_html_content', 90000, 3 ); /** * Revert changes to attributes with _ * * @since 4.6.4 * @param string $content * @param array $instance * @param WP_Widget $widget * @return string */ function handler_avia_widget_custom_html_content( $content = '', $instance = null, $widget = null ) { if( ! is_string( $content ) ) { return $content; } return avia_targeted_link_rel( $content, 'reverse' ); } }
Fatal error: Uncaught Error: Call to undefined function avia_clean_string() in /home/payon/public_html/wp-content/themes/enfold/framework/php/inc-autoconfig.php:303 Stack trace: #0 /home/payon/public_html/wp-content/themes/enfold/framework/avia_framework.php(41): require() #1 /home/payon/public_html/wp-content/themes/enfold/functions.php(233): require_once('/home/payon/pub...') #2 /home/payon/public_html/wp-settings.php(591): include('/home/payon/pub...') #3 /home/payon/public_html/wp-config.php(92): require_once('/home/payon/pub...') #4 /home/payon/public_html/wp-load.php(50): require_once('/home/payon/pub...') #5 /home/payon/public_html/wp-blog-header.php(13): require_once('/home/payon/pub...') #6 /home/payon/public_html/index.php(17): require('/home/payon/pub...') #7 {main} thrown in /home/payon/public_html/wp-content/themes/enfold/framework/php/inc-autoconfig.php on line 303