The Complete Guide to Removing Elementor Upsells
Elementor is a powerful tool for building WordPress websites, but its dashboard can sometimes feel cluttered with upsell ads and prompts for premium features.
In this guide, I’ll show you how to remove most Elementor upsells, allowing you to enjoy a cleaner, more focused interface. You can follow along the guide and add the code to your custom theme or you can skip the guide and download the handy plugin on Github instead.
Before we dive in, it’s worth mentioning that the simplest way to remove Elementor upsells is by purchasing and installing Elementor Pro (affiliate link). This is what I recommend, however, not everyone needs the extra features, or may not be ready to commit to the ongoing cost.
This guide may be controversial, but here’s my perspective: while I fully understand the need to generate revenue, I believe that when you create a free GPL product, users should have the freedom to modify it as they see fit.
Again, I strongly recommend you purchase Elementor Pro to access tons of awesome features and support from the developers. Have a look at the Elementor Free vs Pro article on their site to see what you would be missing out on!
If you’re not ready to upgrade to the pro version and prefer sticking with the free one, keep reading to learn how to remove the upsells for a cleaner user interface.
TL;DR Skip to the final code & plugin
WPEX_Remove_Elementor_Upsells PHP Class
Let’s start by creating our PHP class which will hold all the code necessary to remove Elementor upsells. This will keep everything tidy and structured. At the top of the class, we’ll include a check to ensure that if you upgrade to Elementor Pro, nothing gets removed or affected.
Here is our 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( ‘ElementorUtils::has_pro’ ) && ElementorUtils::has_pro() ) {
return; // bail early if we are using Elementor Pro.
}
// We will do things here…
}
}
new WPEX_Remove_Elementor_Upsells;
In the remainder of this tutorial, we’ll be adding new code within this class. It’s important to follow along closely, as skipping any section could cause you to miss essential code. Alternatively, you can skip ahead to the end and copy the complete final version of the class.
Remove “Useless” Admin Panels & Links
Elementor registers various admin pages that don’t actually do anything besides display a landing page to upgrade to the pro version. We are going to first remove the following useless pages:
- Submissions
- Custom Fonts
- Custom Icons
- Custom Code
- Add-ons (Bonus)
We’ll start out by updating our register_actions method to look like this:
/**
* Register our main class actions.
*/
public function register_actions(): void {
if ( is_callable( ‘ElementorUtils::has_pro’ ) && ElementorUtils::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 );
}
Then we’ll add a new method named remove_admin_pages to the class which will look like this:
/**
* 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, ‘ElementorModulesPromotionsAdminMenuItemsBase_Promotion_Item’ )
|| is_subclass_of( $item, ‘ElementorModulesPromotionsAdminMenuItemsBase_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] );
}
}
This code hooks takes advantage of a handy hook in the Elementor plugin so we can dynamically get a list of promotional admin pages and remove them.
Remove the Add-ons Page
You may find the Add-ons panel useful as it’s a way to locate plugins compatible with Elementor that provide additional functionality. However, most of these are premium add-ons (aka ads) and if you aren’t buying Elementor Pro, you will likely not be buying anything from this page either.
To remove the add-ons page we’ll update the previous method to have an extra check like so:
/**
* 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, ‘ElementorModulesPromotionsAdminMenuItemsBase_Promotion_Item’ )
|| is_subclass_of( $item, ‘ElementorModulesPromotionsAdminMenuItemsBase_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] );
}
}
All we did was add || ‘elementor-apps’ === $item_slug to the the if statement.
Remove Add-ons link From Admin Bar
If you removed the Add-ons page you’ll also want to remove the link in the Elementor top bar. Otherwise, if someone clicks on the link it will take them to a WordPress error page with the warning “Sorry, you are not allowed to access this page.”.
To keep things simple what we’ll do is add a little custom CSS in the WP admin that hides the link using the modern :has() selector.
Let’s add a new action to the register_actions method like such:
add_action( ‘elementor/admin_top_bar/before_enqueue_scripts’, [ $this, ‘admin_top_bar_css’ ] );
Then add the new 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;}’
);
}
This code leverages the fact that Elementor assigns specific font icons to each top bar link, allowing us to target the button directly based on its icon.
Tracking Referrals Violates the WordPress Plugin Guidelines
As of the time this article was published, Elementor is using cloaked links on their Add-ons page. So when you hover on a premium add-on “Let’s go” button you will see a target URL that looks something like this:
https://go.elementor.com/{product-slug}/
When you click and go to this link it may redirect you to a referral link. Which may be a violation of the following plugin guideline. As noted in this section:
Advertising within the WordPress dashboard should be avoided, as it is generally ineffective…Remember: tracking referrals via those ads is not permitted.
To be fair, Elementor does a decent job at disclosing how their Add-ons page works on their own site. But to be fully compliant with the WordPress guidelines (from my understanding) they should be linking to pages on their site, not adding cloaked links directly in the WP admin.
Bonus: Remove the Get Help Link
If you would also like to remove the Get Help link you can go back to our remove_admin_pages method and add the following at the bottom:
remove_submenu_page( ‘elementor’, ‘go_knowledge_base_site’ );
Next we’ll remove the pink upgrade button that displays in the admin sidebar under the Elementor parent menu item. This is technically an admin page (when visited it uses a redirection to go to their website) so it can also be removed using remove_submenu_page.
Add the following code inside (at the bottom) of the remove_admin_pages method.
remove_submenu_page( ‘elementor’, ‘go_elementor_pro’ );
Remove the “Upgrade Now” Link in the Admin Bar
The “Upgrade Now” link at the top of Elementor pages is the least intrusive upsell and, in my opinion, is done in a fairly classy way. While I personally think it’s perfectly acceptable, this guide is all about helping you remove as many upsells as possible, so I’ll show you how to get rid of it.
If you are following along and you decided to hide the add-ons page then you’ve already added the admin_top_bar_css method to your class. We’ll be updating this method to also hide the upgrade now button. If not, please scroll up and follow the steps in this section.
This is what your updated admin_top_bar_css method should look like:
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 won’t have access to the Theme Builder. Which is awesome by the way, and fully supported in our Total theme. In my opinion, Theme Builder is the primary reason you should purchase the Pro version. It will allow you to truly create a custom website.
As you probably guessed, this is also a “dummy” admin page like the pink upgrade button we removed earlier. To remove we’ll go back to our remove_admin_pages method and add the following at the bottom:
if ( ! isset( $_GET[‘page’] ) || ‘elementor-app’ !== $_GET[‘page’] ) {
remove_submenu_page( ‘edit.php?post_type=elementor_library’, ‘elementor-app’ );
}
We add an extra check for the the page query parameter, otherwise, the Kit Library will stop working.
Remove the Theme Builder Admin-Bar Link
Elementor also adds the Theme Builder link to the user admin bar when logged in and viewing the frontend of your site. Which, again, if you click the link you are taken to a useless page where you can’t do anything as a free user.
To remove this link we’ll first need to add a new action to our register_actions method:
add_filter( ‘elementor/frontend/admin_bar/settings’, [ $this, ‘modify_admin_bar’ ], PHP_INT_MAX );
Then we’ll add a new modify_admin_bar method to the bottom of our 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;
}
Elementor also includes all the premium widgets in the widget selector, which I understand as a way to show users what they’re missing. However, it can be quite frustrating when searching for items, especially if you’re using an add-on plugin that registers widgets with similar names.
We’re not technically “removing” the widgets, so we won’t free up any memory. However, we can hide them using CSS to clean up and slim down the sidebar.
Let’s add a new action to our register_actions method:
add_action( ‘elementor/editor/after_enqueue_styles’, [ $this, ‘editor_css’ ] );
Then we’ll add the following method to the bottom of our class:
/**
* 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;}’
);
}
In order to remove the banner from the sidebar in the Elementor widget we’ll use CSS as well. We’ll simply update the previous snippet to include a few more elements like such:
/**
* 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 first open the Elementor editor, you’ll notice a sticky notice bar at the bottom of the page. Because, of course, there can never be too many upsells, right? While you can click the “X” to close it, this won’t stop it from reappearing later (14 days later).
Let’s go back to our editor_css method and update it to include the e-notice-bar classname. Here is the updated 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{display:none!important;}’
);
}
I’m sure many of you, like me, don’t spend much time on the WordPress “Dashboard” page. However, this is the default page you’re redirected to when you log into WordPress. Elementor adds a custom widget to the dashboard that displays a feed from their blog—and of course, more upsell links!
Add the following to the register_actions method:
add_action( ‘wp_dashboard_setup’, [ $this, ‘remove_dashboard_widget’ ], PHP_INT_MAX );
Then 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 along you should now have a class that looks 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( ‘ElementorUtils::has_pro’ ) && ElementorUtils::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, ‘ElementorModulesPromotionsAdminMenuItemsBase_Promotion_Item’ )
|| is_subclass_of( $item, ‘ElementorModulesPromotionsAdminMenuItemsBase_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;}’
);
}
/**
* 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 dashboard widget.
*/
public function remove_dashboard_widget(): void {
remove_meta_box( ‘e-dashboard-overview’, ‘dashboard’, ‘normal’ );
}
}
new WPEX_Remove_Elementor_Upsells;
You can copy and paste this code into your custom WordPress parent or child theme functions.php file or include it via it’s own file (recommended).
Alternatively, I added the code into a handy plugin that you can download from Github and install on your site. I won’t be uploading this plugin to the WordPress repository, so if it ever needs updating you will need to manually patch it.
Conclusion
If it’s within your budget, you should head over and purchase Elementor Pro (affiliate link). Even if you don’t need any of the premium features, if you use Elementor at all, it’s good to give back to the developers and help support the product.
Did I Miss Anything? Which Plugin is Next?
If there is a plugin you are using that bombards you with advertisements and promos, mention me @wpexplorer (on X/Twitter). If the plugin is popular enough I may consider writing as similar guide for that one next.
Or if I missed anything in Elementor let me know!