Lưu ý: Câu trả lời này chỉ ở đây để làm cho cuộc thảo luận giữa @ fouu và @kaiser dễ dàng hơn. Mods: Xin đừng xóa. Người dùng / Độc giả: Vui lòng không bỏ phiếu. Nếu bạn muốn theo dõi cuộc thảo luận, hãy xem nhật ký sửa đổi / chỉnh sửa. Nếu bạn muốn tham gia thảo luận, hãy chỉnh sửa Câu trả lời. Nếu cuộc thảo luận có kết quả, thì nó sẽ được đánh dấu như vậy. Cảm ơn bạn.
Kịch bản
Ngoài ra còn có các kịch bản khác nhau có trọng lượng khác nhau, nơi bạn có thể có một phụ thuộc plugin. (Các ví dụ chỉ là hư cấu). Từ "(cha mẹ) Plugin" có thể được trao đổi với "Chủ đề" theo quan điểm của phụ huynh.
- (cứng) Một plugin con chỉ mở rộng chức năng hoặc thay đổi hiển thị (và tương tự) của một plugin hiện có và do đó không thể tồn tại mà không có cha mẹ. Ví dụ: BuddyPress »BuddyPress-FunkyVerDisplay
- (bình thường) Một plugin có chức năng mở rộng khi một plugin con được kích hoạt. Ví dụ: jQueryAttachmentCarousel »jQuerySlideDeck
- (mềm) Một plugin chỉ cần thêm một tính năng. Ví dụ: DisneyWonderlandTheme »MickeysSocialLinks
Sau đây tôi cố gắng phác thảo những gì xảy ra khi bạn cập nhật plugin "khác" và kiểm tra không hoạt động nữa.
- Quảng cáo 1) Plugin không thể tồn tại mà không kích hoạt BuddyPress »Công cụ bị hỏng hoàn toàn.
- Quảng cáo 2) Plugin không thể cung cấp tùy chọn chuyển từ Carousel sang SlideDeck »Hiển thị có dây (Tôi cho rằng các kiểu được sửa đổi thành SlideDeck).
- Quảng cáo 3) MickeysSocialLinks biến mất.
Kiểm tra
Có ba khả năng để kiểm tra, nếu bạn muốn biết liệu plugin có hoạt động không:
- A. Thư mục có tồn tại không?
- B. Tập tin chính - tùy chọn
'active_plugins'
- có tồn tại không?
- C. Có một chức năng cụ thể tồn tại?
Nếu bây giờ tôi lấy Plugin Trình kiểm tra liên kết nội bộ của mình làm ví dụ, điều đó không cung cấp API công khai và không có nghĩa là được gia hạn, thì tôi sẽ không thấy lý do gì (với tư cách là tác giả) để không thay đổi chức năng đặt tên nội bộ theo yêu cầu hoặc chỉ theo ý muốn . Vì vậy, nếu ai đó cố gắng cõng trên plugin này, thì mọi thứ sẽ đơn giản bị hỏng (tùy thuộc vào chức năng và độ chặt của gói) khi cập nhật. Tương tự với tên tập tin. Tôi không có lý do thực sự (ngoài việc plugin sẽ bị vô hiệu hóa khi cập nhật) để không thay đổi tên tệp. Điều duy nhất khiến tôi không thể thay đổi tên thư mục là việc kiểm tra và thông báo cập nhật chạy với tên tệp - nếu nó được lưu trữ trong repo chính thức.
Vì vậy, tôi muốn nói từ phần yếu nhất (dễ thay đổi) đến khó nhất (rất nhiều thay đổi so với thay đổi) của một plugin (cha mẹ) sẽ là:
chức năng »tên tệp chính» thư mục
Khi tôi nói rằng kiểm tra chức năng ít dễ hỏng hơn so với sử dụng, is_plugin_active()
tôi cho rằng chức năng được đề cập là chức năng mà tác giả plugin khuyến khích rõ ràng. Ví dụ cuối cùng về điều này sẽ là wp_pagenavi()
thẻ mẫu được cung cấp bởi plugin WP-PageNavi.
Khó khăn trong việc xác định các phụ thuộc là không có cách chuẩn để xác định duy nhất các plugin không liên quan đến tên tệp.
Thêm suy nghĩ về chủ đề này:
http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme
Tôi đoán cho đến nay chúng ta có thể tổng hợp nó trong ba điểm:
- Chúng tôi đã nói về các chủ đề hơi khác nhau
- Chúng tôi đồng ý rằng không có cách chống đạn nào để giải quyết vấn đề mà tôi nghĩ chủ đề sẽ là
- Từ sự hiểu biết của bạn về câu hỏi, bạn đã đưa ra cách hợp lệ để đi
Cách thông minh nhất (cho đến nay) mà tôi có thể nghĩ ra, mà tôi đã thấy trong một số plugin (quá ít):
// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );
Không suy nghĩ quá nhiều về nó, nhưng tôi đoán bạn có thể móc thông báo của mình vào kiểm tra bộ lọc 'tất cả' và kiểm tra bên trong bộ lọc hiện tại nếu nó được kích hoạt khi bạn đang ở trên shutdown
móc ...?
Sử dụng móc sẽ hoạt động tốt cho các phụ thuộc 'bình thường' và 'yếu'. Hạn chế duy nhất là bạn vẫn sẽ cần sử dụng function_exists()
hoặc is_plugin_active()
nếu bạn muốn dừng lại nếu sự phụ thuộc không được đáp ứng. Sử dụng bộ lọc 'tất cả' cho điều đó sẽ quá tốn kém IMO.
@scibu Điều này đã được nhắm mục tiêu vào chủ đề "của bạn". (Tôi đã bỏ nói về tôi). :)
Về cơ bản, nếu bạn cần một người phụ thuộc - và bạn có một tác giả tốt - thì anh ta có thể đưa ra một cái móc thay thế / thay thế cho một thẻ mẫu. Bởi vì plugin sẽ chỉ móc vào nó nếu hook có mặt, hoặc đơn giản là không làm gì cả. Và ở phía bên kia, bạn sẽ không gặp lỗi, khi các plugin không xuất hiện.
Đây là phần khó khăn (hoặc nhiều hơn Q): Để viết thông báo quản trị viên để thông báo cho người dùng về sự phụ thuộc "Bạn cần cài đặt» DisneyWonderLinks «", bạn có thể kiểm tra array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )
. Tôi không chắc chắn nếu điều này sẽ làm việc, nhưng afaik mảng có thể truy cập được ở cả hai bên (công khai / quản trị viên).
Điều đó sẽ không làm việc. Chỉ vì một cuộc gọi lại được đăng ký vào một hook không có nghĩa là hook sẽ được kích hoạt khi mong đợi. Điều duy nhất có thể loại công việc là sử dụng móc 'tắt máy', mà bạn đã đề cập trước đây:
add_action( 'shutdown', function() {
if ( !did_action( 'template_tag_like_hook' ) )
echo 'Problem.';
} );
Tất nhiên, điều này sẽ được in ở dưới cùng, sau </html>
thẻ, ở mặt trước (vì đó là nơi thẻ mẫu thường được sử dụng), không được sử dụng nhiều.
Bạn có thể cố gắng lưu trữ thông báo trong wp_options và sau đó hiển thị nó trong khu vực quản trị, nhưng điều đó sẽ mở ra một hộp sâu hoàn toàn mới: không hợp lệ, bổ trợ bộ đệm, v.v.
function_exists
, thì một người dùng bình thường sẽ chỉ nhận được thông báo rằng anh ta đã không cài đặt plugin mà một plugin khác dựa vào. Vấn đề là, người dùng thực sự sẽ cài đặt plugin và sau đó chỉ tự hỏi tại sao nó không hoạt động . Ồ, và tôi sẽ không đánh giá thấp bạn vì điều đó.