Wenn Unlimited Elements oder ein anderes Elementor-Addon entfernt werden soll, muss zuerst geklärt werden, auf welchen Seiten und in welchen Templates dessen Widgets noch verwendet werden.
Der folgende Code durchsucht die gespeicherten Elementor-Daten direkt in der WordPress-Datenbank und zeigt alle Fundstellen in einer übersichtlichen Admin-Tabelle an.
Besonders praktisch: Für jede Fundstelle gibt es einen direkten Link zum Elementor-Editor und zum normalen WordPress-Editor.
Was der Widget-Finder macht
- durchsucht alle aktuellen Elementor-Dokumente nach definierten Widget-IDs
- berücksichtigt Seiten, Beiträge, CPTs und Elementor-Templates
- ignoriert Revisionen und Auto-Drafts
- zeigt den Namen des gefundenen Widgets
- zeigt Seite bzw. Template und Post-ID
- zeigt Beitragstyp und Status
- zählt, wie oft das Widget im jeweiligen Elementor-Dokument vorkommt
- bietet direkte Buttons zum Elementor- und WordPress-Editor
Einbau
Der Code kann vorübergehend als Snippet oder in einem MU-Plugin eingebaut werden. Danach erscheint im WordPress-Backend unter Werkzeuge → UE Widget-Finder eine eigene Seite. Zugriff haben ausschließlich Benutzer mit der Berechtigung manage_options.
Code
<?php
add_action('admin_menu', function () {
add_management_page(
'UE Widget-Finder',
'UE Widget-Finder',
'manage_options',
'ue-widget-finder',
'i2_ue_widget_finder_page'
);
});
function i2_ue_widget_finder_page() {
if (!current_user_can('manage_options')) {
return;
}
global $wpdb;
$widgets = [
'ucaddon_uc_card_post_carousel' => 'Post Carousel Lite',
'ucaddon_post_grid' => 'Post Grid',
'ucaddon_ue_side_menu' => 'Side Menu',
'ucaddon_content_accordion' => 'Content Accordion',
'ucaddon_ue_unfold' => 'Unfold Content',
'ucaddon_content_carousel_new' => 'Content Carousel',
'ucaddon_ue_buttons_post_filter' => 'Tabs Filter',
'ucaddon_load_more_filter' => 'Load More / Infinite Scroll',
];
$results = [];
foreach ($widgets as $widget_id => $widget_name) {
$like = '%' . $wpdb->esc_like($widget_id) . '%';
/*
* Direkt nur aktuelle Posts/Templates durchsuchen.
* Revisionen und Auto-Drafts interessieren uns nicht.
*/
$rows = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
p.ID,
p.post_title,
p.post_type,
p.post_status,
pm.meta_value
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm
ON pm.post_id = p.ID
WHERE pm.meta_key = '_elementor_data'
AND pm.meta_value LIKE %s
AND p.post_type != 'revision'
AND p.post_status != 'auto-draft'
ORDER BY p.post_type, p.post_title
",
$like
)
);
foreach ($rows as $row) {
/*
* Anzahl der Vorkommen innerhalb dieses
* Elementor-Dokuments.
*/
$count = substr_count(
$row->meta_value,
$widget_id
);
$post_type_object = get_post_type_object(
$row->post_type
);
$post_type_label = $post_type_object
? $post_type_object->labels->singular_name
: $row->post_type;
$results[] = [
'widget' => $widget_name,
'widget_id' => $widget_id,
'id' => (int) $row->ID,
'title' => $row->post_title ?: '(ohne Titel)',
'post_type' => $post_type_label,
'post_status' => $row->post_status,
'count' => $count,
];
}
}
?>
<div class="wrap">
<h1>Unlimited Elements – Widget-Finder</h1>
<p>
Aktuelle Elementor-Seiten und Templates.
Revisionen werden nicht berücksichtigt.
</p>
<?php if (!$results) : ?>
<div class="notice notice-warning inline">
<p>Keine Unlimited-Elements-Widgets gefunden.</p>
</div>
<?php else : ?>
<table class="widefat striped">
<thead>
<tr>
<th>Widget</th>
<th>Seite / Template</th>
<th>Typ</th>
<th>Status</th>
<th>Anzahl</th>
<th>Bearbeiten</th>
</tr>
</thead>
<tbody>
<?php foreach ($results as $item) : ?>
<?php
$elementor_url = admin_url(
'post.php?post=' .
$item['id'] .
'&action=elementor'
);
$wp_url = get_edit_post_link(
$item['id']
);
?>
<tr>
<td>
<strong>
<?php echo esc_html($item['widget']); ?>
</strong>
<br>
<small>
<?php echo esc_html($item['widget_id']); ?>
</small>
</td>
<td>
<strong>
<?php echo esc_html($item['title']); ?>
</strong>
<br>
<small>
ID <?php echo (int) $item['id']; ?>
</small>
</td>
<td>
<?php echo esc_html($item['post_type']); ?>
</td>
<td>
<?php echo esc_html($item['post_status']); ?>
</td>
<td>
<strong>
<?php echo (int) $item['count']; ?>×
</strong>
</td>
<td>
<a
href="<?php echo esc_url($elementor_url); ?>"
class="button button-primary"
target="_blank"
>
Elementor
</a>
<?php if ($wp_url) : ?>
<a
href="<?php echo esc_url($wp_url); ?>"
class="button"
target="_blank"
>
WP
</a>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
</div>
<?php
}Unlimited-Elements-Widget-IDs
Im Array $widgets werden die Widget-IDs eingetragen, nach denen gesucht werden soll:
$widgets = [
'ucaddon_uc_card_post_carousel' => 'Post Carousel Lite',
'ucaddon_post_grid' => 'Post Grid',
'ucaddon_ue_side_menu' => 'Side Menu',
'ucaddon_content_accordion' => 'Content Accordion',
'ucaddon_ue_unfold' => 'Unfold Content',
'ucaddon_content_carousel_new' => 'Content Carousel',
'ucaddon_ue_buttons_post_filter' => 'Tabs Filter',
'ucaddon_load_more_filter' => 'Load More / Infinite Scroll',
];Links steht jeweils die interne Widget-ID, rechts ein frei wählbarer verständlicher Name für die Ausgabe im Backend.
Weitere Widgets ergänzen
Wird später ein weiteres Unlimited-Elements-Widget gefunden, muss lediglich dessen interne Widget-ID ergänzt werden:
'interne_widget_id' => 'Anzeigename',Die interne ID findet man beispielsweise in den gespeicherten Elementor-Daten oder über die Browser-Entwicklertools bzw. durch Vergleich mit einem bekannten Elementor-Dokument.
Auch für andere Elementor-Addons verwendbar
Das Grundprinzip ist nicht auf Unlimited Elements beschränkt. Elementor speichert den Seitenaufbau im Post-Meta-Feld _elementor_data. Der Finder sucht darin lediglich nach bestimmten Zeichenketten.
Kennt man die internen Widget-IDs eines anderen Elementor-Addons, kann dasselbe Werkzeug deshalb auch verwendet werden, um dessen Widgets vor einer Deinstallation auf der gesamten Website aufzuspüren.
Wichtig vor dem Löschen eines Addons
Erst wenn der Widget-Finder keine Fundstellen mehr meldet, sollte das betreffende Addon deaktiviert werden. Anschließend die Website noch einmal vollständig kontrollieren, bevor das Plugin endgültig gelöscht wird.