web-dev-qa-db-ja.com

すべての使用済み/未使用を一覧表示する方法はありますか WP テンプレート?

私は最近管理しているサイトを最適化しようとしていますが、未使用のテンプレートはかなり少ないと思われます。私たちがサポートしているテンプレートに開発を集中できるように、未使用の余分なテンプレートファイルをすべて削除したいのですが、このサイトには10​​0以上のページと投稿があるので、スポットチェックはできません。堅牢なクエリ.

どのページテンプレートがwp_postsとwp_postmetaの結合から呼び出されているかを問い合わせる方法を確立し、wp_term_relationships BUTを介してwp_postsとwp_termsを問い合わせることによってどの投稿フォーマットが使用されているかを疑いました...私はindex.phpが今までに使われたことがあるかどうか(そして私はそれがそうであるとは思わない)。

明らかなものが足りないかもしれませんが、通常のWordpressテーマファイルのどれが実際に呼び出されているかを確認する方法はありますか? ORは、私がすべての情報をすでに持っていて、 'index.php'が使われていないということです。

任意の助けは大歓迎です!

ありがとう

7
James T

これは私がこれを処理するために使用する大まかな関数です、それはこれを速くて簡単にしたい人のためにうまくいくはずです。これをこのfunctions.phpファイルに追加してから、URLに?template_reportを追加してサイトにアクセスし、すべてのカスタムテーマテンプレートのレポートを表示します。

それは大雑把です、あなたがそれを使いたい時には、私はadd_action呼び出しにコメントする/コメントを外すことをお勧めします。

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

出力は次のようになります。

enter image description here 

4
Kevin Leary

アクティブに使用されている、または使用されていないすべてのテーマファイルを識別するクエリはありません。私が知っている唯一のクエリはいくつかのテーマファイルを特定するでしょう:

SELECT * FROM wp_postmeta WHERE meta_key = '_wp_page_template';

これにより、使用中のすべてのカスタムPageテンプレートが識別されます。 index.php、single.php、header.php、footer.phpなどの標準のテーマファイルは、カスタムのPageテンプレートではないため、識別されません。 index.phpをインクルードするのがベストプラクティスです。より具体的なテーマファイルで問題が発生した場合、これがデフォルト/フォールバックになるためです。多くの場合、ファイルは使用されることはありませんが、そこに置くのが常に良い方法です。通常、サイトの基本的なHTML構造が表示されます。これは、カスタマイズされたファイルに入る前に役立つ情報です。

リバースエンジニアリングを続けたい場合は、テーマファイル識別子コードを(ライブサイトの場合はコメントとして)含めて、各URLを手動で確認することをお勧めします。 XMLサイトマップを生成するプラグインを使用すると、すべてのURLに確実にアクセスできるようになります。どんなファイルが識別されたとしても、おそらく使用中の唯一のファイルではないことを心に留めておいてください。たとえば、投稿がデフォルトのsingle.phpを使用している場合、最低でもheader.phpfooter.phpを使用している可能性が非常に高いです。一部のテーマではテンプレート部分またはインクルードを使用しているため、各URLで使用される包括的なテンプレートの初期リストを入手したら、それらの各テンプレートを調べて呼び出すファイルを決定する必要があります。また、キューイングされたスタイルシートとJS、そしてその他の潜在的なインクルードについてもfunctions.phpをチェックしたいでしょう。

この長いプロセスの代替案の1つは、テーマをゼロから再構築することです。私はこれが常に可能というわけではないことを理解しています、しかしそれは最もきれいな解決策であり、そして古い複雑なテーマの一部をゆっくりと落とすことを試みるよりも時間がかからずリスクが少ないと思われます。このプロセスでは、最も使用頻度の高いテンプレート(1つのCPTが50から始まる場合)を特定し、最初に開発/ステージングサイトでそれらをコーディングし、少なくとも各投稿タイプのほんの一握りをインポートまたはコピーしてそこから構築し続けます。もう一度、カスタマイズを見逃さないようにするには、少なくともほとんどのサイトを見直す必要があります。100%確実に確実に把握できるのは、すべてのURLを確認することだけです。

1
WebElaine

サイト全体をクロールして、get_included_files()の結果をテンプレートファイルと一致させることができます。

0
Dan Knauss

このコードをfunctions.phpにドロップして、未使用のテンプレートを表示するページを作成するmanage_options機能を持つユーザーでログインします。

Index.phpは WP Template Hierarchy の一部であるため、index.phpを削除しないことをお勧めします。これは、他に使用するものがない場合の最後のバックアップテンプレートです。

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