web-dev-qa-db-fra.com

Y a-t-il un moyen de lister tous les objets utilisés/non utilisés WP des modèles?

Je travaille à l'optimisation d'un site dont j'ai récemment pris la gestion et il me semble qu'il existe assez peu de modèles inutilisés. Je souhaite supprimer tous les fichiers de modèles inutilisés et redondants afin que nous puissions concentrer nos développements sur les modèles que nous prenons en charge. Toutefois, ce site contient plus de 100 pages et articles, je ne peux donc pas simplement effectuer une vérification sur place. une requête robuste.

J'ai établi comment demander quel modèle de page est appelé en rejoignant wp_posts et wp_postmeta, et j'ai recherché quels formats de publication sont utilisés en interrogeant wp_posts et wp_terms via wp_term_relationships moi si index.php est jamais utilisé (et je ne le pense pas).

Il me manque probablement quelque chose d’évident, mais existe-t-il un moyen de savoir lequel des fichiers de thème Wordpress normaux est appelé? OR est-ce que j'ai déjà toutes les informations et 'index.php' n'est tout simplement pas utilisé.

Toute aide serait très appréciée!

Merci

7
James T

Voici une fonction approximative que j’utilise pour gérer cela, elle devrait convenir à tous ceux qui souhaitent faire cela rapidement et facilement. Ajoutez à cela le fichier functions.php, puis visitez votre site en ajoutant ?template_report à l'URL afin d'afficher un rapport pour chaque modèle de thème personnalisé.

C'est approximatif, je suggérerais de commenter/supprimer le commentaire add_action lorsque vous voulez l'utiliser.

/**
 * 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' );

La sortie ressemble à ceci:

 enter image description here 

4
Kevin Leary

Aucune requête ne permet d'identifier tous les fichiers de thème activement utilisés ou non utilisés. La seule requête que je connaisse qui identifiera certains fichiers de thème est:

SELECT * FROM wp_postmeta WHERE meta_key = '_wp_page_template';

qui identifiera tous les modèles de page personnalisés en cours d'utilisation. Il n'identifiera pas les fichiers de thèmes standard tels que index.php, single.php, header.php, footer.php, car ils ne sont pas des modèles de page personnalisés. Et il est recommandé d'inclure index.php, car il s'agit d'un paramètre par défaut/de secours en cas de problème avec des fichiers de thème plus spécifiques. Dans de nombreux cas, le fichier n’est jamais utilisé, mais il est toujours bon de l’avoir là. Il montre généralement la structure HTML nue du site, ce qui peut être un indice utile avant de plonger dans des fichiers plus personnalisés.

Si vous souhaitez continuer dans la voie de la rétro-ingénierie, je vous suggèrerais d'inclure votre code d'identificateur de fichier de thème dans (en tant que commentaire s'il s'agit d'un site actif) et de parcourir manuellement chaque URL. Si vous utilisez un plug-in générant un sitemap XML, vous pouvez être sûr de toucher chaque URL. N'oubliez pas que le fichier identifié n'est probablement pas le seul fichier utilisé. Par exemple, si vos publications utilisent la valeur par défaut single.php, il est très probable qu’elle utilise au minimum header.php et footer.php. Certains thèmes utilisent des parties de modèle ou des inclus. Ainsi, une fois que vous aurez la liste initiale du modèle global utilisé sur chaque URL, vous devrez parcourir chacun de ces modèles et déterminer les fichiers qu’ils appellent. Vous voudrez également vérifier functions.php pour les feuilles de style en attente et JS, ainsi que potentiellement d'autres inclus.

Une alternative à ce long processus consiste à reconstruire le thème de fond en comble. Je comprends que ce n’est pas toujours possible, mais c’est la solution la plus propre et elle risque de prendre moins de temps et d’être moins risquée que d’essayer d’éliminer lentement certaines parties d’un vieux thème complexe. Pour ce processus, j'identifie les modèles les plus utilisés (si vous avez 50 CPT à partir de là) et codez-les d'abord sur un site de développement/de développement, importez ou copiez au moins une poignée de chaque type de publication et continuez à construire à partir de là. Une fois de plus, vous devez parcourir au moins la majeure partie du site pour vous assurer de ne pas négliger les personnalisations. Pour vous assurer que tout est bien capté, vous devez vérifier chaque URL.

1
WebElaine

Vous pouvez analyser l'ensemble du site et faire correspondre les résultats de get_included_files() à vos fichiers de modèle.

0
Dan Knauss

Supprimez ce code dans le fichier functions.php et connectez-vous à un utilisateur doté de la capacité manage_options pour créer une page contenant les modèles inutilisés.

Je déconseille de supprimer index.php car il fait partie de WP Template Hierarchy et constitue le dernier modèle de sauvegarde pour tout ce qui n’a rien d’autre à utiliser.

// 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
}
0