Di mana menempatkan perpustakaan PHP pihak ketiga?

8

Saya sedang mengembangkan beberapa plugin open-source dan tema (semua bagian dari "suite") yang semuanya menggunakan perpustakaan PHP pihak ketiga yang sama. Saya bertanya-tanya apa cara terbaik untuk memasukkannya dalam Wordpress. Berikut ini beberapa pemikiran:

  • letakkan di salah satu plugin dan minta plugin itu diinstal dan diaktifkan
  • buat "inti" plugin khusus yang tidak termasuk kecuali memasukkannya
  • letakkan langsung di wp-content

Adakah pemikiran tentang hal itu?

gou1
sumber
Apakah pengembangan ini untuk penggunaan pribadi di satu situs atau beberapa situs / rilis pubis?
Jarang
Ini untuk serangkaian plugin open source. Saya memperbarui pertanyaan untuk menunjukkan itu.
gou1

Jawaban:

5

Jika setiap plugin / tema berfungsi sendiri, maka Anda mungkin harus menghapus perpustakaan di setiap tema / plugin.

Kemudian cukup periksa untuk melihat apakah itu kelas atau fungsi dari perpustakaan pihak ketiga ada sebelum membutuhkannya.

<?php
if( class_exists( 'SomeClass' ) )
{
    // require/include here
}

atau

<?php
if( function_exists( 'some_function' ) )
{
   // Require/include stuff here
}

Atau, Anda bisa membungkus setiap fungsi / kelas / variabel / konstan dari pustaka pihak ketiga dalam tanda centang untuk melihat apakah ada, seperti fungsi pluggable .

Jika semua plugin dan tema bergantung satu sama lain, maka itu tidak masuk akal untuk membaginya dan Anda mungkin harus memikirkan kembali itu.

chrisguitarguy
sumber
Plugin memiliki fitur yang berbeda, karenanya pemisahan: Anda hanya mengaktifkan apa yang Anda inginkan. Tapi itu semua bergantung pada suatu kerangka kerja, itu sebabnya saya perlu memasukkan perpustakaan itu. Ini memiliki autoloader, dan beberapa kelas sehingga memeriksa / memerlukan untuk setiap kelas akan benar-benar menyebalkan. Dan saya tidak bisa menjatuhkannya di setiap kelas karena akan mendaftarkan autoloader beberapa kali. Saat ini solusi yang lebih baik tampaknya adalah plugin "inti". Anda mengaktifkannya terlebih dahulu sehingga membutuhkan semua hal pihak ke-3, dan kemudian Anda memilih plugin yang Anda inginkan.
gou1
Anda sedang memikirkan hal yang salah ini: buat saja file bootstrap, termasuk sesuatu yang dapat Anda periksa, termasuk / mengharuskan semua kelas. Maka perlu file itu. Satu cek. Jangan mengandalkan pengguna Anda untuk mengetahui mereka perlu menginstal plugin kedua.
chrisguitarguy
Itulah tepatnya pertanyaan saya: apa pun metode (plugin, bootstrapper, dll.) Di mana harus meletakkan file?
gou1
Oh, saya akan meletakkannya di libraryfolder di setiap plugin / tema. Kemudian di file plugin utama Anda, jalankan pemeriksaan dan sertakan jika perlu.
chrisguitarguy
3

Bind semua kode tergantung ke tindakan di plugin perpustakaan.

Kode contoh untuk plugin perpustakaan:

add_action( 'plugins_loaded', 'load_library', 0 );

function load_library()
{
    # load all the classes and files you need
    # Set up $plugin_url and $plugin_directory

    do_action( 'library_loaded', $plugin_url, $plugin_directory );
}

Dalam kode Anda yang tergantung, jangan lakukan apa pun sebelum tindakan dipanggil:

add_action( 'library_loaded', 'start_my_code', 10, 2 );

function start_my_code( $lib_url, $lib_directory )
{
    # do stuff
}

Perpustakaan menangani semua bagian dasar: memeriksa versi PHP yang tepat, konstanta WordPress, pengaturan multi-situs dll.

Kode lain tidak akan melakukan apa pun jika tindakan 'library_loaded'tidak dipanggil.

fuxia
sumber
1

Menambahkan untuk menjawab dengan chrisguitarguy, jika perpustakaan Anda dalam bentuk kelas PHP, maka Anda dapat menggunakan spl_autoload_register () untuk memuat kelas-kelas tersebut jika belum dimuat oleh plugin lain. Anda kemudian dapat menggabungkan pustaka ke dalam plugin Anda dan hanya menggunakannya, bergantung pada pemuat kelas untuk memasukkannya saat yang tepat. Anda juga dapat menggunakan pemuat kelas untuk memuat kelas plugin Anda sendiri.

misalnya

define('WPSE_31726_PLUGIN_ROOT', dirname(__FILE__) . '/');

/**
* autoload classes as/when needed
* @param string $class_name name of class to attempt to load
*/
function wpse_31726_autoload($class_name) {
    static $classMap = array (
        'Wpse31726_Admin'       => 'class.Wpse31726_Admin.php',
        'Wpse31726_CsvLoader'   => 'class.Wpse31726_CsvLoader.php',
        'Wpse31726_Plugin'      => 'class.Wpse31726_Plugin.php',
        'parseCSV'              => 'lib/parsecsv/parsecsv.lib.php',
    );

    if (isset($classMap[$class_name])) {
        require WPSE_31726_PLUGIN_ROOT . $classMap[$class_name];
    }
}

// register function for autoloading required classes
spl_autoload_register('wpse_31726_autoload');
sadar web
sumber
Masalahnya di sini bukan autoloading tetapi "semua menggunakan perpustakaan PHP pihak ketiga yang sama."
gou1
1
Per chrisguitarguy, masing-masing dapat memiliki salinan perpustakaan sendiri, dan dengan demikian beroperasi secara mandiri. Karena masing-masing dipanggil untuk beroperasi, dan karenanya membutuhkan pustaka, mereka memuatnya jika belum dimuat. Kelas autoloading hanya menyediakan cara yang nyaman untuk mengatasi bit "muat jika belum dimuat".
webaware
0

Karena tidak ada direktori vendor resmi , saya akan pergi untuk plugin "inti" yang tidak termasuk perpustakaan. Anda kemudian membuat plugin Anda membutuhkan plugin inti itu.

Menempatkan pustaka di salah satu plugin nyata Anda mengharuskan pengguna untuk mengaktifkan plugin itu meskipun mereka mungkin tidak pernah ingin menggunakan fungsinya. Plugin inti terpisah tampaknya lebih bersih.

Memasukkannya langsung ke konten wp sepertinya solusi terburuk.

Geert
sumber
Itulah yang saya pikirkan pada awalnya juga, tetapi saya menemukan itu tidak cukup untuk hanya memasukkan perpustakaan Anda ke dalam satu plugin yang diaktifkan: kadang-kadang (mis. Ketika mengaktifkannya) file dari plugin "core" tidak akan diperlukan .
gou1