Gibt es eine Möglichkeit, alle verwendeten / nicht verwendeten WP-Vorlagen aufzulisten?

7

Ich arbeite daran, eine Site zu optimieren, deren Verwaltung ich kürzlich übernommen habe, und es scheint mir, dass es einige unbenutzte Vorlagen gibt. Ich möchte alle nicht verwendeten und redundanten Vorlagendateien entfernen, damit wir unsere Entwicklungen auf die von uns unterstützten Vorlagen konzentrieren können. Es gibt jedoch mehr als 100 Seiten und Beiträge auf dieser Website, sodass ich nicht einfach eine Stichprobe durchführen kann, die ich benötige eine robuste Abfrage.

Ich habe festgelegt, wie abgefragt werden soll, welche Seitenvorlage beim Verbinden von wp_posts und wp_postmeta aufgerufen wird, und ich habe herausgefunden, welche Postformate verwendet werden, indem wp_posts und wp_terms über wp_term_relationships abgefragt werden, ABER ... das scheint immer noch nicht zu sagen mir, ob die index.php jemals verwendet wird (und ich glaube nicht, dass es so ist).

Ich vermisse wahrscheinlich etwas Offensichtliches, aber gibt es eine Möglichkeit zu sehen, welche der normalen Wordpress-Themendateien tatsächlich aufgerufen werden? ODER ist es so, dass ich bereits alle Informationen habe und 'index.php' einfach nicht verwendet wird.

Jede Hilfe wäre sehr dankbar!

Vielen Dank

James T.
quelle
1
Hoffentlich kann dieser Ansatz helfen?
Birgire

Antworten:

5

Hier ist eine grobe Funktion, die ich verwende, um damit umzugehen. Sie sollte für jeden gut funktionieren, der dies schnell und einfach tun möchte. Fügen Sie diese Datei Ihre functions.php hinzu und besuchen Sie dann Ihre Site mit ?template_reportder URL, um einen Bericht für jede benutzerdefinierte Designvorlage anzuzeigen.

Es ist rau, ich würde vorschlagen, den add_actionAnruf zu kommentieren / zu kommentieren , wenn Sie ihn verwenden möchten.

/**
 * Theme Template Usage Report
 *
 * Displays a data dump to show you the pages in your WordPress
 * site that are using custom theme templates.
 */
function theme_template_usage_report( $file = false ) {
    if ( ! isset( $_GET['template_report'] ) ) return;

    $templates = wp_get_theme()->get_page_templates();
    $report = array();

    echo '<h1>Page Template Usage Report</h1>';
    echo "<p>This report will show you any pages in your WordPress site that are using one of your theme's custom templates.</p>";

    foreach ( $templates as $file => $name ) {
        $q = new WP_Query( array(
            'post_type' => 'page',
            'posts_per_page' => -1,
            'meta_query' => array( array(
                'key' => '_wp_page_template',
                'value' => $file
            ) )
        ) );

        $page_count = sizeof( $q->posts );

        if ( $page_count > 0 ) {
            echo '<p style="color:green">' . $file . ': <strong>' . sizeof( $q->posts ) . '</strong> pages are using this template:</p>';
            echo "<ul>";
            foreach ( $q->posts as $p ) {
                echo '<li><a href="' . get_permalink( $p, false ) . '">' . $p->post_title . '</a></li>';
            }
            echo "</ul>";
        } else {
            echo '<p style="color:red">' . $file . ': <strong>0</strong> pages are using this template, you should be able to safely delete it from your theme.</p>';
        }

        foreach ( $q->posts as $p ) {
            $report[$file][$p->ID] = $p->post_title;
        }
    }

    exit;
}
add_action( 'wp', 'theme_template_usage_report' );

Die Ausgabe sieht folgendermaßen aus:

Geben Sie hier die Bildbeschreibung ein

Kevin Leary
quelle
Das funktioniert sehr gut! Einfach und effektiv. Vielen Dank.
MiB
1

Es gibt keine Abfrage, die alle Themendateien identifiziert, die aktiv verwendet werden oder nicht verwendet werden. Die einzige mir bekannte Abfrage, die einige Themendateien identifiziert, ist:

SELECT * FROM wp_postmeta WHERE meta_key = '_wp_page_template';

Dadurch werden alle benutzerdefinierten Seitenvorlagen identifiziert, die verwendet werden. Standard-Themendateien wie index.php, single.php, header.php, footer.php werden nicht identifiziert, da dies keine benutzerdefinierten Seitenvorlagen sind. Es wird empfohlen, index.php einzuschließen, da dies ein Standard / Fallback ist, wenn jemals ein Problem mit spezifischeren Themendateien auftritt. In vielen Fällen wird die Datei nie verwendet, aber es ist immer gut, sie dort zu haben, und sie zeigt Ihnen normalerweise die Barebone-HTML-Struktur der Site. Dies kann ein hilfreicher Hinweis sein, bevor Sie in individuellere Dateien eintauchen.

Wenn Sie den Reverse-Engineering-Pfad fortsetzen möchten, würde ich vorschlagen, Ihren Theme-Datei-ID-Code in die (als Kommentar, wenn es sich um eine Live-Site handelt) aufzunehmen und jede URL manuell durchzugehen. Wenn Sie ein Plugin verwenden, das eine XML-Sitemap generiert, können Sie sicherstellen, dass Sie jede URL treffen. Denken Sie daran, dass die identifizierte Datei wahrscheinlich nicht die einzige verwendete Datei ist. Wenn Ihre Posts beispielsweise die Standardeinstellung verwenden single.php, wird sie höchstwahrscheinlich header.phpund footer.phpmindestens verwendet. Einige Themen verwenden Vorlagenteile oder -einschlüsse. Nachdem Sie also Ihre erste Liste der übergreifenden Vorlage für jede URL erstellt haben, müssen Sie jede dieser Vorlagen durchsuchen und bestimmen, welche Dateien sie aufrufen. Sie werden auch überprüfen wollenfunctions.php für die in die Warteschlange gestellten Stylesheets und JS sowie möglicherweise andere Includes.

Eine Alternative zu diesem langen Prozess besteht darin, das Thema von Grund auf neu zu erstellen. Ich verstehe, dass dies nicht immer möglich ist, aber es ist die sauberste Lösung, und es wird wahrscheinlich weniger Zeit in Anspruch nehmen und weniger riskant sein, als zu versuchen, Teile eines alten komplexen Themas langsam zu entfernen. Für diesen Prozess identifiziere ich die am häufigsten verwendeten Vorlagen (wenn Sie 50 von einem CPT-Start dort haben) und codiere diese zuerst auf einer Entwicklungs- / Staging-Site, importiere oder kopiere mindestens eine Handvoll von jedem Beitragstyp und baue von dort aus weiter. Noch einmal, Sie müssen mindestens den größten Teil der Website durchgehen, um sicherzustellen, dass Sie Anpassungen nicht übersehen. Die einzige Möglichkeit, 100% sicher zu sein, dass Sie alles abgefangen haben, besteht darin, jede URL zu überprüfen.

WebElaine
quelle
0

Legen Sie diesen Code in functions.php ab und melden Sie sich bei einem Benutzer an, der die manage_optionsMöglichkeit hat, eine Seite mit den nicht verwendeten Vorlagen zu erstellen.

Ich rate davon ab, index.php zu entfernen, da es Teil der WP-Vorlagenhierarchie ist und die allerletzte Sicherungsvorlage für alles ist, was nichts anderes zu verwenden hat.

// Hook into admin_menu
add_action( 'admin_menu', function() {

    // Add submenu page under "Tools" with manage_options capabilities
    add_submenu_page( 'tools.php', 'Page Templates Statistics', 'Page Templates Statistics', 'manage_options', 'page-template-statistics', 'wpse_260813_show_satistics' );
} );

// Function that renders the page added above
function wpse_260813_show_satistics() {

    // Get available templates within active theme
    $available_templates = get_page_templates();

    // Get used templates from database
    global $wpdb;
    $result = $wpdb->get_results(
        "
            SELECT DISTINCT( meta.meta_value ) FROM {$wpdb->prefix}postmeta as meta
            JOIN {$wpdb->prefix}posts as posts ON posts.ID = meta.post_id
            WHERE meta.meta_key LIKE '_wp_page_template'
            AND posts.post_type = 'page'
        "
    );

    $used_templates = array();
    foreach ( $result as $template ) {
        $used_templates[] = $template->meta_value;
    }

    /**
     * Compare available templates against used templates
     * Result is an array with the unused templates
     */
    $unused_templates = array_diff( $available_templates, $used_templates );

    // Draw page to show unused templates
?>
    <div class="wrap">
        <h1>Page Template Statistics</h1>
        The following templates are not being used:
        <table>
            <tr>
                <th>Template name</th>
                <th>Filename</th>
            </tr>
            <?php foreach ( $unused_templates as $name => $file ) : ?>
                <tr>
                    <td><?php echo $name; ?></td>
                    <td><?php echo $file; ?></td>
                </tr>
        <?php endforeach; ?>
        </table>
    </div>
<?php
}
Jeffrey von Grumbkow
quelle
Dadurch werden die übergeordneten PHP-Dateien gefunden, aber keine Vorlagenteile oder -einschlüsse. Außerdem identifiziert die zweite Abfrage nur Seitenvorlagen - sie zeigt Ihnen nicht, wo header.php, footer.php, index.php, single.php usw. verwendet werden, wie OP es verlangt.
WebElaine
OP fragt nach gebrauchten / nicht verwendeten WP-Vorlagendateien, genau das tut dies. Das Finden von Vorlagenteilen und / oder Includes gehört nicht dazu. Der Grund, warum OP diese finden möchte, besteht darin, nicht verwendete Dateien zu entfernen. Da Dateien wie index.php, header.php sowieso nicht gelöscht werden sollten, ist dies in diesem Szenario kein Problem.
Jeffrey von Grumbkow
0

Sie können die gesamte Site crawlen und die Ergebnisse für get_included_files()Ihre Vorlagendateien abgleichen.

Dan Knauss
quelle
-4

Du meinst so etwas?

$args = array(
    'meta_key' => '_wp_page_template',
    'meta_value' => 'page-special.php'
);

wp_count_posts( $args );
Netanel Perez
quelle
Bitte bearbeiten Sie Ihre Antwort und fügen Sie eine Erklärung hinzu: Warum könnte das das Problem lösen?
Fuxia