Bestway para definir el tema y la ruta y la URL del complemento

8

Estoy en un lío. Sé que esta es una pregunta tonta. Ves que la ruta del tema no es tan buena. ¿Hay alguna otra manera? ¿Cómo puedo usarla get_template_directory()aquí?

    // 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
fuente
1
¿Por qué necesitas constantes? Crean una dependencia adicional del estado global en su código. Esto es muy malo.
fuxia
¿Entonces me aconsejas que no use estos? Gracias. ¿Afecta el tiempo de carga de mi página?
ashraf
2
A partir de PHP 5.4, las constantes se colocan al final de la pila, por lo que se leerán más rápido. Pero el verdadero problema aquí es la calidad del código: cada vez que una función o clase usa esa constante, están "sabiendo demasiado", hacen una suposición sobre el estado fuera de su propio código. Esto es malo. Rompe la encapsulación y hace que el código sea difícil de leer. La dependencia de WordPress con el estado global es suficientemente mala. No lo empeores en tu código.
fuxia

Respuestas:

13

No use constantes para eso. No use constantes globales en absoluto.

Hay dos tipos de constantes: constantes de clase / interfaz y constantes globales.

Las constantes en clases o interfaces están bien y a veces son útiles. Un ejemplo demasiado 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, '>=' );
    }
}

Pero tenga en cuenta que estas constantes son siempre públicas. Si los cambia más tarde, puede romper el código que depende de ellos.

Esto es peor con las constantes globales. Imagina lo siguiente:

define( 'THEME_URI', get_template_directory_uri() );

Y luego una función para una imagen de encabezado predeterminada:

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

Esta función asume algo que está fuera de su control, sabe demasiado. ¿Cómo se prueba esa función con diferentes valores para la constante? No puedes

Supongamos que desea probar qué sucede cuando la constante se establece en un directorio no existente o en otro servidor más lento. Pero una vez que ha definido la constante, no puede cambiar su valor. No puede ejecutar todas las pruebas de una vez, esto hace que las pruebas sean más difíciles de lo necesario.

Y en un tema secundario que intenta usar su propia imagen predeterminada, ¿cómo implementa eso? La constante se establece por el tema principal. Puede agregar un cheque con defined(), pero eso hace que sea más difícil ver dónde se escribió realmente su valor.

Sería mucho mejor reescribir la función para:

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

Dije antes, las constantes son una API. Las API deberían ser fáciles de cambiar, pero es realmente difícil desaprobar una constante, porque PHP no registra el acceso. Por lo tanto, su mensaje de desaprobación nunca llegará a otros desarrolladores, excepto cuando lean su código fuente o sus documentos con mucho cuidado. Confía en mí, no lo hacen.

Uso get_stylesheet_directory_uri()en temas secundarios y get_template_directory_uri()en temas principales. Ambos se pueden filtrar en tiempo de ejecución, por lo que puede ejecutar todas sus pruebas a la vez.

fuxia
fuente