Làm cách nào để tạo plugin cần thiết trong một chủ đề wp mà không sử dụng các câu lệnh điều kiện php khi gọi một hàm riêng lẻ từ plugin đó?


9

Một trong những chủ đề Wordpress của tôi yêu cầu một vài plugin của bên thứ ba chạy chính xác.

Hầu hết các lần tôi thường gọi các hàm từ plugin của bên thứ ba bằng cách sử dụng các câu lệnh có điều kiện như

    if(function_exist('plugin_function')) {
             plugin_function() // do something
    }

giả sử mặc dù tôi cần sử dụng rộng rãi một plugin thông qua nhiều tệp trong chủ đề của mình ... Tôi muốn tránh sử dụng nhiều điều kiện IF ... có cách nào phù hợp để yêu cầu một số plugin cụ thể được cài đặt trong WP hoặc thậm chí tốt hơn cài đặt chúng nếu họ bị mất trước khi kích hoạt chủ đề?

cảm ơn

Câu trả lời:


7

is_plugin_active()khá dễ vỡ: nó sẽ bị hỏng khi tác giả plugin đổi tên tệp chính hoặc khi người dùng đổi tên thư mục hoặc tệp chính của plugin. Tốt hơn là kiểm tra nếu một chức năng công cộng nhất định tồn tại.

Để tránh phải kiểm tra mỗi lần bạn cần một số chức năng của plugin, bạn có thể hiển thị một thông báo trong khu vực quản trị:

add_action( 'admin_notices', 'my_theme_dependencies' );

function my_theme_dependencies() {
  if( ! function_exists('plugin_function') )
    echo '<div class="error"><p>' . __( 'Warning: The theme needs Plugin X to function', 'my-theme' ) . '</p></div>';
}

Một cách khác là sử dụng một cái gì đó như http://tgmpluginactivation.com/


Nếu tác giả plugin thay đổi tên hàm mà bạn đặt câu hỏi 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 đó.
kaiser

Nếu bạn quan tâm đến phiếu bầu, thì bạn nên nâng cao bản thân Q, vì đó là một câu hỏi hay.
kaiser

Nếu tác giả plugin thay đổi tên hàm, anh ta sẽ nhận được khiếu nại từ nhiều người dùng hơn là anh ta sẽ thay đổi tên tệp.
scribu

Và tôi đã đánh giá thấp câu trả lời của bạn vì nó không giải quyết được câu hỏi, IMO. Hoặc bạn muốn tôi downvote một cách bí mật, không có lời giải thích nào được đưa ra?
scribu

Tôi chỉ nói về downvote, không bình luận. Nhận xét này là ok, vì chủ đề này là một cái gì đó cần thảo luận. Tôi sẽ thêm một câu trả lời khác vì những suy nghĩ của tôi đằng sau sẽ vượt quá chiều dài bình luận. Vui lòng chỉ chỉnh sửa câu trả lời, để chúng tôi có thể giữ kết quả thảo luận trong các phiên bản để mọi người cùng theo dõi. Cảm ơn.
kaiser

1

Mặc dù điều này sẽ không ngăn chủ đề bị phá vỡ khi plugin bị vô hiệu hóa, tôi sẽ xem bài viết hấp dẫn này về cách "Hiển thị thông báo của quản trị viên cho các chủ đề bắt buộc" . Tôi chưa bao giờ thấy thoải mái với ý tưởng về một chủ đề buộc một plugin phải được cài đặt, và vì vậy đây có vẻ như là lựa chọn tốt nhất tiếp theo.

Một suy nghĩ nhanh khác: Tôi chưa bao giờ thử điều này, nhưng tôi tự hỏi liệu bạn có thể tìm ra một cách thông minh nào đó để chứa nhiều móc trong một điều kiện không. Có lẽ bạn có thể tách ra tất cả các hàm có điều kiện trong một tệp khác và chỉ yêu cầu nó nếu if( function_exists( 'plugin_function' ) )trả về true(với sự hiểu rằng đây là một kiểm tra không hoàn hảo.


0

Nếu bạn cần nó chỉ là một trang plugin, thì có is_plugin_active(). Nếu bạn cần nó bên ngoài, bạn nên sao chép / dán chức năng cốt lõi vào chủ đề của mình và sau đó sử dụng lại:

if ( ! is_admin() )
{
/**
 * Check whether the plugin is active by checking the active_plugins list.
 *
 * @since 2.5.0
 *
 * @param string $plugin Base plugin path from plugins directory.
 * @return bool True, if in the active plugins list. False, not in the list.
 */
function is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}
}

Các điều kiện tránh bất kỳ lỗi nào với hai lần xác định hàm.


Điều đó không thực sự trả lời câu hỏi. Nó chỉ thay thế if(function_exist('plugin_function'))bằngif(is_plugin_active('plugin-file.php'))
scribu

0

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.

  1. (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
  2. (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
  3. (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 shutdownmó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.


Đối với hồ sơ, đây là một cách sử dụng chức năng của trang web không chính thống. Nó làm tôi nhớ đến c2.com/cgi/wiki
scribu

Vâng, đúng vậy. Nhưng tôi không biết làm thế nào chúng ta có thể tiếp tục cuộc thảo luận mà không che giấu nó khỏi những độc giả sau này.
kaiser

Tôi sẽ không nhận ra rằng việc đăng câu hỏi sẽ tạo ra một cuộc thảo luận :) Nhưng nó thực sự thú vị và tôi cảm ơn cả hai vì nỗ lực và thời gian của bạn đã đưa ra lời khuyên và cung cấp một số cuộc tranh luận chu đáo. Tôi nghĩ rằng lời khuyên từ scribu (một trong số đó là) sử dụng lớp Kích hoạt TGM có thể đưa ra một giải pháp cho câu trả lời của tôi ít nhất là từ quan điểm thực tế, tôi sẽ xem xét nó. Tuy nhiên, tôi vẫn theo dõi toàn bộ cuộc thảo luận vì các phương pháp khác được đề xuất có ý nghĩa trong các tình huống nhất định và rất thú vị để tôi đọc, cảm ơn!
unfulvio
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.