Bestway para definir la ruta y url del tema y 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. Entonces, ¿hay alguna otra forma? ¿Cómo puedo usar 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__ ) );
    }
    
pregunta ashraf 10.08.2014 - 15:11

1 respuesta

13

No uses constantes para eso. No utilice constantes globales en absoluto.

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

Las constantes en clases o interfaces son buenas y algunas veces ú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 ten en cuenta que estas constantes son siempre públicas. Si los cambias más tarde, podrías 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 hace una suposición sobre algo que está fuera de su control, sabe demasiado. ¿Cómo prueba esa función con diferentes valores para la constante? No puedes.

Digamos que desea probar lo que sucede cuando la constante se establece en un directorio no existente o en otro servidor más lento. Pero una vez que haya definido la constante, no puede cambiar su valor. No puedes 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 es establecida por el tema principal. Podría 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 dejar de lado una constante, porque PHP no registra el acceso. Por lo tanto, su mensaje de rechazo nunca llegará a otros desarrolladores, excepto cuando leen su código fuente o sus documentos con mucho cuidado. Confía en mí, no lo hacen.

Use 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.

    
respondido por el fuxia 10.08.2014 - 17:15

Lea otras preguntas en las etiquetas