Bestway para definir o caminho e o URL do tema e do plug-in

8

Estou em uma bagunça.Eu sei que essa é uma pergunta boba.Você vê que o caminho do tema não é tão bom.Portanto, existe outra maneira? Como posso usar get_template_directory()aqui?

    // 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__ ) );
    }
ashraf
fonte
1
Por que você precisa de constantes? Eles criam uma dependência adicional no estado global do seu código. Isso é muito ruim.
fuxia
Você me aconselha a não usá-los? Obrigado. Isso afeta o tempo de carregamento da página?
Ashraf
2
A partir do PHP 5.4, as constantes são colocadas no final da pilha, para que sejam lidas mais rapidamente. Mas o problema real aqui é a qualidade do código: toda vez que uma função ou classe usa essa constante, elas “sabem demais”, assumem o estado fora do seu próprio código. Isto é mau. Ele quebra o encapsulamento e dificulta a leitura do código. A dependência do WordPress no estado global já é ruim o suficiente. Não piore no seu código.
fuxia

Respostas:

13

Não use constantes para isso. Não use constantes globais.

Existem dois tipos de constantes: constantes de classe / interface e constantes globais.

As constantes em classes ou interfaces são boas e às vezes úteis. Um exemplo excessivamente simplista:

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, '>=' );
    }
}

Mas lembre-se, essas constantes são sempre públicas. Se você os alterar posteriormente, poderá quebrar o código que depende deles.

Isso é pior com constantes globais. Imagine o seguinte:

define( 'THEME_URI', get_template_directory_uri() );

E, em seguida, uma função para uma imagem de cabeçalho padrão:

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

Essa função assume que algo está fora de controle, sabe demais. Como você testa essa função com valores diferentes para a constante? Você não pode.

Digamos que você queira testar o que acontece quando a constante é configurada para um diretório inexistente ou para outro servidor mais lento. Mas depois de definir a constante, você não poderá alterar seu valor. Você não pode executar todos os testes de uma só vez, isso torna os testes mais difíceis do que o necessário.

E em um tema filho que tenta usar sua própria imagem padrão - como você implementa isso? A constante é definida pelo tema pai. Você pode adicionar uma verificação com defined(), mas isso torna mais difícil ver onde seu valor foi realmente escrito.

Seria muito melhor reescrever a função para:

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

Eu disse anteriormente, as constantes são uma API. As APIs devem ser fáceis de alterar, mas é realmente difícil descontinuar uma constante, porque o PHP não registra o acesso. Portanto, sua mensagem de descontinuação nunca alcançará outros desenvolvedores, exceto quando eles lerem seu código-fonte ou seus documentos com muito cuidado. Confie em mim, eles não.

Use get_stylesheet_directory_uri()em temas filhos e get_template_directory_uri()em pais. Ambos podem ser filtrados em tempo de execução, para que você possa executar todos os seus testes ao mesmo tempo.

fuxia
fonte