You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
475 lines
11 KiB
PHTML
475 lines
11 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* Handle Dynamic Assets
|
||
|
*
|
||
|
* @package Builder
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Gets the assets directory.
|
||
|
*
|
||
|
* @param bool $url check if url.
|
||
|
*
|
||
|
* @return string
|
||
|
* @since 4.10.0
|
||
|
*/
|
||
|
function et_get_dynamic_assets_path( $url = false ) {
|
||
|
$is_builder_active = et_is_builder_plugin_active();
|
||
|
|
||
|
$template_address = $url ? get_template_directory_uri() : get_template_directory();
|
||
|
|
||
|
if ( $is_builder_active ) {
|
||
|
$template_address = $url ? ET_BUILDER_PLUGIN_URI : ET_BUILDER_PLUGIN_DIR;
|
||
|
}
|
||
|
|
||
|
return apply_filters( 'et_dynamic_assets_prefix', $template_address . '/includes/builder/feature/dynamic-assets/assets' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks if current post/page is built-in.
|
||
|
*
|
||
|
* @return bool
|
||
|
* @since 4.10.0
|
||
|
*/
|
||
|
function et_is_cpt() {
|
||
|
static $is_cpt = null;
|
||
|
|
||
|
if ( null === $is_cpt ) {
|
||
|
global $post;
|
||
|
|
||
|
$custom_post_types = get_post_types( array( '_builtin' => false ) );
|
||
|
$custom_types = array();
|
||
|
$is_cpt = false;
|
||
|
|
||
|
if ( ! empty( $custom_post_types ) ) {
|
||
|
$custom_types = array_keys( $custom_post_types );
|
||
|
}
|
||
|
|
||
|
$post_type = get_post_type( $post );
|
||
|
|
||
|
if ( in_array( $post_type, $custom_types, true ) && is_singular() && 'project' !== $post_type ) {
|
||
|
$is_cpt = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $is_cpt;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Extracts gutter width values from post/page content.
|
||
|
*
|
||
|
* @param array $matches matched gutters.
|
||
|
*
|
||
|
* @return array
|
||
|
* @since 4.10.0
|
||
|
*/
|
||
|
function et_get_content_gutter_widths( $matches ) {
|
||
|
$gutters = array();
|
||
|
|
||
|
foreach ( $matches as $match ) {
|
||
|
preg_match_all( '/"([^"]+)"/', $match, $matches );
|
||
|
$gutters = array_merge( $gutters, $matches[1] );
|
||
|
}
|
||
|
|
||
|
// Convert strings to integers.
|
||
|
$gutters = array_map( 'intval', $gutters );
|
||
|
|
||
|
return $gutters;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if any widgets are currently active.
|
||
|
*
|
||
|
* @return bool
|
||
|
* @since 4.10.0
|
||
|
*/
|
||
|
function et_pb_are_widgets_used() {
|
||
|
global $wp_registered_sidebars;
|
||
|
|
||
|
$sidebars = get_option( 'sidebars_widgets' );
|
||
|
|
||
|
foreach ( $wp_registered_sidebars as $sidebar_key => $sidebar_options ) {
|
||
|
if ( ! empty( $sidebars[ $sidebar_key ] ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if a specific value is "on" on the page.
|
||
|
*
|
||
|
* @param array $values matched values.
|
||
|
*
|
||
|
* @return bool
|
||
|
* @since 4.10.0
|
||
|
*/
|
||
|
function et_check_if_particular_value_is_on( $values ) {
|
||
|
foreach ( $values as $match ) {
|
||
|
preg_match_all( '/"([^"]+)"/', $match, $matches );
|
||
|
if ( in_array( 'on', $matches[1], true ) ) {
|
||
|
return true;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get if a non-default preset value.
|
||
|
*
|
||
|
* @param array $values Matched values.
|
||
|
*
|
||
|
* @return array
|
||
|
* @since 4.10.0
|
||
|
*/
|
||
|
function et_get_non_default_preset_ids( $values ) {
|
||
|
$result = array();
|
||
|
|
||
|
foreach ( $values as $match ) {
|
||
|
|
||
|
preg_match_all( '/"([^"]+)"/', $match, $matches );
|
||
|
|
||
|
if ( ! in_array( 'default', $matches[1], true ) ) {
|
||
|
$result = array_merge( $result, $matches[1] );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check to see if this is a front end request applicable to Dynamic Assets.
|
||
|
*
|
||
|
* @since 4.10.0
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
function et_is_dynamic_front_end_request() {
|
||
|
static $is_dynamic_front_end_request = null;
|
||
|
|
||
|
if ( null === $is_dynamic_front_end_request ) {
|
||
|
if (
|
||
|
// Disable for WordPress admin requests.
|
||
|
! is_admin()
|
||
|
// Disable for non-front-end requests.
|
||
|
&& ! wp_doing_ajax()
|
||
|
&& ! wp_doing_cron()
|
||
|
&& ! wp_is_json_request()
|
||
|
&& ! ( defined( 'REST_REQUEST' ) && REST_REQUEST )
|
||
|
&& ! ( defined( 'WP_CLI' ) && WP_CLI )
|
||
|
&& ! ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST )
|
||
|
&& ! is_trackback()
|
||
|
&& ! is_feed()
|
||
|
&& ! get_query_var( 'sitemap' )
|
||
|
// Disable when in preview modes.
|
||
|
&& ! is_customize_preview()
|
||
|
&& ! is_et_pb_preview()
|
||
|
&& ! ET_GB_Block_Layout::is_layout_block_preview()
|
||
|
&& ! is_preview()
|
||
|
// Disable when using the visual builder.
|
||
|
&& ! et_fb_is_enabled()
|
||
|
// Disable on paginated index pages when blog style mode is enabled and when using the Divi Builder plugin.
|
||
|
&& ! ( is_paged() && ( 'on' === et_get_option( 'divi_blog_style', 'off' ) || et_is_builder_plugin_active() ) )
|
||
|
) {
|
||
|
$is_dynamic_front_end_request = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $is_dynamic_front_end_request;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check to see if this is a front end request.
|
||
|
*
|
||
|
* @since 4.10.0
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
function et_is_front_end_request() {
|
||
|
static $et_is_front_end_request = null;
|
||
|
|
||
|
if ( null === $et_is_front_end_request ) {
|
||
|
if (
|
||
|
// Disable for WordPress admin requests.
|
||
|
! is_admin()
|
||
|
&& ! wp_doing_ajax()
|
||
|
&& ! wp_doing_cron()
|
||
|
) {
|
||
|
$et_is_front_end_request = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $et_is_front_end_request;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if the current request should generate Dynamic Assets.
|
||
|
* We only generate dynamic assets on the front end and when cache dir is writable.
|
||
|
*
|
||
|
* @since 4.10.0
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
function et_should_generate_dynamic_assets() {
|
||
|
static $should_generate_assets = null;
|
||
|
|
||
|
if ( null === $should_generate_assets ) {
|
||
|
if (
|
||
|
// Cache directory must be writable.
|
||
|
et_core_cache_dir()->can_write
|
||
|
// Request must be an applicable front-end request.
|
||
|
&& et_is_dynamic_front_end_request()
|
||
|
) {
|
||
|
$should_generate_assets = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filters whether to generate dynamic assets.
|
||
|
*
|
||
|
* @since 4.10.6
|
||
|
*
|
||
|
* @param bool $should_generate_assets
|
||
|
*/
|
||
|
return apply_filters( 'et_should_generate_dynamic_assets', (bool) $should_generate_assets );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if Dynamic CSS is enabled.
|
||
|
*
|
||
|
* @return bool
|
||
|
* @since 4.10.0
|
||
|
*/
|
||
|
function et_use_dynamic_css() {
|
||
|
global $shortname;
|
||
|
static $et_use_dynamic_css = null;
|
||
|
|
||
|
if ( null === $et_use_dynamic_css ) {
|
||
|
if ( et_is_builder_plugin_active() ) {
|
||
|
$options = get_option( 'et_pb_builder_options', array() );
|
||
|
$dynamic_css = isset( $options['performance_main_dynamic_css'] ) ? $options['performance_main_dynamic_css'] : 'on';
|
||
|
} else {
|
||
|
$dynamic_css = et_get_option( $shortname . '_dynamic_css', 'on' );
|
||
|
}
|
||
|
|
||
|
if ( 'on' === $dynamic_css && et_should_generate_dynamic_assets() ) {
|
||
|
$et_use_dynamic_css = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filters whether to use dynamic CSS.
|
||
|
*
|
||
|
* @since 4.10.6
|
||
|
*
|
||
|
* @param bool $et_use_dynamic_css
|
||
|
*/
|
||
|
return apply_filters( 'et_use_dynamic_css', (bool) $et_use_dynamic_css );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if Dynamic Icons are enabled.
|
||
|
*
|
||
|
* @since 4.10.0
|
||
|
*/
|
||
|
function et_use_dynamic_icons() {
|
||
|
global $shortname;
|
||
|
$child_theme_active = is_child_theme();
|
||
|
|
||
|
if ( et_is_builder_plugin_active() ) {
|
||
|
$options = get_option( 'et_pb_builder_options', array() );
|
||
|
$dynamic_icons = isset( $options['performance_main_dynamic_icons'] ) ? $options['performance_main_dynamic_icons'] : et_dynamic_icons_default_value();
|
||
|
} else {
|
||
|
$dynamic_icons = et_get_option( $child_theme_active ? $shortname . '_dynamic_icons_child_theme' : $shortname . '_dynamic_icons', et_dynamic_icons_default_value() );
|
||
|
}
|
||
|
|
||
|
return $dynamic_icons;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if JavaScript On Demand is enabled.
|
||
|
*
|
||
|
* @return bool
|
||
|
* @since 4.10.0
|
||
|
*/
|
||
|
function et_disable_js_on_demand() {
|
||
|
global $shortname;
|
||
|
static $et_disable_js_on_demand = null;
|
||
|
|
||
|
if ( null === $et_disable_js_on_demand ) {
|
||
|
if ( et_is_builder_plugin_active() ) {
|
||
|
$options = get_option( 'et_pb_builder_options', array() );
|
||
|
$dynamic_js_libraries = isset( $options['performance_main_dynamic_js_libraries'] ) ? $options['performance_main_dynamic_js_libraries'] : 'on';
|
||
|
} else {
|
||
|
$dynamic_js_libraries = et_get_option( $shortname . '_dynamic_js_libraries', 'on' );
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
// Disable when theme option not enabled.
|
||
|
'on' !== $dynamic_js_libraries
|
||
|
// Disable when not an applicable front-end request.
|
||
|
|| ! et_is_dynamic_front_end_request()
|
||
|
) {
|
||
|
$et_disable_js_on_demand = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filters whether to disable JS on demand.
|
||
|
*
|
||
|
* @since 4.10.6
|
||
|
*
|
||
|
* @param bool $et_disable_js_on_demand
|
||
|
*/
|
||
|
return apply_filters( 'et_disable_js_on_demand', (bool) $et_disable_js_on_demand );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Disable dynamic icons if TP modules are present.
|
||
|
*
|
||
|
* @since 4.10.0
|
||
|
*/
|
||
|
function et_dynamic_icons_default_value() {
|
||
|
$tp_extensions = DiviExtensions::get( 'all' );
|
||
|
$child_theme_active = is_child_theme();
|
||
|
|
||
|
if ( ! empty( $tp_extensions ) || ( $child_theme_active && ! et_is_builder_plugin_active() ) ) {
|
||
|
return 'off';
|
||
|
}
|
||
|
|
||
|
return 'on';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get all active block widgets.
|
||
|
*
|
||
|
* This method will collect all active block widgets first. Later on, the result will be
|
||
|
* cached to improve the performance.
|
||
|
*
|
||
|
* @since 4.10.5
|
||
|
*
|
||
|
* @return array List of active block widgets.
|
||
|
*/
|
||
|
function et_get_active_block_widgets() {
|
||
|
global $wp_version;
|
||
|
static $active_block_widgets = null;
|
||
|
|
||
|
$wp_major_version = substr( $wp_version, 0, 3 );
|
||
|
|
||
|
// Bail early if were pre WP 5.8, when block widgets were introduced.
|
||
|
if ( version_compare( $wp_major_version, '5.8', '<' ) ) {
|
||
|
return array();
|
||
|
}
|
||
|
|
||
|
global $wp_widget_factory;
|
||
|
|
||
|
$active_block_widgets = array();
|
||
|
$block_instance = $wp_widget_factory->get_widget_object( 'block' );
|
||
|
$block_settings = $block_instance->get_settings();
|
||
|
|
||
|
// Bail early if there is no active block widgets.
|
||
|
if ( empty( $block_settings ) ) {
|
||
|
return $active_block_widgets;
|
||
|
}
|
||
|
|
||
|
// Collect all active blocks.
|
||
|
foreach ( $block_settings as $block_number => $block_setting ) {
|
||
|
$block_content = et_()->array_get( $block_setting, 'content' );
|
||
|
$block_parsed = parse_blocks( $block_content );
|
||
|
$block_name = et_()->array_get( $block_parsed, array( '0', 'blockName' ) );
|
||
|
|
||
|
// Save and cache there result.
|
||
|
if ( ! in_array( $block_name, $active_block_widgets, true ) ) {
|
||
|
array_push( $active_block_widgets, $block_name );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $active_block_widgets;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check whether current block widget is active or not.
|
||
|
*
|
||
|
* @since 4.10.5
|
||
|
*
|
||
|
* @param string $block_widget_name Block widget name.
|
||
|
*
|
||
|
* @return boolean Whether current block widget is active or not.
|
||
|
*/
|
||
|
function et_is_active_block_widget( $block_widget_name ) {
|
||
|
return in_array( $block_widget_name, et_get_active_block_widgets(), true );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check whether Extra Home layout is being used.
|
||
|
*
|
||
|
* @since 4.17.5
|
||
|
*
|
||
|
* @return boolean whether Extra Home layout is being used.
|
||
|
*/
|
||
|
function et_is_extra_layout_used_as_front() {
|
||
|
return function_exists( 'et_extra_show_home_layout' ) && et_extra_show_home_layout() && is_front_page();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check whether Extra Home layout is being used.
|
||
|
*
|
||
|
* @since 4.17.5
|
||
|
*
|
||
|
* @return boolean whether Extra Home layout is being used.
|
||
|
*/
|
||
|
function et_is_extra_layout_used_as_home() {
|
||
|
return function_exists( 'et_extra_show_home_layout' ) && et_extra_show_home_layout() && is_home();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Extra Home layout ID.
|
||
|
*
|
||
|
* @since 4.17.5
|
||
|
*
|
||
|
* @return int|null
|
||
|
*/
|
||
|
function et_get_extra_home_layout_id() {
|
||
|
if ( function_exists( 'extra_get_home_layout_id' ) ) {
|
||
|
return extra_get_home_layout_id();
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Extra Taxonomy layout ID.
|
||
|
*
|
||
|
* @since 4.17.5
|
||
|
*
|
||
|
* @return int|null
|
||
|
*/
|
||
|
function et_get_extra_tax_layout_id() {
|
||
|
if ( function_exists( 'extra_get_tax_layout_id' ) ) {
|
||
|
return extra_get_tax_layout_id();
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get embeded media from post content.
|
||
|
*
|
||
|
* @since 4.20.1
|
||
|
*
|
||
|
* @param int $content Post Content.
|
||
|
*
|
||
|
* @return boolean false on failure, true on success.
|
||
|
*/
|
||
|
function et_is_media_embedded_in_content( $content ) {
|
||
|
// regex match for youtube and vimeo urls in $content.
|
||
|
$pattern = '~https?://(?:www\.)?(?:youtube\.com/watch\?v=|youtu\.be/|vimeo\.com/)([^\s]+)~i';
|
||
|
preg_match_all( $pattern, $content, $matches );
|
||
|
|
||
|
if ( empty( $matches[0] ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|