HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.104.1.lve.el8.x86_64 #1 SMP Tue Feb 10 20:07:30 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.29
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/posscale/public_html/WP-POS/wp-content/themes/angle/functions/wpzoom/functions.php
<?php
/**
 * General WP and WPZOOM functions.
 *
 * @package WPZOOM
 */

define( 'WPZOOM_INC_URI', get_template_directory_uri() . '/wpzoom' );

if ( ! function_exists( 'get_deprecated_themes' ) ) {

	function get_deprecated_themes() {
		return array(
			'artistica',
			'bizpress',
			'bonpress',
			'business-bite',
			'cadabrapress',
			'convention',
			'wpzoom-convention',
			'delicious',
			'domestica',
			'edupress',
			'elegance',
			'eventina',
			'evertis',
			'gallery',
			'graphix',
			'horizon',
			'hotelia',
			'impulse',
			'magnet',
			'magnific',
			'manifesto',
			'monograph',
			'newsley',
			'photoblog',
			'photoland',
			'photoria',
			'polaris',
			'prime',
			'professional',
			'proudfolio',
			'pulse',
			'sensor',
			'splendid',
			'sportpress',
			'techcompass',
			'technologic',
			'telegraph',
			'virtuoso',
			'voyage',
			'yamidoo-pro',
			'yamidoo_pro',
			'zenko',
			'elastik',
			'momentum',
			'insider',
			'magazine_explorer',
			'onplay',
			'daily_headlines',
			'litepress',
			'morning',
			'digital',
			'wpzoom-digital',
			'photoframe',
		);
	}
}

function get_demo_xml_data( $target = 'selected' ) {
	$xml_data = array(
		'remote'         => array(
			'url'      => '',
			'response' => false,
		),
		'local'          => array(
			'url'      => '',
			'response' => false,
		),
		'is_child_theme' => is_child_theme(),
	);

	// Stop when child theme is active
	if ( is_child_theme() ) {
		return $xml_data;
	}

	$demos = get_demos_details();

	$url       = 'https://www.wpzoom.com/downloads/xml/' . $demos['selected'] . '.xml';
	$local_url = get_template_directory() . '/theme-includes/demo-content/' . $demos['selected'] . '.xml';

	if ( $target == 'imported' ) {
		$url       = 'https://www.wpzoom.com/downloads/xml/' . $demos['imported'] . '.xml';
		$local_url = get_template_directory() . '/theme-includes/demo-content/' . $demos['imported'] . '.xml';
	}

	// Check for local file
	if ( is_file( $local_url ) ) {
		$xml_data['local']['url']      = $local_url;
		$xml_data['local']['response'] = true;
	}
	// Check for remote file
	else {
		$transient_id = 'get_demo_xml_transient_' . $demos['theme'] . '_' . $demos['selected'];

		if ( $target == 'imported' ) {
			$transient_id = 'get_demo_xml_transient_' . $demos['theme'] . '_' . $demos['imported'];
		}

		$transient = get_site_transient( $transient_id );

		if ( ! $transient ) {
			$response      = wp_remote_get( esc_url_raw( $url ) );
			$response_code = wp_remote_retrieve_response_code( $response );

			if ( ! is_wp_error( $response ) && $response_code === 200 ) {
				$xml_data['remote']['url']      = $url;
				$xml_data['remote']['response'] = true;

				set_site_transient( $transient_id, $xml_data, YEAR_IN_SECONDS );

				$transient = $xml_data;
			}
		}

		if ( is_array( $transient ) ) {
			$xml_data = array_merge( $xml_data, $transient );
		}
	}

	$xml_data = apply_filters( 'wpzoom_before_get_demo_xml_data', $xml_data );

	return $xml_data;
}


/**
 * Get demo details
 *
 * @since   1.7.0
 *
 * @return  array   Demo details
 */
function get_demos_details() {
	$raw_theme_name = WPZOOM::$themeName;

	if ( current_theme_supports( 'wpz-theme-info' ) ) {
		$theme_info = get_theme_support( 'wpz-theme-info' );
		$theme_info = array_pop( $theme_info );

		if ( ! empty( $theme_info['name'] ) ) {
			$raw_theme_name = $theme_info['name'];
		}
	}

	$themeName = str_replace( array( '_', ' ' ), '-', strtolower( $raw_theme_name ) );

	$data = array(
		'demos'         => array(),
		'theme'         => $themeName,
		'selected'      => $themeName,
		'default'       => $themeName,
		'imported'      => get_theme_mod( 'wpz_demo_imported' ),
		'imported_date' => get_theme_mod( 'wpz_demo_imported_timestamp' ),
		'multiple-demo' => false,
	);

	$arr_keys = array( 'name', 'id', 'thumbnail' );

	if ( current_theme_supports( 'wpz-multiple-demo-importer' ) ) {
		$wrapped_demos = get_theme_support( 'wpz-multiple-demo-importer' );
		$demos         = array_pop( $wrapped_demos );
		$selected      = get_theme_mod( 'wpz_multiple_demo_importer' );

		// Check if demos array has needed keys
		// If not, we need to change array by pushing keys into new demos array
		foreach ( $demos['demos'] as $key => $demo ) {
			if ( ! is_array( $demo ) ) {
				unset( $demos['demos'][ $key ] );

				$demos['demos'][ $key ][ $arr_keys[0] ] = $demo; // name
				$demos['demos'][ $key ][ $arr_keys[1] ] = $themeName . '-' . $demo; // id
				$demos['demos'][ $key ][ $arr_keys[2] ] = ''; // thumbnail
			}
		}

		if ( empty( $selected ) && isset( $demos['default'] ) ) {
			$selected        = $demos['default'];
			$data['default'] = $demos['default'];
		}

		$data['demos']         = $demos['demos'];
		$data['multiple-demo'] = true;
		$data['selected']      = $themeName . '-' . $selected;
	}

	return $data;
}


if ( ! function_exists( 'zoom_array_key_exists' ) ) {
	function zoom_array_key_exists( $keys, $search_arr ) {
		foreach ( $keys as $key ) {
			if ( ! array_key_exists( $key, $search_arr ) ) {
				return false;
			}
		}

		return true;
	}
}

/**
 *
 * Hook function called after the erase demo content process has finished.
 */
if ( ! function_exists( 'zoom_after_erase_demo' ) ) {
	function zoom_after_erase_demo() {
		$demos = get_demos_details();

		remove_theme_mod( 'wpz_demo_imported' );
		remove_theme_mod( 'wpz_demo_imported_timestamp' );
		delete_option( 'wpzoom_' . $demos['imported'] . '_theme_setup_complete' );
	}

	add_action( 'erase_demo_end', 'zoom_after_erase_demo' );
}

/**
 *
 * Hook function called before add partial to the customizer.
 */
if ( ! function_exists( 'zoom_before_add_partial' ) ) {
	function zoom_before_add_partial( $wp, $setting_id ) {
		if ( ! is_object( $wp ) ) {
			return false;
		}

		$remove_partial = array( 'custom_logo' );

		if ( in_array( $setting_id, $remove_partial ) ) {
			$wp->selective_refresh->remove_partial( $setting_id );
		}
	}

	add_action( 'wpzoom_remove_partial', 'zoom_before_add_partial', 10, 2 );
}

function zoom_get_beauty_demo_title( $name ) {
	return ucwords( str_replace( array( '-', '_' ), ' ', $name ) );
}

/**
 * Get the ID of an attachment from its image URL.
 *
 * @author  Taken from reverted change to WordPress core http://core.trac.wordpress.org/ticket/23831
 *
 * @param   string $url The path to an image.
 *
 * @return  int|bool            ID of the attachment or 0 on failure.
 */

if ( ! function_exists( 'zoom_get_attachment_id_from_url' ) ) {
	function zoom_get_attachment_id_from_url( $url = '' ) {
		// If there is no url, return.
		if ( '' === $url ) {
			return false;
		}

		global $wpdb;
		$attachment_id = 0;

		// Function introduced in 4.0
		if ( function_exists( 'attachment_url_to_postid' ) ) {
			$attachment_id = absint( attachment_url_to_postid( $url ) );
			if ( 0 !== $attachment_id ) {
				return $attachment_id;
			}
		}

		// First try this
		if ( preg_match( '#\.[a-zA-Z0-9]+$#', $url ) ) {
			$sql           = $wpdb->prepare(
				"SELECT ID FROM $wpdb->posts WHERE post_type = 'attachment' AND guid = %s",
				esc_url_raw( $url )
			);
			$attachment_id = absint( $wpdb->get_var( $sql ) );

			if ( 0 !== $attachment_id ) {
				return $attachment_id;
			}
		}

		// Then try this
		$upload_dir_paths = wp_upload_dir();
		if ( false !== strpos( $url, $upload_dir_paths['baseurl'] ) ) {
			// If this is the URL of an auto-generated thumbnail, get the URL of the original image
			$url = preg_replace( '/-\d+x\d+(?=\.(jpg|jpeg|png|gif)$)/i', '', $url );

			// Remove the upload path base directory from the attachment URL
			$url = str_replace( $upload_dir_paths['baseurl'] . '/', '', $url );

			// Finally, run a custom database query to get the attachment ID from the modified attachment URL
			$sql           = $wpdb->prepare(
				"SELECT wposts.ID FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta WHERE wposts.ID = wpostmeta.post_id AND wpostmeta.meta_key = '_wp_attached_file' AND wpostmeta.meta_value = '%s' AND wposts.post_type = 'attachment'",
				esc_url_raw( $url )
			);
			$attachment_id = absint( $wpdb->get_var( $sql ) );
		}

		return $attachment_id;
	}
}

if ( ! function_exists( 'inject_wpzoom_plugins' ) ) :
	function inject_wpzoom_plugins( $res, $action, $args ) {

		// remove filter to avoid infinite loop.
		remove_filter( 'plugins_api_result', 'inject_wpzoom_plugins', 10, 3 );

		foreach (
			array(
				'social-icons-widget-by-wpzoom',
				'instagram-widget-by-wpzoom',
				'elementor',
                'wpzoom-elementor-addons',
                'beaver-builder-lite-version',
				'wpzoom-addons-for-beaver-builder',
                'wpzoom-portfolio',
                'wpzoom-video-popup-block',
				'recipe-card-blocks-by-wpzoom',
                'block-patterns-for-food-bloggers',
                'wpforms-lite',
				'child-theme-configurator',
                'customizer-reset-by-wpzoom',
                'custom-posts-per-page-reloaded',
                'preload-featured-images',
                'remove-profile-dropdown-in-admin-bar',
                'woocommerce',
                'wordpress-seo'
			) as $plugin_slug
		) {
			$api = plugins_api(
				'plugin_information',
				array(
					'slug'   => $plugin_slug,
					'is_ssl' => is_ssl(),
					'fields' => array(
						'banners'           => true,
						'reviews'           => true,
						'downloaded'        => true,
						'active_installs'   => true,
						'icons'             => true,
						'short_description' => true,
					),
				)
			);

			if ( ! is_wp_error( $api ) ) {
				$res->plugins[] = $api;
			}
		}

		return $res;
	}
endif;

if ( ! function_exists( 'zoom_callback_for_featured_plugins_tab' ) ) :
	function zoom_callback_for_featured_plugins_tab( $args ) {
		add_filter( 'plugins_api_result', 'inject_wpzoom_plugins', 10, 3 );

		return $args;
	}
endif;


/**
 * Enqueue theme utils css.
 */
if ( ! function_exists( 'wpz_theme_enqueue_theme_utils_css' ) ) :
	function wpz_theme_enqueue_theme_utils_css() {
		wp_enqueue_style( 'zoom-theme-utils-css', WPZOOM::$assetsPath . '/css/theme-utils.css' );
	}
endif;

add_action( 'wp_enqueue_scripts', 'wpz_theme_enqueue_theme_utils_css' );

if ( ! function_exists( 'init_video_background_on_hover_module' ) ) {
	function init_video_background_on_hover_module() {
		require_once WPZOOM_INC . '/components/video-background-on-hover/wpzoom-video-background-on-hover.php';

		static $instance = null;

		if ( is_null( $instance ) ) {
			$wrapped_settings = get_theme_support( 'wpz-background-video-on-hover' );
			$args             = array_pop( $wrapped_settings );
			$instance         = new WPZOOM_Video_Background_On_Hover( $args );
		}

		return $instance;
	}
}

if ( ! function_exists( 'zoom_error_log' ) ) :

	/**
	 * Error Log
	 *
	 * A wrapper function for the error_log() function.
	 *
	 * @since 2.0.0
	 *
	 * @param  mixed $message Error message.
	 * @return void
	 */
	function zoom_error_log( $message = '' ) {
		if ( apply_filters( 'wpzoom_demo_importer_debug_logs', false ) ) {
			if ( is_array( $message ) ) {
				$message = wp_json_encode( $message );
			}

			error_log( $message ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
		}
	}

endif;

if ( ! function_exists( 'zoom_is_valid_image' ) ) :
	/**
	 * Check for the valid image
	 *
	 * @param string $link  The Image link.
	 *
	 * @since 2.0.0
	 * @return boolean
	 */
	function zoom_is_valid_image( $link = '' ) {
		return preg_match( '/^((https?:\/\/)|(www\.))([a-z0-9-].?)+(:[0-9]+)?\/[\w\-]+\.(jpg|png|gif|jpeg|svg)\/?$/i', $link );
	}
endif;


if ( ! function_exists( 'zoom_current_theme_supports' ) ) {
	/**
	 * Check theme supports passed feature.
	 *
	 * @param string $feature The feature to check.
	 * @param mixed $args Extra arguments to be checked against certain features.
	 * @return boolean
	 */
	function zoom_current_theme_supports( $feature, ...$args ) {
		global $_wp_theme_features;
		if ( ! isset( $_wp_theme_features[ $feature ] ) ) {
			return false;
		}
	
		if ( ! $args ) {
			return $_wp_theme_features[ $feature ];
		}
	
		switch ( $feature ) {
			case 'wpz-onboarding':
				if ( isset( $_wp_theme_features[ $feature ][0][ $args[0] ] ) ) {
					return $_wp_theme_features[ $feature ][0][ $args[0] ];
				}
				return false;
	
			default:
				return $_wp_theme_features[ $feature ];
		}
	}
}