Elementor Widget-Finder – Unlimited-Elements-Widgets auf der gesamten Website finden

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.