Chức năng được chia sẻ trong plugin và chủ đề


8

Gần đây tôi đã bắt đầu phát triển các plugin và chủ đề và tôi thấy rằng tôi cần sử dụng một số chức năng của cả hai.

Thỉnh thoảng tôi nghĩ về việc kiểm tra xem hàm / lớp có tồn tại trước khi khai báo như đã nói trên bài đăng này không: Khi nào kiểm tra xem một hàm có tồn tại không

Nhưng đó được coi là thực hành xấu. Cách tốt nhất để ngăn ngừa xung đột và giữ cho các chủ đề & plugin hoạt động độc lập mà không cần cài đặt một chủ đề / plugin là gì?

Câu trả lời:


12

Hành động & Bộ lọc

Cách tốt nhất của imho là sử dụng một hành động để đưa các chức năng của plugin vào các chủ đề.

Ví dụ 1

Đây là một plugin nhỏ để kiểm tra điều này.

<?php 
/** Plugin Name: (#68117) Print Hello! */
function wpse68117_print_hello()
{
    echo "Hello World!";
}
add_action( 'wpse68117_say', 'wpse68117_print_hello' );

Bên trong chủ đề:

<?php
/** Template Name: Test »Print Hello!« Plugin */
get_header();
// Now we call the plugins hook
do_action( 'wpse68117_say' );

Chuyện gì đang xảy ra / Đứa trẻ kool

Bằng cách này, chúng ta không phải kiểm tra sự tồn tại của một hàm, một tệp, một lớp, một phương thức hoặc thậm chí là toàn cầu (không làm điều này!) $variable. WP intern toàn cầu đã thực hiện điều này cho chúng tôi: Nó kiểm tra xem tên hook có phải là bộ lọc hiện tại không và có gắn nó không. Nếu nó không tồn tại, không có gì xảy ra.

Ví dụ # 2

Với plugin tiếp theo của chúng tôi, chúng tôi sẽ đính kèm một hàm gọi lại có một đối số.

<?php 
/** Plugin Name: (#68117) Print Thing! */
function wpse68117_print_thing_cb( $thing )
{
    return "Hello {$thing}!";
}
add_filter( 'wpse68117_say_thing', 'wpse68117_print_thing_cb' );

Bên trong chủ đề:

<?php
/** Template Name: Test »Print Thing!« Plugin */
get_header();
// Now we call the plugins hook
echo apply_filter( 'wpse68117_say_thing', 'World' );

Lần này, chúng tôi cung cấp cho người dùng / nhà phát triển khả năng thêm một đối số. Anh ta có thể echo/printđầu ra, hoặc thậm chí xử lý nó thêm (trong trường hợp bạn có một mảng đổi lại).

Ví dụ # 3

Với plugin thứ ba, chúng tôi sẽ đính kèm một hàm gọi lại có hai đối số.

<?php 
/** Plugin Name: (#68117) Print Alot! */
function wpse68117_alot_cb( $thing, $belongs = 'is mine' )
{
    return "Hello! The {$thing} {$belongs}";
}
add_filter( 'wpse68117_grab_it', 'wpse68117_alot_cb' );

Bên trong chủ đề:

<?php
/** Template Name: Test »Print Alot!« Plugin */
get_header();
// Now we call the plugins hook
$string_arr = implode(
     " "
    ,apply_filter( 'wpse68117_grab_it', 'World', 'is yours' )
);
foreach ( $string_arr as $part )
{
     // Highlight the $thing
     if ( strstr( 'World', $part ) 
     {
         echo "<mark>{$part} </mark>";
         continue;
     }
     echo "{$part} ";
}

Plugin này hiện cho phép chúng ta chèn hai đối số. Chúng ta có thể lưu nó vào $variablevà xử lý thêm.

Phần kết luận

Với việc sử dụng các bộ lọc và hành động, bạn sẽ mang lại hiệu suất tốt hơn bằng cách tránh các kiểm tra không cần thiết (so sánh tốc độ function_*/class_*/method_*/file_existshoặc tìm kiếm toàn cầu với in_array()các tìm kiếm bộ lọc ~ 1k (?)). Bạn cũng tránh có tất cả những Thông báo không cần thiết cho việc không đặt biến, v.v., vì plugin quan tâm đến điều này.


2
Cái nhìn sâu sắc tuyệt vời về một chủ đề thực hành tốt nhất!
Adam

1
Cảm ơn kaiser, bạn đi kèm với thực tiễn tốt nhất có thể tốt nhất cho vấn đề này. cảm ơn lần nữa
Jeg Bagus

btw, chúng ta cần đặt tên khác cho cùng một chức năng được chia sẻ giữa plugin & theme phải không?
Jeg Bagus

giả sử tôi có chức năng tôi gọi jlog sẽ thực hiện gói đơn giản trước biến và in nội dung của biến đó. Tôi thêm chức năng jlog trên các chủ đề và plugin, làm thế nào tôi có thể ngăn chặn bất kỳ xung đột?
Jeg Bagus

1
@JegBagus Bạn là một người rất bối rối :) Vui lòng cập nhật câu hỏi của bạn với các chức năng chính xác và giải thích những gì họ đang làm và nơi họ nên làm gì đó. Và hãy làm sạch ý kiến ​​của bạn ở đây. Cảm ơn.
kaiser
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.