问题描述

我在乱七八糟,我知道这是一个愚蠢的问题。你看主题路径不是那么好,有没有什么其他的方法?我可以在这里使用 get_template_directory()吗?

    // theme folder path
    if ( ! defined( 'TZSC_THEME_DIR' ) ) {
        define( 'TZSC_THEME_DIR', dirname(__FILE__).'/' );
    }

    // theme folder URL
    if ( ! defined( 'TZSC_THEME_URL' ) ) {
        define( 'TZSC_THEME_URL', plugin_dir_url( __FILE__ ) );
    }

最佳解决方法

不要使用常数。根本不要使用全局常量。

有两种类型的常量:类/接口常量和全局常量。

类或接口中的常量很好,有时也是有用的。一个过于简单的例子:

interface Requirements
{
    const MIN_PHP_VERSION = 5.4;

    public function php_is_good();
}

class Theme_Requirements implements Requirements
{
    public function php_is_good()
    {
        return version_compare( PHP_VERSION, self::MIN_PHP_VERSION, '>=' );
    }
}

但请记住,这些常数总是公开的。如果以后更改它们,则可能会破坏依赖于它们的代码。

全局常数更糟。想象一下:

define( 'THEME_URI', get_template_directory_uri() );

然后一个默认头像的功能:

function get_default_header_image()
{
    return THEME_URI . '/img/default-header.jpg';
}

这个功能可以假设一些不受控制的东西,它知道得太多了。如何用常量的不同值测试该函数?你不行

假设你想测试当常数设置为 non-existing 目录或另一个较慢的服务器时会发生什么。但一旦定义了常量,就不能更改其值。你不能一口急跑所有的测试,这使测试比必要更难。

而在一个试图使用自己的默认图像的小题材中,你如何实现呢?常数由父主题设置。您可以添加一个支票与 defined(),但这使得更难看到它的值实际写入的地方。

将函数重写为:

function get_default_header_image( $base )
{
    return esc_url( $base ) '/img/default-header.jpg';
}

我之前说过,常数是一个 API 。 API 应该很容易改变,但是由于 PHP 不会记录访问权限,所以很难否定常量。所以您的弃用消息将永远不会覆盖其他开发人员,除非他们仔细阅读您的源代码或文档。相信我,他们不会。

在子主题中使用 get_stylesheet_directory_uri(),在父主题中使用 get_template_directory_uri()。两者都可以在运行时进行过滤,因此您可以一次运行所有测试。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。