Elementor is a popular website builder for WordPress, but the free version often includes numerous upsell prompts that can clutter the interface.
This guide will show you how to minimize these distractions, providing a cleaner, more focused user experience. You can follow the steps to implement the code changes yourself, or use a pre-built plugin.
TL;DR Jump to the final code & plugin.
Hiding Promo Widgets
One of the most effective ways to streamline your Elementor experience is by hiding the promotional widgets. These widgets, which are part of the Pro version, can clutter your workspace, especially if you use add-on plugins with similarly named widgets.
While this method doesn’t technically remove the widgets and free up memory, it uses CSS to hide them, cleaning up your sidebar.
Step 1: Add a new action to the register_actions
method in your PHP class:
add_action( 'elementor/editor/after_enqueue_styles', [ $this, 'editor_css' ] );
Step 2: Add the following method to the bottom of your class to inject custom CSS:
/**
* Hide elements in the editor.
*/
public function editor_css(): void {
wp_add_inline_style(
'elementor-editor',
'.elementor-element-wrapper.elementor-element--promotion,#elementor-panel-category-pro-elements,#elementor-panel-category-theme-elements,#elementor-panel-category-theme-elements-single,#elementor-panel-category-woocommerce-elements{display:none!important;}'
);
}
WPEX_Remove_Elementor_Upsells PHP Class
Let’s create a PHP class to house all the code for removing Elementor upsells. This approach keeps your code organized. The class includes a check to prevent modifications if you upgrade to Elementor Pro.
Here’s the starter class:
/**
* Remove Elementor Upsells.
*/
class WPEX_Remove_Elementor_Upsells {
/**
* Constructor.
*/
public function __construct() {
if ( did_action( 'elementor/loaded' ) ) {
$this->register_actions();
} else {
add_action( 'elementor/loaded', [ $this, 'register_actions' ] );
}
}
/**
* Register our main class actions.
*/
public function register_actions(): void {
if ( is_callable( 'Elementor\Utils::has_pro' ) && Elementor\Utils::has_pro() ) {
return; // bail early if we are using Elementor Pro.
}
// We will do things here...
}
}
new WPEX_Remove_Elementor_Upsells;
Remember to add the code snippets provided in the following sections inside this class.
Remove “Useless” Admin Panels & Links
Elementor creates several admin pages that serve primarily as advertisements for the Pro version. These pages offer little to no functionality for free users. This section details how to remove these admin panels. The “useless” pages are:
-
Submissions.
-
Custom Fonts.
-
Custom Icons.
-
Custom Code.
-
Add-ons (Bonus).
Step 1: Update the register_actions
method to include an action hook:
/**
* Register our main class actions.
*/
public function register_actions(): void {
if ( is_callable( 'Elementor\Utils::has_pro' ) && Elementor\Utils::has_pro() ) {
return; // bail early if we are using Elementor Pro.
}
add_action( 'elementor/admin/menu/after_register', [ $this, 'remove_admin_pages' ], PHP_INT_MAX, 2 );
}
Step 2: Add a new method named remove_admin_pages
to the class to remove the promotional pages dynamically:
/**
* Remove admin pages.
*/
public function remove_admin_pages( $menu_manager, $hooks ): void {
$pages_to_remove = [];
$subpages_to_remove = [];
if ( is_callable( [ $menu_manager, 'get_all' ] ) ) {
foreach ( (array) $menu_manager->get_all() as $item_slug => $item ) {
if ( isset( $hooks[ $item_slug ] )
&& is_object( $item )
&& ( is_subclass_of( $item, 'Elementor\Modules\Promotions\AdminMenuItems\Base_Promotion_Item' )
|| is_subclass_of( $item, 'Elementor\Modules\Promotions\AdminMenuItems\Base_Promotion_Template' )
)
) {
$parent_slug = is_callable( [ $item, 'get_parent_slug' ] ) ? $item->get_parent_slug() : '';
if ( ! empty( $parent_slug ) ) {
$subpages_to_remove[] = [ $parent_slug, $item_slug ];
} else {
$pages_to_remove[] = $hooks[ $item_slug ];
}
}
}
}
foreach ( $pages_to_remove as $menu_slug ) {
remove_menu_page( $menu_slug );
}
foreach ( $subpages_to_remove as $subpage ) {
remove_submenu_page( $subpage[0], $subpage[1] );
}
}
Remove the Add-ons Page
Although the Add-ons
panel can help you find Elementor-compatible plugins, many are premium add-ons, which might not be useful if you’re not using Elementor Pro.
Step 1: To remove the add-ons page, update the remove_admin_pages
method with an extra check:
/**
* Remove admin pages.
*/
public function remove_admin_pages( $menu_manager, $hooks ): void {
$pages_to_remove = [];
$subpages_to_remove = [];
if ( is_callable( [ $menu_manager, 'get_all' ] ) ) {
foreach ( (array) $menu_manager->get_all() as $item_slug => $item ) {
if ( isset( $hooks[ $item_slug ] )
&& is_object( $item )
&& ( is_subclass_of( $item, 'Elementor\Modules\Promotions\AdminMenuItems\Base_Promotion_Item' )
|| is_subclass_of( $item, 'Elementor\Modules\Promotions\AdminMenuItems\Base_Promotion_Template' )
|| 'elementor-apps' === $item_slug
)
) {
$parent_slug = is_callable( [ $item, 'get_parent_slug' ] ) ? $item->get_parent_slug() : '';
if ( ! empty( $parent_slug ) ) {
$subpages_to_remove[] = [ $parent_slug, $item_slug ];
} else {
$pages_to_remove[] = $hooks[ $item_slug ];
}
}
}
}
foreach ( $pages_to_remove as $menu_slug ) {
remove_menu_page( $menu_slug );
}
foreach ( $subpages_to_remove as $subpage ) {
remove_submenu_page( $subpage[0], $subpage[1] );
}
}
Add || 'elementor-apps' === $item_slug
to the if
statement.
Remove Add-ons Link From Admin Bar
If you remove the Add-ons
page, it’s best to remove the link from the Elementor top bar to avoid a WordPress error page when clicked.
Step 1: Add a new action to the register_actions
method:
add_action( 'elementor/admin_top_bar/before_enqueue_scripts', [ $this, 'admin_top_bar_css' ] );
Step 2: Add the add_css_to_elementor_admin
method to the bottom of the class:
/**
* Add inline CSS to modify the Elementor admin top bar.
*/
public function admin_top_bar_css(): void {
wp_add_inline_style(
'elementor-admin-top-bar',
'.e-admin-top-bar__bar-button:has(.eicon-integration){display:none!important;}'
);
}
Remove the Sidebar Pink Upgrade Button
This removes the pink “Upgrade” button that appears in the admin sidebar under the Elementor menu.
Step 1: Add the following code inside the remove_admin_pages
method:
remove_submenu_page( 'elementor', 'go_elementor_pro' );
Remove the “Upgrade Now” Link in the Admin Bar
This removes the “Upgrade Now” link at the top of Elementor pages.
Step 1: Update the admin_top_bar_css
method to also hide the upgrade now
button.
public function admin_top_bar_css(): void {
$target_icon_classes = [
'.eicon-integration', // Add-ons
'.eicon-upgrade-crown', // Upgrade now
];
wp_add_inline_style(
'elementor-admin-top-bar',
'.e-admin-top-bar__bar-button:has(' . implode( ',', $target_icon_classes ) . '){display:none!important;}'
);
}
Remove the Theme Builder
As a free user, you don’t have access to the Theme Builder. This removes the Theme Builder link.
Step 1: In the remove_admin_pages
method, add:
if ( ! isset( $_GET['page'] ) || 'elementor-app' !== $_GET['page'] ) {
remove_submenu_page( 'edit.php?post_type=elementor_library', 'elementor-app' );
}
Add an extra check for the page
query parameter to prevent the Kit Library from malfunctioning.
Remove the Theme Builder Admin-Bar Link
Elementor adds a Theme Builder link to the user admin bar when logged in and viewing the frontend of your site. This removes that link.
Step 1: Add a new action to the register_actions
method:
add_filter( 'elementor/frontend/admin_bar/settings', [ $this, 'modify_admin_bar' ], PHP_INT_MAX );
Step 2: Add a new modify_admin_bar
method to the bottom of the class:
/**
* Modify the admin bar links.
*/
public function modify_admin_bar( $admin_bar_config ) {
if ( isset( $admin_bar_config['elementor_edit_page']['children'] )
&& is_array( $admin_bar_config['elementor_edit_page']['children'] )
) {
foreach ( $admin_bar_config['elementor_edit_page']['children'] as $k => $item ) {
if ( isset( $item['id'] ) && 'elementor_app_site_editor' === $item['id'] ) {
unset( $admin_bar_config['elementor_edit_page']['children'][ $k ] );
break;
}
}
}
return $admin_bar_config;
}
Remove the Editor Sidebar Banner
To remove the banner from the sidebar in the Elementor widget, use CSS. Update the previous CSS snippet to include a few more elements.
Step 1: Update the editor_css
method:
/**
* Hide elements in the editor.
*/
public function editor_css(): void {
wp_add_inline_style(
'elementor-editor',
'.elementor-element-wrapper.elementor-element--promotion,#elementor-panel-category-pro-elements,#elementor-panel-category-theme-elements,#elementor-panel-category-theme-elements-single,#elementor-panel-category-woocommerce-elements,#elementor-panel-get-pro-elements,#elementor-panel-get-pro-elements-sticky{display:none!important;}'
);
}
Remove the Editor Notice Bar
When you open the Elementor editor, you’ll see a sticky notice bar at the bottom of the page.
Step 1: Update the editor_css
method to include the e-notice-bar
classname.
/**
* Hide elements in the editor.
*/
public function editor_css(): void {
wp_add_inline_style(
'elementor-editor',
'.e-notice-bar,.elementor-element-wrapper.elementor-element--promotion,#elementor-panel-category-pro-elements,#elementor-panel-category-theme-elements,#elementor-panel-category-theme-elements-single,#elementor-panel-category-woocommerce-elements,#elementor-panel-get-pro-elements,#elementor-panel-get-pro-elements-sticky{display:none!important;}'
);
}
Remove the Dynamic Content Button
Dynamic Tags are only available for Pro users. There’s no point in seeing the button if you can’t use it.
Step 1: To remove the dynamic content button, update the editor_css
method:
/**
* Hide elements in the editor.
*/
public function editor_css(): void {
wp_add_inline_style(
'elementor-editor',
'.e-notice-bar,.elementor-element-wrapper.elementor-element--promotion,#elementor-panel-category-pro-elements,#elementor-panel-category-theme-elements,#elementor-panel-category-theme-elements-single,#elementor-panel-category-woocommerce-elements,#elementor-panel-get-pro-elements,#elementor-panel-get-pro-elements-sticky,.elementor-control-dynamic-switcher{display:none!important;}.elementor-control-type-wysiwyg .tmce-active .switch-html{border-inline-end:0;}'
);
}
Hide Locked Element Settings
Elementor adds element settings that aren’t usable in the free version. These settings show a lock icon. Hiding these cleans up the interface.
Step 1: Update the editor_css
method:
/**
* Hide elements in the editor.
*/
public function editor_css(): void {
wp_add_inline_style(
'elementor-editor',
'.e-notice-bar,.elementor-element-wrapper.elementor-element--promotion,#elementor-panel-category-pro-elements,#elementor-panel-category-theme-elements,#elementor-panel-category-theme-elements-single,#elementor-panel-category-woocommerce-elements,#elementor-panel-get-pro-elements,#elementor-panel-get-pro-elements-sticky,.elementor-control-dynamic-switcher,.elementor-control:has(.e-control-promotion__lock-wrapper){display:none!important;}.elementor-control-type-wysiwyg .tmce-active .switch-html{border-inline-end:0;}'
);
}
Remove Admin Dashboard Widget
Elementor adds a custom widget to the WordPress dashboard that displays a feed from their blog and upsell links.
Step 1: Add the following to the register_actions
method:
add_action( 'wp_dashboard_setup', [ $this, 'remove_dashboard_widget' ], PHP_INT_MAX );
Step 2: Add the following method to the bottom of the class:
/**
* Remove dashboard widget.
*/
public function remove_dashboard_widget(): void {
remove_meta_box( 'e-dashboard-overview', 'dashboard', 'normal' );
}
Final Code & Plugin
If you followed the steps, your class should look like this:
/**
* Remove Elementor Upsells.
*/
class WPEX_Remove_Elementor_Upsells {
/**
* Constructor.
*/
public function __construct() {
if ( did_action( 'elementor/loaded' ) ) {
$this->register_actions();
} else {
add_action( 'elementor/loaded', [ $this, 'register_actions' ] );
}
}
/**
* Register our main class actions.
*/
public function register_actions(): void {
if ( is_callable( 'Elementor\Utils::has_pro' ) && Elementor\Utils::has_pro() ) {
return; // bail early if we are using Elementor Pro.
}
add_action( 'elementor/admin/menu/after_register', [ $this, 'remove_admin_pages' ], PHP_INT_MAX, 2 );
add_action( 'elementor/admin_top_bar/before_enqueue_scripts', [ $this, 'admin_top_bar_css' ] );
add_filter( 'elementor/frontend/admin_bar/settings', [ $this, 'modify_admin_bar' ], PHP_INT_MAX );
add_action( 'elementor/editor/after_enqueue_styles', [ $this, 'editor_css' ] );
add_action( 'wp_dashboard_setup', [ $this, 'remove_dashboard_widget' ], PHP_INT_MAX );
}
/**
* Remove admin pages.
*/
public function remove_admin_pages( $menu_manager, $hooks ): void {
$pages_to_remove = [];
$subpages_to_remove = [];
if ( is_callable( [ $menu_manager, 'get_all' ] ) ) {
foreach ( (array) $menu_manager->get_all() as $item_slug => $item ) {
if ( isset( $hooks[ $item_slug ] )
&& is_object( $item )
&& ( is_subclass_of( $item, 'Elementor\Modules\Promotions\AdminMenuItems\Base_Promotion_Item' )
|| is_subclass_of( $item, 'Elementor\Modules\Promotions\AdminMenuItems\Base_Promotion_Template' )
|| 'elementor-apps' === $item_slug
)
) {
$parent_slug = is_callable( [ $item, 'get_parent_slug' ] ) ? $item->get_parent_slug() : '';
if ( ! empty( $parent_slug ) ) {
$subpages_to_remove[] = [ $parent_slug, $item_slug ];
} else {
$pages_to_remove[] = $hooks[ $item_slug ];
}
}
}
}
foreach ( $pages_to_remove as $menu_slug ) {
remove_menu_page( $menu_slug );
}
foreach ( $subpages_to_remove as $subpage ) {
remove_submenu_page( $subpage[0], $subpage[1] );
}
remove_submenu_page( 'elementor', 'go_knowledge_base_site' );
remove_submenu_page( 'elementor', 'go_elementor_pro' );
if ( ! isset( $_GET['page'] ) || 'elementor-app' !== $_GET['page'] ) {
remove_submenu_page( 'edit.php?post_type=elementor_library', 'elementor-app' );
}
}
/**
* Add inline CSS to modify the Elementor admin top bar.
*/
public function admin_top_bar_css(): void {
$target_icon_classes = [
'.eicon-integration', // Add-ons
'.eicon-upgrade-crown', // Upgrade now
];
wp_add_inline_style(
'elementor-admin-top-bar',
'.e-admin-top-bar__bar-button:has(' . implode( ',', $target_icon_classes ) . '){display:none!important;}'
);
}
/**
* Modify the admin bar links.
*/
public function modify_admin_bar( $admin_bar_config ) {
if ( isset( $admin_bar_config['elementor_edit_page']['children'] )
&& is_array( $admin_bar_config['elementor_edit_page']['children'] )
) {
foreach ( $admin_bar_config['elementor_edit_page']['children'] as $k => $item ) {
if ( isset( $item['id'] ) && 'elementor_app_site_editor' === $item['id'] ) {
unset( $admin_bar_config['elementor_edit_page']['children'][ $k ] );
break;
}
}
}
return $admin_bar_config;
}
/**
* Hide elements in the editor.
*/
public function editor_css(): void {
wp_add_inline_style(
'elementor-editor',
'.e-notice-bar,.elementor-element-wrapper.elementor-element--promotion,#elementor-panel-category-pro-elements,#elementor-panel-category-theme-elements,#elementor-panel-category-theme-elements-single,#elementor-panel-category-woocommerce-elements,#elementor-panel-get-pro-elements,#elementor-panel-get-pro-elements-sticky,.elementor-control-dynamic-switcher,.elementor-control:has(.e-control-promotion__lock-wrapper){display:none!important;}.elementor-control-type-wysiwyg .tmce-active .switch-html{border-inline-end:0;}'
);
}
/**
* Remove dashboard widget.
*/
public function remove_dashboard_widget(): void {
remove_meta_box( 'e-dashboard-overview', 'dashboard', 'normal' );
}
}
new WPEX_Remove_Elementor_Upsells;
Copy this code into your custom WordPress parent or child theme’s functions.php
file or include it via its own file (recommended).
If you use Elementor, supporting the developers by purchasing Elementor Pro is a great way to give back, even if you don’t need the premium features.