use Elementor\Includes\Elements\Container;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
* Elementor elements manager.
* Elementor elements manager handler class is responsible for registering and
* initializing all the supported elements.
* Holds the list of all the element types.
* Holds the list of all the element categories.
* Initializing Elementor elements manager.
public function __construct() {
* Create element instance.
* This method creates a new element instance for any given element.
* @param array $element_data Element data.
* @param array $element_args Optional. Element arguments. Default is
* @param Element_Base $element_type Optional. Element type. Default is null.
* @return Element_Base|null Element instance if element created, or null
public function create_element_instance( array $element_data, array $element_args = [], Element_Base $element_type = null ) {
if ( null === $element_type ) {
if ( 'widget' === $element_data['elType'] ) {
$element_type = Plugin::$instance->widgets_manager->get_widget_types( $element_data['widgetType'] );
$element_type = $this->get_element_types( $element_data['elType'] );
$args = array_merge( $element_type->get_default_args(), $element_args );
$element_class = $element_type->get_class_name();
$element = new $element_class( $element_data, $args );
} catch ( \Exception $e ) {
* Get element categories.
* Retrieve the list of categories the element belongs to.
* @return array Element categories.
public function get_categories() {
if ( null === $this->categories ) {
$this->init_categories();
return $this->categories;
* Register new category for the element.
* @param string $category_name Category name.
* @param array $category_properties Category properties.
public function add_category( $category_name, $category_properties ) {
if ( null === $this->categories ) {
if ( ! isset( $this->categories[ $category_name ] ) ) {
$this->categories[ $category_name ] = $category_properties;
* Add new type to the list of registered types.
* @param Element_Base $element Element instance.
* @return bool Whether the element type was registered.
public function register_element_type( Element_Base $element ) {
$this->_element_types[ $element->get_name() ] = $element;
* Unregister element type.
* Remove element type from the list of registered types.
* @param string $name Element name.
* @return bool Whether the element type was unregister, or not.
public function unregister_element_type( $name ) {
if ( ! isset( $this->_element_types[ $name ] ) ) {
unset( $this->_element_types[ $name ] );
* Retrieve the list of all the element types, or if a specific element name
* was provided retrieve his element types.
* @param string $element_name Optional. Element name. Default is null.
* @return null|Element_Base|Element_Base[] Element types, or a list of all the element
* types, or null if element does not exist.
public function get_element_types( $element_name = null ) {
if ( is_null( $this->_element_types ) ) {
if ( null !== $element_name ) {
return isset( $this->_element_types[ $element_name ] ) ? $this->_element_types[ $element_name ] : null;
return $this->_element_types;
* Get element types config.
* Retrieve the config of all the element types.
* @return array Element types config.
public function get_element_types_config() {
foreach ( $this->get_element_types() as $element ) {
$config[ $element->get_name() ] = $element->get_config();
* Render elements content.
* Used to generate the elements templates on the editor.
public function render_elements_content() {
foreach ( $this->get_element_types() as $element_type ) {
$element_type->print_template();
* Initialize Elementor elements by registering the supported elements.
* Elementor supports by default `section` element and `column` element.
private function init_elements() {
$this->_element_types = [];
foreach ( [ 'section', 'column' ] as $element_name ) {
$class_name = __NAMESPACE__ . '\Element_' . $element_name;
$this->register_element_type( new $class_name() );
$experiments_manager = Plugin::$instance->experiments;
if ( $experiments_manager->is_feature_active( 'container' ) ) {
$this->register_element_type( new Container() );
* After elements registered.
* Fires after Elementor elements are registered.
do_action( 'elementor/elements/elements_registered', $this );
* Initialize the element categories.
private function init_categories() {
'title' => esc_html__( 'Atomic Elements', 'elementor' ),
'title' => esc_html__( 'Layout', 'elementor' ),
'title' => esc_html__( 'Basic', 'elementor' ),
'title' => esc_html__( 'Pro', 'elementor' ),
'url' => esc_url( 'https://go.elementor.com/go-pro-section-pro-widget-panel/' ),
'title' => esc_html__( 'Hello+', 'elementor' ),
'title' => esc_html__( 'General', 'elementor' ),
'title' => esc_html__( 'Link In Bio', 'elementor' ),
'title' => esc_html__( 'Site', 'elementor' ),
'url' => esc_url( 'https://go.elementor.com/go-pro-section-site-widget-panel/' ),
'woocommerce-elements' => [
'title' => esc_html__( 'WooCommerce', 'elementor' ),
'url' => esc_url( 'https://go.elementor.com/go-pro-section-woocommerce-widget-panel/' ),
// Not using the `add_category` because it doesn't allow 3rd party to inject a category on top the others.
$this->categories = array_merge_recursive( [
'title' => esc_html__( 'Favorites', 'elementor' ),
* When categories are registered.
* Fires after basic categories are registered, before WordPress
* category have been registered.
* This is where categories registered by external developers are
* @param Elements_Manager $this Elements manager instance.
do_action( 'elementor/elements/categories_registered', $this );
$this->categories['wordpress'] = [
'title' => esc_html__( 'WordPress', 'elementor' ),
'icon' => 'eicon-wordpress',
public function enqueue_elements_styles() {
foreach ( $this->get_element_types() as $element ) {
$element->enqueue_styles();
* Require Elementor element base class and column, section and repeater
private function require_files() {
require_once ELEMENTOR_PATH . 'includes/base/element-base.php';
require ELEMENTOR_PATH . 'includes/elements/column.php';
require ELEMENTOR_PATH . 'includes/elements/section.php';
require ELEMENTOR_PATH . 'includes/elements/repeater.php';