Nơi để đặt thư viện PHP của bên thứ ba?


8

Tôi đang phát triển một vài plugin nguồn mở và một chủ đề (tất cả là một phần của "bộ") mà tất cả đều sử dụng cùng một thư viện PHP của bên thứ ba. Tôi đang tự hỏi đâu là cách tốt nhất để đưa nó vào Wordpress. Dưới đây là một số suy nghĩ:

  • đặt nó vào một trong các plugin và yêu cầu plugin đó phải được cài đặt và kích hoạt
  • tạo một plugin "cốt lõi" đặc biệt không có gì ngoài việc bao gồm nó
  • đặt nó trực tiếp vào wp-content

Bất kỳ suy nghĩ về vấn đề đó?


Là sự phát triển này để sử dụng riêng trên một trang web hoặc phát hành nhiều trang web / công khai?
Hết

Đó là một bộ plugin nguồn mở. Tôi đang cập nhật câu hỏi để chỉ ra điều đó.
gou1

Câu trả lời:


5

Nếu mỗi chức năng của plugin / theme, thì có lẽ bạn nên bỏ thư viện trong mọi chủ đề / plugin.

Sau đó, chỉ cần kiểm tra xem liệu một lớp hoặc chức năng từ thư viện bên thứ ba có tồn tại trước khi yêu cầu nó không.

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

hoặc là

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

Ngoài ra, bạn có thể bọc mọi hàm / lớp / biến / hằng từ thư viện bên thứ ba để kiểm tra xem nó có tồn tại không, như các hàm có thể cắm được .

Nếu tất cả các plugin và chủ đề phụ thuộc vào nhau, thì thực sự không có ý nghĩa gì khi phân chia chúng và có lẽ bạn nên suy nghĩ lại về điều đó.


Plugin có các tính năng khác nhau, do đó phân tách: bạn chỉ kích hoạt những gì bạn muốn. Nhưng tất cả đều dựa vào một khung, đó là lý do tại sao tôi cần đưa vào thư viện đó. Nó có một trình tải tự động, và khá nhiều lớp nên việc kiểm tra / yêu cầu cho mỗi lớp sẽ thực sự là một nỗi đau. Và tôi thực sự không thể bỏ nó trong mỗi lớp vì nó sẽ đăng ký trình tải tự động nhiều lần. Ngay bây giờ, giải pháp tốt hơn dường như là plugin "cốt lõi". Bạn kích hoạt nó trước để nó yêu cầu tất cả nội dung của bên thứ 3 và sau đó bạn chọn các plugin bạn muốn.
gou1

Bạn đang nghĩ về điều này sai: chỉ cần tạo một tệp bootstrap, bao gồm cả thứ bạn có thể kiểm tra, bao gồm / yêu cầu tất cả các lớp. Sau đó yêu cầu tập tin đó. Một kiểm tra. Đừng tin tưởng vào người dùng của bạn để tìm ra họ cần cài đặt plugin thứ hai.
chrisguitarguy

Đó chính xác là câu hỏi của tôi: bất kể phương pháp nào (plugin, bootstrapper, v.v.) để đặt các tệp ở đâu?
gou1

Ồ, tôi sẽ đặt chúng vào một librarythư mục trong mỗi plugin / chủ đề. Sau đó, trong tệp plugin chính của bạn, hãy chạy kiểm tra và bao gồm chúng nếu cần thiết.
chrisguitarguy

3

Liên kết tất cả các mã phụ thuộc vào một hành động trong plugin thư viện.

Mã mẫu cho plugin thư viện:

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

Trong mã phụ thuộc của bạn không làm gì trước khi hành động được gọi:

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

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

Thư viện xử lý tất cả các phần cơ bản: kiểm tra phiên bản PHP phù hợp, hằng số WordPress, thiết lập nhiều trang web, v.v.

Các mã khác sẽ không làm gì nếu hành động 'library_loaded'không được gọi.


1

Thêm vào câu trả lời của chrisguitarguy, nếu các thư viện của bạn ở dạng các lớp PHP, thì bạn có thể sử dụng spl_autoload_register () để tải các lớp đó nếu chúng chưa được tải bởi một plugin khác. Sau đó, bạn có thể gói các thư viện vào plugin của mình và chỉ cần sử dụng chúng, dựa vào trình nạp lớp để đưa chúng vào khi thích hợp. Bạn cũng có thể sử dụng trình tải lớp để tải các lớp của plugin của riêng bạn.

ví dụ

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');

Vấn đề ở đây không phải là tự động tải mà là "tất cả đều sử dụng cùng thư viện PHP của bên thứ ba".
gou1

1
Mỗi chrisguitarguy, mỗi người có thể có một bản sao riêng của thư viện và do đó hoạt động độc lập. Vì mỗi cái được yêu cầu hoạt động, và do đó yêu cầu thư viện, chúng tải nó nếu nó chưa được tải. Các lớp tự động tải chỉ đơn thuần cung cấp một cách thuận tiện để giải quyết bit "tải nó nếu nó chưa được tải".
web biết

0

không có thư mục nhà cung cấp chính thức nào tồn tại , tôi sẽ tìm kiếm plugin "lõi" không có gì ngoài thư viện. Sau đó, bạn làm cho các plugin của bạn yêu cầu plugin cốt lõi đó.

Đặt thư viện vào một trong các plugin thực sự của bạn sẽ yêu cầu người dùng kích hoạt plugin đó mặc dù họ có thể không bao giờ muốn sử dụng chức năng của nó. Một plugin lõi riêng có vẻ sạch hơn.

Đưa nó trực tiếp vào nội dung wp có vẻ như là giải pháp tồi tệ nhất.


Đó là những gì tôi đã nghĩ lúc đầu, nhưng tôi phát hiện ra rằng việc đưa các thư viện của bạn vào một plugin được kích hoạt là không đủ: đôi khi (ví dụ: khi kích hoạt nó), tệp plugin "lõi" sẽ không được yêu cầu .
gou1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.