有没有办法列出所有已使用/未使用的可湿性粉剂模板?

时间:2017-03-21 作者:James T

我正在努力优化我最近管理的一个网站,在我看来,有相当多的未使用的模板。我想删除所有未使用和冗余的模板文件,以便我们能够将我们的开发重点放在我们确实支持的模板上,但是这个网站上有100多个页面和帖子,所以我不能只是进行抽查,我需要一个可靠的查询。

我已经确定了如何通过加入wp\\U帖子和wp\\U Posteta来查询调用哪个页面模板,并且通过通过wp\\U term\\u关系查询wp\\U帖子和wp\\U term来确定使用了哪些帖子格式,但是。。。这似乎仍然不能告诉我指数是否正确。php曾经被使用过(我不这么认为)。

我可能遗漏了一些明显的东西,但有没有办法查看到底调用了哪些正常的Wordpress主题文件?还是我已经有了所有的信息和索引。php“只是没有被使用。

任何帮助都将不胜感激!

谢谢

5 个回复
SO网友:Kevin Leary

这里有一个粗略的函数,我用它来处理这个问题,它应该可以很好地为任何想快速简单地完成这个任务的人所用。将此添加到您的函数中。php文件,然后访问您的网站?template_report 添加到URL以显示每个自定义主题模板的报告。

It\'s rough, I\'d suggest commenting/uncommenting the add_action call when you want to use it.

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

SO网友:WebElaine

没有任何查询可以标识所有正在使用或未使用的主题文件。我知道的唯一可以识别一些主题文件的查询是:

SELECT * FROM wp_postmeta WHERE meta_key = \'_wp_page_template\';

它将标识正在使用的所有自定义页面模板。它不会识别索引等标准主题文件。php,单个。php,标题。php,页脚。php,因为它们不是自定义页面模板。最好的做法是包含索引。php,因为如果更具体的主题文件出现问题,它是默认/回退。在许多情况下,该文件从未被使用过,但在那里保存它总是很好的,它通常会向您显示站点的基本HTML结构,在您深入研究更多自定义文件之前,这可能是一个有用的提示。

如果你想继续反向工程,我建议在中包含你的主题文件标识符代码(如果是一个实时站点,则作为注释),并手动浏览每个URL。如果您使用生成XML站点地图的插件,它可以帮助您确保访问每个URL。请记住,识别的任何文件都可能不是正在使用的唯一文件。例如,如果您的帖子使用默认single.php 很可能是利用header.phpfooter.php 至少有些主题使用模板部分或包含,因此,在每个URL上使用了首要模板的初始列表后,您必须查看每个模板并确定它们调用的文件。您还需要检查functions.php 对于排队的样式表和JS,以及潜在的其他包含。

这个漫长过程的另一个选择是从头开始重建主题。我知道这并不总是可能的,但这是最干净的解决方案,而且可能比试图慢慢去除旧的复杂主题的部分花费的时间更少,风险也更小。对于这个过程,我确定了使用最多的模板(如果您有50个CPT从那里开始),并首先在开发/暂存站点上对这些模板进行编码,导入或复制至少一部分每种帖子类型,并从那里继续构建。再一次,你需要浏览至少大部分的网站,以确保你不会忽视定制,唯一能让你百分之百确定你抓住了一切的方法就是查看每个URL。

SO网友:Jeffrey von Grumbkow

在函数中删除此代码。php并使用具有manage_options 能够创建显示未使用模板的页面。

我建议不要删除索引。php,因为它是WP Template Hierarchy 并且是所有没有其他可用内容的备份的最后一个模板。

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

SO网友:Dan Knauss

您可以对整个网站进行爬网,并将结果与get_included_files() 到模板文件。

SO网友:Netanel Perez

你是说这样的事?

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

wp_count_posts( $args );

相关推荐

如何读取WordPress$Query关联数组(散列)键的值

WordPress编程新手(来自更为传统的环境),并试图了解其一些“独特”特性。我们的网站上有一个目录页,此代码驻留在functions.php, 如果条件为true,则调整结果。if( $query->is_post_type_archive( \'directory\' ) ){ ...//do stuff } 我想知道如何获取is_post_type_archive 这就是“目录”当我对值使用测试时。。。var_dumb($query->is_post