Bestway To Define Theme dan Plugin path dan url

8

Saya dalam kekacauan. Saya tahu ini adalah pertanyaan konyol. Anda lihat jalur tema tidak begitu baik. Jadi ada cara lain? Bagaimana saya bisa menggunakan di get_template_directory()sini?

    // 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
sumber
1
Mengapa Anda membutuhkan konstanta? Mereka menciptakan ketergantungan tambahan pada status global dalam kode Anda. Ini sangat buruk.
fuxia
Jadi, Anda menyarankan saya untuk tidak menggunakan ini? Terima kasih. Apakah itu memengaruhi waktu pemuatan halaman saya?
ashraf
2
Dari PHP 5.4 pada, konstanta diletakkan di ujung tumpukan, sehingga mereka akan dibaca lebih cepat. Tetapi masalah sebenarnya di sini adalah kualitas kode: setiap kali fungsi atau kelas menggunakan konstanta itu, mereka “tahu terlalu banyak”, mereka membuat asumsi tentang keadaan di luar kode mereka sendiri. Ini buruk. Ini merusak enkapsulasi dan membuat kode sulit dibaca. Ketergantungan WordPress pada keadaan global sudah cukup buruk. Jangan memperburuk kode Anda.
fuxia

Jawaban:

13

Jangan gunakan konstanta untuk itu. Jangan gunakan konstanta global sama sekali.

Ada dua jenis konstanta: konstanta kelas / antarmuka dan konstanta global.

Konstanta di kelas atau antarmuka baik-baik saja dan terkadang berguna. Contoh yang terlalu sederhana:

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

Namun perlu diingat, konstanta ini selalu bersifat publik. Jika Anda mengubahnya nanti, Anda dapat memecahkan kode yang tergantung pada mereka.

Ini lebih buruk dengan konstanta global. Bayangkan yang berikut ini:

define( 'THEME_URI', get_template_directory_uri() );

Dan kemudian fungsi untuk gambar header default:

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

Fungsi ini membuat asumsi tentang sesuatu yang di luar kendali, ia tahu terlalu banyak. Bagaimana Anda menguji fungsi itu dengan nilai yang berbeda untuk konstanta? Kamu tidak bisa

Katakanlah Anda ingin menguji apa yang terjadi ketika konstanta diset ke direktori yang tidak ada atau ke server lain yang lebih lambat. Tetapi begitu Anda telah menetapkan konstanta, Anda tidak dapat mengubah nilainya. Anda tidak dapat menjalankan semua tes dalam satu kali, ini membuat pengujian lebih sulit dari yang diperlukan.

Dan dalam tema anak yang mencoba menggunakan gambar default sendiri - bagaimana Anda menerapkannya? Konstanta diatur oleh tema induk. Anda bisa menambahkan tanda centang dengan defined(), tetapi itu membuat lebih sulit untuk melihat di mana nilainya sebenarnya ditulis.

Akan jauh lebih baik untuk menulis ulang fungsi ke:

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

Saya katakan sebelumnya, konstanta adalah API. API seharusnya mudah diubah, tetapi sangat sulit untuk mencabut konstanta, karena PHP tidak mencatat akses. Jadi pesan penghentian Anda tidak akan pernah mencapai pengembang lain, kecuali ketika mereka membaca kode sumber Anda atau dokumen Anda dengan sangat hati-hati. Percayalah, mereka tidak.

Gunakan get_stylesheet_directory_uri()di tema anak dan get_template_directory_uri()di tema orang tua. Keduanya dapat difilter saat runtime, sehingga Anda dapat menjalankan semua pengujian sekaligus.

fuxia
sumber