Bestway To Define Theme und Plugin Pfad und URL


8

Ich bin in einem Chaos. Ich weiß, dass dies eine dumme Frage ist. Sie sehen, dass der Themenpfad nicht so gut ist. Gibt es also einen anderen Weg? Wie kann ich ihn get_template_directory()hier verwenden?

    // 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__ ) );
    }

1
Warum brauchen Sie Konstanten? Sie erzeugen eine zusätzliche Abhängigkeit vom globalen Status in Ihrem Code. Das ist sehr schlecht.
Fuxia

Sie raten mir also, diese nicht zu verwenden? Danke. Beeinflusst dies die Ladezeit meiner Seite?
Ashraf

2
Ab PHP 5.4 werden Konstanten am Ende des Stapels platziert, damit sie schneller gelesen werden können. Das eigentliche Problem hierbei ist jedoch die Codequalität: Jedes Mal, wenn eine Funktion oder Klasse diese Konstante verwendet, „wissen sie zu viel“, nehmen sie eine Annahme über den Status außerhalb ihres eigenen Codes an. Das ist schlecht. Es unterbricht die Kapselung und macht den Code schwer lesbar. Die Abhängigkeit von WordPress vom globalen Zustand ist schon schlimm genug. Machen Sie es in Ihrem Code nicht schlimmer.
Fuxia

Antworten:


13

Verwenden Sie dafür keine Konstanten. Verwenden Sie überhaupt keine globalen Konstanten.

Es gibt zwei Arten von Konstanten: Klassen- / Schnittstellenkonstanten und globale Konstanten.

Konstanten in Klassen oder Schnittstellen sind in Ordnung und manchmal nützlich. Ein zu vereinfachtes Beispiel:

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

Beachten Sie jedoch, dass diese Konstanten immer öffentlich sind. Wenn Sie sie später ändern, können Sie den von ihnen abhängigen Code beschädigen.

Dies ist bei globalen Konstanten noch schlimmer. Stellen Sie sich Folgendes vor:

define( 'THEME_URI', get_template_directory_uri() );

Und dann eine Funktion für ein Standard-Header-Bild:

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

Diese Funktion geht von etwas aus, das außerhalb ihrer Kontrolle liegt, sie weiß zu viel. Wie testet man diese Funktion mit unterschiedlichen Werten für die Konstante? Das kannst du nicht.

Angenommen, Sie möchten testen, was passiert, wenn die Konstante auf ein nicht vorhandenes Verzeichnis oder einen anderen, langsameren Server festgelegt wird. Sobald Sie die Konstante definiert haben, können Sie ihren Wert nicht mehr ändern. Sie können nicht alle Tests auf einmal ausführen. Dies macht das Testen schwieriger als nötig.

Und in einem untergeordneten Thema, das versucht, ein eigenes Standardbild zu verwenden - wie implementieren Sie das? Die Konstante wird durch das übergeordnete Thema festgelegt. Sie könnten einen Scheck mit hinzufügen defined(), aber das macht es schwieriger zu sehen, wo sein Wert tatsächlich geschrieben wurde.

Es wäre viel besser, die Funktion umzuschreiben, um:

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

Ich habe vorhin gesagt, Konstanten sind eine API. APIs sollten leicht zu ändern sein, aber es ist wirklich schwierig, eine Konstante zu verwerfen, da PHP den Zugriff nicht protokolliert. Daher wird Ihre Ablehnungsnachricht niemals andere Entwickler erreichen, es sei denn, sie lesen Ihren Quellcode oder Ihre Dokumente sehr sorgfältig. Vertrau mir, das tun sie nicht.

Verwendung get_stylesheet_directory_uri()in untergeordneten und get_template_directory_uri()übergeordneten Themen. Beide können zur Laufzeit gefiltert werden, sodass Sie alle Tests gleichzeitig ausführen können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.