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.

208 lines
4.5 KiB
PHP

<?php
/**
* Module Use Detection class.
*
* @package Divi
* @subpackage Builder
* @since 4.10.0
*/
/**
* Handles Module Use Detection.
*
* @since 4.10.0
*/
class ET_Builder_Module_Use_Detection {
/**
* Module Slugs Used.
*
* @access protected
* @var array
*/
protected $_modules_used = [];
/**
* Module Attrs Used.
*
* @access protected
* @var array
*/
protected $_module_attrs_used = [];
/**
* Module Attr Values Used.
*
* @access protected
* @var array
*/
protected $_module_attr_values_used = [];
/**
* Valid Shortcode Slugs.
*
* @access protected
* @var array
*/
protected $_valid_slugs = [];
/**
* `ET_Builder_Module_Use_Detection` instance.
*
* @var ET_Builder_Module_Use_Detection
*/
private static $_instance;
/**
* Construct instance.
*/
public function __construct() {
add_filter( 'pre_do_shortcode_tag', [ $this, 'log_slug_used' ], 99, 3 );
add_action( 'wp_footer', [ $this, 'footer' ], 1000 );
add_action( 'et_builder_ready', array( $this, '_setup_valid_slugs' ), 100 );
}
/**
* Get instance.
*/
public static function instance() {
if ( ! self::$_instance ) {
self::$_instance = new static();
}
return self::$_instance;
}
/**
* Get valid slugs.
*/
public function _setup_valid_slugs() {
$this->_valid_slugs = ET_Builder_Element::get_all_module_slugs();
}
/**
* Log the Shortcode Tag/Slug.
*
* @since 4.10.0
* @access public
* @param mixed $override Whether to override do_shortcode return value or not.
* @param string $tag Shortcode tag.
* @param array $attrs Shortcode attrs.
* @return mixed
*/
public function log_slug_used( $override, $tag, $attrs ) {
$interested_attrs_and_values = apply_filters(
'et_builder_module_attrs_values_used',
[
'gutter_width',
'animation_style',
'sticky_position',
'specialty',
'use_custom_gutter',
'font_icon',
'button_icon',
'hover_icon',
'scroll_down_icon',
'social_network',
'show_in_lightbox',
'fullwidth',
'scroll_vertical_motion_enable',
'scroll_horizontal_motion_enable',
'scroll_fade_enable',
'scroll_scaling_enable',
'scroll_rotating_enable',
'scroll_blur_enable',
'show_content',
]
);
/**
* The "gallery" shortcode is not part of the Divi modules but is used for enqueuing MagnificPopup
* when Divi Gallery is enabled under Theme Options > Enable Divi Gallery, so we need to include
* it in late detection for edge cases such as shortcodes hardcoded into child themes.
*/
$additional_valid_slugs = apply_filters(
'et_builder_valid_module_slugs',
[
'gallery',
]
);
$valid_slugs = array_unique( array_merge( $this->_valid_slugs, $additional_valid_slugs ) );
// Log the shortcode tags used.
if ( in_array( $tag, $valid_slugs, true ) ) {
$this->_modules_used[] = $tag;
$this->_modules_used = array_unique( $this->_modules_used );
if ( ! is_null( $attrs ) && ! is_array( $attrs ) ) {
$attrs = (array) $attrs;
}
$found_interested_attr_and_values = array_intersect( array_keys( $attrs ), $interested_attrs_and_values );
foreach ( $found_interested_attr_and_values as $key => $attr_name ) {
if ( empty( $this->_module_attr_values_used[ $attr_name ] ) ) {
$this->_module_attr_values_used[ $attr_name ] = [];
}
$this->_module_attr_values_used[ $attr_name ][] = $attrs[ $attr_name ];
$this->_module_attr_values_used[ $attr_name ] = array_unique( $this->_module_attr_values_used[ $attr_name ] );
}
}
return $override;
}
/**
* Add footer actions.
*/
public function footer() {
/**
* Fires after wp_footer hook and contains unique array of
* slugs of the modules that were used on the page load.
*
* @param array $_used_modules Module slugs used on the page load.
*
* @since 4.10.0
*/
do_action( 'et_builder_modules_used', $this->_modules_used );
}
/**
* Get modules used.
*
* @return array List of module slugs used.
* @since 4.10.0
* @access public
*/
public function get_modules_used() {
return $this->_modules_used;
}
/**
* Get module attrs used.
*
* @return array List of interested module attrs used.
* @since 4.10.0
* @access public
*/
public function get_module_attrs_used() {
return $this->_module_attrs_used;
}
/**
* Get module attr values used.
*
* @return array List of interested module attrs and values used.
* @since 4.10.0
* @access public
*/
public function get_module_attr_values_used() {
return $this->_module_attr_values_used;
}
}
ET_Builder_Module_Use_Detection::instance();