Mục tiêu thực tiễn tốt nhất để phát triển plugin? [đóng cửa]


135

Bắt đầu một wiki cộng đồng để thu thập các thực tiễn tốt nhất khách quan để phát triển plugin. Câu hỏi này được lấy cảm hứng từ ý kiến ​​của @ EAMann về wp-hacker .

Ý tưởng là hợp tác về những thực tiễn tốt nhất khách quan có thể để cuối cùng chúng ta có thể sử dụng chúng trong một số quy trình đánh giá cộng tác.

CẬP NHẬT: Sau khi thấy một vài phản hồi đầu tiên, rõ ràng là chúng ta chỉ cần có một ý tưởng / gợi ý / thực hành tốt nhất cho mỗi câu trả lời và mọi người nên xem lại danh sách để đảm bảo không có sự trùng lặp trước khi đăng.


Tôi thực sự không hiểu làm thế nào wiki cộng đồng nên hoạt động trên cái này (và những cái khác) với SE đúng cách, nhưng có lẽ đó là một câu hỏi trên meta. Nó sẽ chỉ chồng chất chủ yếu vào các câu trả lời.
hakre

@hakre: Điểm tuyệt vời. Sau khi thấy điều tôi sẽ thêm vào mô tả rằng mọi người chỉ nên thêm một ý tưởng cho mỗi "câu trả lời" và tôi sẽ thay đổi câu trả lời hiện có của mình thành nhiều câu trả lời.
MikeSchinkel

Câu trả lời:


72

Sử dụng hành động và bộ lọc

Nếu bạn nghĩ mọi người muốn thêm hoặc thay đổi một số dữ liệu: hãy cung cấp application_filters () trước khi quay lại .

PS Một điều tôi thấy hơi thất vọng và địa chỉ câu hỏi của bạn là tỷ lệ phần trăm các plugin được thiết kế chỉ dành cho người dùng cuối, tức là không có móc nối của riêng họ. Hãy tưởng tượng nếu WordPress được thiết kế giống như hầu hết các plugin? Nó sẽ không linh hoạt và là một giải pháp rất thích hợp.

Có lẽ mọi thứ sẽ khác nếu WordPress có khả năng tự động cài đặt các plugin mà các plugin khác phụ thuộc vào? Vì tôi thường phải viết rất nhiều chức năng tôi cần từ đầu vì khách hàng muốn mọi thứ theo một cách nhất định và các plugin có sẵn, trong khi 90% ở đó, không cho phép tôi linh hoạt cập nhật 10% còn lại.

Tôi thực sự mong muốn những người dẫn đầu cộng đồng WordPress sẽ xác định một cách để đảm bảo rằng các plugin được khen thưởng khi tuân theo các thực tiễn tốt nhất (chẳng hạn như thêm móc cho các nhà phát triển khác) giống như các câu trả lời tốt được thưởng trên trang web StackExchange.

Hãy lấy một ví dụ từ một câu hỏi khác :

Ví dụ: Tôi muốn làm một cái gì đó trong plugin của mình khi ai đó đăng lại bài viết. Nếu có một cái móc tùy chỉnh trong bất cứ thứ gì mà plugin rạn phổ biến là tôi có thể nối vào và thoát ra, điều đó thật tuyệt. Không có, vì vậy tôi có thể sửa đổi plugin của họ để bao gồm nó, nhưng nó chỉ hoạt động cho bản sao của tôi và tôi không muốn cố gắng phân phối lại.

Liên quan


55

Tải tập lệnh / CSS bằng wp_enqueue_scriptwp_enqueue_style

Các plugin không nên tải / cố gắng tải các phiên bản trùng lặp của các tệp JS / CSS, đặc biệt là các tệp jQuery và các tệp JS khác có trong WP Core.

Các plugin nên luôn luôn sử dụng wp_enqueue_scriptwp_enqueue_stylekhi liên kết các tệp JS và CSS và không bao giờ trực tiếp qua <script>các thẻ.

Liên quan


1
Gợi ý : Có thể đáng để lưu ý một lưu ý nhỏ về việc sử dụng các phụ thuộc trong đó (vì đó là một phần của hệ thống enqueue).
t31os

Đúng, nhưng tốt hơn là bạn đăng ký các kiểu và tập lệnh trước và sau đó liệt kê tập lệnh này qua ID. Điều này rất tốt cho các nhà phát triển khác để thay đổi tập lệnh hoặc sử dụng nó trong các plugin tùy chỉnh. Nó cũng dễ dàng hơn để thay đổi thứ tự hoặc tạo một tập tin tóm tắt.
bueltge

2
cộng với, tải tập lệnh và kiểu trên các trang nếu cần. scribu.net/wordpress/optimal-script-loading.html
MR

49

Hỗ trợ I18n

Tất cả các chuỗi đầu ra phải được liên kết với một miền văn bản phù hợp để cho phép quốc tế hóa bởi các bên quan tâm, ngay cả khi nhà phát triển không quan tâm đến việc dịch trình cắm của riêng họ.

Lưu ý rằng việc tải các tệp ngôn ngữ trong khi inithành động là rất quan trọng để người dùng có thể nối vào hành động.

Xem Codex: I18n dành cho nhà phát triển WordPress

Và cũng bài viết này: Tải tập tin ngôn ngữ WP một cách chính xác .

Kể từ WordPress 4.6+

WP 4.6 đã thay đổi thứ tự tải và các vị trí được kiểm tra, nó đã giúp các nhà phát triển và người dùng dễ dàng hơn rất nhiều.

Xem xét một plugin có tên miền văn bản 'my-plugin', giờ đây WordPress sẽ tìm kiếm tệp dịch trong:
/wp-content/lacular/plugins/my-plugin-en_US.mo

Nếu nó không tìm thấy ở đó thì nó sẽ tìm một cái mà plugin yêu cầu nó tìm (thông thường trong thư mục 'ngôn ngữ' của pluigns nếu theo codex):
/ wp-content / plugins / my-plugin / Languages ​​/ my- plugin-en_US.mo

Cuối cùng, nếu không tìm thấy tệp ngôn ngữ nào, nó sẽ kiểm tra vị trí mặc định của:
/wp-content/lacular/my-plugin-en_US.mo

Kiểm tra đầu tiên đã được thêm vào 4.6 và cung cấp cho người dùng một vị trí xác định để thêm tệp ngôn ngữ, vì trước đó họ cần biết nhà phát triển đã thêm tệp ngôn ngữ ở đâu, bây giờ người dùng chỉ cần biết miền văn bản của plugin: / wp-content / ngôn ngữ / plugin / TEXTDOMAIN-LOCAL.mo


Dưới đây là cách cũ (Không liên quan kể từ WP 4.6+)

[...]
Cuối cùng, tôi muốn chỉ ra rằng điều quan trọng là tải các tệp ngôn ngữ người dùng tùy chỉnh từ WP_LANG_DIR trước khi bạn tải các tệp ngôn ngữ đi kèm với plugin . Khi nhiều tệp mo được tải cho cùng một tên miền, bản dịch tìm thấy đầu tiên sẽ được sử dụng. Bằng cách này, các tệp ngôn ngữ được cung cấp bởi plugin sẽ đóng vai trò dự phòng cho các chuỗi không được dịch bởi người dùng.

public function load_plugin_textdomain()
{
    $domain = 'my-plugin';
    // The "plugin_locale" filter is also used in load_plugin_textdomain()
    $locale = apply_filters( 'plugin_locale', get_locale(), $domain );

    load_textdomain( 
            $domain, 
            WP_LANG_DIR . '/my-plugin/' . $domain . '-' . $locale . '.mo' 
    );
    load_plugin_textdomain( 
            $domain, 
            FALSE, 
            dirname( plugin_basename(__FILE__) ) . '/languages/' 
    );
}

Đối với tôi một trong những quan trọng nhất. Nó không phải là nhiều việc phải làm thêm nhưng một trong những điều bạn có thể làm cho plugin của mình hữu ích hơn cho hàng triệu người dùng không nói tiếng Anh là ngôn ngữ đầu tiên của họ. Bạn thậm chí không phải tự dịch bất kỳ từ nào, nhưng hãy chuẩn bị mọi thứ để được dịch.
2ndkauboy

Đây là một điều có giá trị, nhưng dễ thực hiện, chỉ muốn nói rằng tôi đồng ý và mọi tác giả plugin nên làm điều này.
t31os

48

Đảm bảo các plugin tạo không có lỗi với WP_DEBUG

Luôn kiểm tra các plugin của bạn bằng cách WP_DEBUGbật và lý tưởng là nó đã được bật trong suốt quá trình phát triển của bạn. Một plugin không nên ném bất kỳ lỗi nào với WP_DEBUG. Điều này bao gồm các thông báo không dùng nữa và các chỉ mục không được kiểm tra.

Để bật gỡ lỗi, hãy chỉnh sửa wp-config.phptệp của bạn để WP_DEBUGhằng số được đặt thành true. Xem Codex trên Debug để biết thêm chi tiết.


Vui lòng xem CẬP NHẬT về việc chỉ thực hành tốt nhất cho mỗi câu trả lời; bạn có thể chia thành nhiều câu trả lời không?
MikeSchinkel

Chắc chắn không có vấn đề. Xin lỗi vì điều đó.
John P Bloch

Cảm ơn, và không phải là sự giám sát của bạn, nó là của tôi. Tôi đã sửa đổi câu hỏi để yêu cầu một thực tiễn tốt nhất cho mỗi câu trả lời dựa trên câu hỏi của @ hakre về các bản sao và cách thực hiện công việc này.
MikeSchinkel

6
Nếu tôi có thể nâng cao câu trả lời này hai lần, tôi sẽ làm thế. Thật là bực bội khi tôi đang làm việc trên một trang dev và phải tắt WP_DEBUG vì một plugin tôi cần sử dụng là đưa ra các cảnh báo và thông báo ở mọi nơi.
Ian Dunn

42

Sử dụng chức năng hiện có đầu tiên trong WordPress Core

Nếu bạn có thể: sử dụng các chức năng hiện có trong lõi WordPress thay vì tự viết. Chỉ phát triển các chức năng PHP tùy chỉnh khi không có chức năng có sẵn thích hợp trong lõi WordPress.

Một lợi ích là bạn có thể sử dụng "thông báo không dùng nữa" để dễ dàng theo dõi các chức năng cần được thay thế. Một lợi ích khác là người dùng có thể xem tài liệu chức năng trong Codex và hiểu rõ hơn về những gì plugin làm ngay cả khi họ không phải là nhà phát triển PHP có kinh nghiệm.

Liên quan


Một trong những vấn đề lớn nhất ở đây là học được rằng có một chức năng phù hợp tồn tại. Những gì sẽ hữu ích sẽ là một nơi để đăng mã và / hoặc chức năng cần phải cho phép cộng đồng nhận xét về chức năng nào để sử dụng tốt nhất. Có lẽ StackExchange có thể được sử dụng cho việc này?
MikeSchinkel

Puh. Điều đó sẽ khá khó khăn và tôi đoán một số loại nhiệm vụ vô tận. Tôi nghĩ rằng việc mở rộng codex theo cách này sẽ là tốt nhất, bởi vì nó đã tồn tại.
kaiser

Tôi đoán việc mở rộng codex và có thể liên kết từ đó đến các chủ đề stockexchange có liên quan sẽ đủ tốt.
kaiser

4
Một vấn đề với điều đó là rất nhiều lõi không thực sự được thiết kế theo cấu trúc để tái sử dụng. Tôi chỉ phải sao chép và sửa đổi một nửa các hàm thao tác / siêu dữ liệu hình ảnh để tạo ra kiểu đăng hành xử giống như tệp đính kèm của riêng tôi, chỉ vì một hàm như downsize () gọi một số hàm bao gồm kiểm tra mã hóa cứng cho tệp đính kèm post-type = ' '. Có rất nhiều thứ giống như wp_count_posts () không linh hoạt là một ví dụ khác. Trước khi bạn thực sự có thể sử dụng lại cốt lõi, WP cần tái cấu trúc hoàn chỉnh.
wyrfel

Hoàn toàn đồng ý về điều này. Ví dụ yêu thích mọi thời đại của tôi : wp-login.php. Vì vậy, "Nếu bạn có thể" là một khởi đầu tốt cho câu trả lời ...
kaiser

35

Gỡ cài đặt sẽ xóa tất cả dữ liệu của plugin

Khi bị xóa khỏi cài đặt WordPress, plugin sẽ xóa tất cả các tệp, thư mục, mục cơ sở dữ liệu và bảng mà nó đã tạo cũng như các giá trị tùy chọn mà nó đã tạo.

Plugin có thể cung cấp tùy chọn để xuất / nhập cài đặt, để cài đặt có thể được lưu bên ngoài WordPress trước khi xóa.

Liên quan


4
Đây phải là hành vi mặc định, vâng, nhưng nó cũng sẽ nhắc người dùng giữ một số dữ liệu ... như khi gỡ cài đặt trò chơi video hỏi bạn có muốn xóa trò chơi đã lưu và tài liệu đã tải xuống không. Người dùng chỉ có thể tắt trình cắm cho mục đích thử nghiệm và không muốn quay lại thiết lập các tùy chọn của họ khi họ kích hoạt lại.
EAMann

1
Tôi chỉ nói về khi một plugin bị xóa hoàn toàn, không phải khi nó bị vô hiệu hóa.
Travis Northcutt

2
Tôi hiểu điều đó ... nhưng đôi khi tôi sẽ xóa các trình cắm để tôi có thể thêm lại chúng một cách thủ công từ phiên bản sao lưu hoặc phiên bản beta chưa được lưu trữ trong kho lưu trữ ...
EAMann

4
@EAMann: Đối với điều đó và để di chuyển các plugin sang một máy chủ khác, một plugin nên cung cấp một cơ chế để xuất và nhập các cài đặt.
hakre

2
Tôi đã thấy một vài plugin cung cấp nút "Gỡ cài đặt" trong cài đặt của chúng với các cảnh báo lớn màu đỏ, nó sẽ xóa tất cả dữ liệu. Điều này tách biệt với khử kích hoạt và tôi nghĩ rằng một cách tuyệt vời để xử lý nó. Không phải ai cũng sử dụng nút "Xóa" để xóa plugin.
gabrielk

34

Ngăn chặn SQL tiêm với dữ liệu đầu vào

Một plugin nên vệ sinh tất cả đầu vào của người dùng được truy xuất trực tiếp hoặc gián tiếp (ví dụ thông qua $_POSThoặc$_GET ) trước khi sử dụng các giá trị đầu vào để truy vấn cơ sở dữ liệu MySQL.

Xem: Định dạng các câu lệnh SQL .


5
Bạn cũng nên khử trùng dữ liệu đến hiện của cơ sở dữ liệu. Về cơ bản, không bao giờ tin tưởng bất kỳ dữ liệu nào không được mã hóa cứng. codex.wordpress.org/Data_Validation cũng là một tài liệu tham khảo tốt.
Ian Dunn

31

Tiền tố Tất cả các mục không gian tên toàn cầu

Một plugin nên có tiền tố đúng TẤT CẢ các mục không gian tên toàn cầu (hằng, hàm, lớp, biến, thậm chí những thứ như phân loại tùy chỉnh, loại bài đăng, widget, v.v.). Chẳng hạn, không tạo một hàm gọi là init(); thay vào đó, đặt tên cho nó là như thế jpb_init().

Thông thường, nên sử dụng tiền tố ba hoặc bốn chữ cái trước tên hoặc để sử dụng Tính năng không gian tên PHP . So sánh: Tiền tố một chữ cái cho các hằng lớp PHP?

Liên quan


31

Sử dụng một mã PHP5 hướng đối tượng và lớp

Không có lý do gì để không viết mã PHP5 hướng đối tượng sạch. Hỗ trợ PHP4 sẽ loại bỏ sau khi phát hành tiếp theo (WP 3.1). Tất nhiên, bạn có thể tiền tố tất cả các tên hàm của bạn để kết thúc với endless_long_feft_names_with_lots_of_underscores, nhưng sẽ dễ dàng hơn nhiều khi chỉ viết một lớp đơn giản và gói mọi thứ trong đó. Ngoài ra, đặt lớp của bạn trong một tệp riêng biệt và đặt tên cho phù hợp để bạn có thể dễ dàng mở rộng và duy trì nó:

// in functions.php
require 'inc/class-my-cool-plugin.php';
new MyCoolPlugin();

// in inc/class-my-cool-plugin.php
class MyCoolPlugin {
    function __construct() {
        // add filter hooks, wp_enqueue_script, etc.

        // To assign a method from your class to a WP 
        // function do something like this
        add_action('admin_menu', array($this, "admin"));
    }

    public function admin() {
        // public methods, for use outside of the class
        // Note that methods used in other WP functions 
        // (such as add_action) should be public
    }

    private function somethingelse() {
        // methods you only use inside this class
    }
}

không sử dụng MyCoolPlugin () mới; Tôi nghĩ tốt hơn là bạn nên kết nối WP thông qua Hook: plugins_loaded
bueltge

Không chắc về việc đó. Theo codex plugins_loaded là một trong những thứ đầu tiên được tải, vì vậy tôi nghĩ rằng sẽ có một chút khác biệt khi thực hiện một cấu trúc như thế này hoặc thêm nó dưới dạng một hành động.
Husky

5
nó chỉ là một trong những thực hành tốt nhất làm cho nó đẹp hơn cho mọi người.
Arlen Beiler

1
Theo như tôi có thể thấy, việc thêm một hook vào plugins_loaded sẽ giúp cải thiện bằng 0 và sẽ không phải là cách tốt nhất vì không có cải tiến nào, nếu có bất cứ điều gì là tăng mức sử dụng bộ nhớ, giảm tốc độ khi nó phải trải qua một hành động thay vì các hành động chỉ được thêm vào. Ngoài ra sử dụng OO không nên được coi là một thực hành tốt nhất.
Backie

4
@IanDunn: nếu bạn muốn hỗ trợ PHP4, nhưng hỗ trợ PHP4 đã bị loại bỏ kể từ năm 2008, hơn 4 năm trước. Không có lý do để vẫn sử dụng kiểm tra cụ thể PHP4.
Husky


23

Chỉ bao gồm các tệp mà bạn cần ...

Nếu bạn ở giao diện người dùng, đừng bao gồm mã liên quan đến khu vực quản trị.


21

Thông báo mất dữ liệu khi gỡ cài đặt plugin

Khi gỡ cài đặt, một plugin sẽ nhắc người dùng rằng nó sẽ xóa dữ liệu của nó và nhận được xác nhận rằng người dùng vẫn ổn với việc xóa dữ liệu trước khi thực hiện và plugin cũng sẽ cho phép người dùng tùy chọn giữ dữ liệu khi gỡ cài đặt. (Ý tưởng này từ @EAMann.)

Liên quan


3
Bản thân Wordpress hiển thị một thông báo cảnh báo trong quản trị viên, rằng điều này xảy ra (ít nhất là trong thân cây ngay bây giờ).
hakre

Ngoài thông báo cảnh báo được hiển thị bởi WordPress, plugin không thể nhắc người dùng, vì tại thời điểm gỡ cài đặt, nó đã bị hủy kích hoạt. Nhưng xem vé # 20578 .
JD

19

Đặt tên thư mục của plugin

/ plugin / pluginname / {khác nhau}

"Pluginname" được sử dụng cho thư mục phải luôn luôn thay đổi.

Điều này thường được xử lý bằng cách xác định các hằng số và sử dụng chúng một cách nhất quán trong suốt plugin.

Không cần phải nói nhiều plugin phổ biến là tội nhân.

Liên quan:

  • plugins_url() để dễ dàng liên kết đến các tài nguyên, bao gồm plugin.

Đổi tên thư mục của plugin sẽ khiến các cập nhật tự động bị hỏng, vì vậy tôi không chắc chắn đó là điều tốt nhất để làm.
mtekk

Bạn phải kích hoạt lại plugin sau khi thực hiện thay đổi (thay đổi tên có thể dẫn đến việc tắt plugin), tại thời điểm đó WP sẽ tạo lại hoặc cập nhật các mục DB phù hợp liên quan đến plugin (vì vậy nó sẽ không phá vỡ cập nhật ở tất cả).
t31os

Thay vì sử dụng hằng số, hãy sử dụng plugin_basename(__FILE__)để tìm ra tên địa phương của plugin. Điều đó hữu ích khi có các bản sao của cùng một plugin (thử nghiệm, nhiều tài khoản ở nơi khác nhưng chỉ có một bản sao cho mỗi plugin, ...).
Raphael

19

Sử dụng WordPress (tích hợp) Xử lý lỗi

Đừng chỉ return;nếu một số người dùng nhập sai. Cung cấp cho họ một số thông tin về đã được thực hiện sai.

function some_example_fn( $args = array() ) 
{
    // If value was not set, build an error message
    if ( ! isset( $args['some_value'] ) )
        $error = new WP_Error( 'some_value', sprintf( __( 'You have forgotten to specify the %1$s for your function. %2$s Error triggered inside %3$s on line %4$s.', TEXTDOMAIN ), '$args[\'some_value\']', "\n", __FILE__, __LINE__ ) );

    // die & print error message & code - for admins only!
    if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) ) 
        wp_die( $error->get_error_code(), 'Theme Error: Missing Argument' );

    // Elseif no error was triggered continue...
}

Một lỗi (đối tượng) cho tất cả

Bạn có thể thiết lập một đối tượng lỗi toàn cầu cho chủ đề hoặc plugin của mình trong quá trình bootstrap:

function bootstrap_the_theme()
{
    global $prefix_error, $prefix_theme_name;
    // Take the theme name as error ID:
    $theme_data = wp_get_theme();
    $prefix_theme_name = $theme_data->Name;
    $prefix_error = new WP_Error( $theme_data->Name );

    include // whatever, etc...
}
add_action( 'after_setup_theme', 'bootstrap_the_theme' );

Sau này bạn có thể thêm lỗi không giới hạn theo yêu cầu:

function some_theme_fn( $args )
{
    global $prefix_error, $prefix_theme_name;
    $theme_data = wp_get_theme();
    if ( ! $args['whatever'] && current_user_can( 'manage_options' ) ) // some required value not set
        $prefix_error->add( $prefix_theme_name, sprintf( 'The function %1$s needs the argument %2$s set.', __FUNCTION__, '$args[\'whatever\']' ) );

    // continue function...
}

Sau đó, bạn có thể lấy tất cả chúng ở cuối chủ đề của bạn. Bằng cách này, bạn không làm gián đoạn hiển thị trang và vẫn có thể xuất tất cả các lỗi để phát triển

function dump_theme_errors()
{
    global $prefix_error, $prefix_theme_name;

    // Not an admin? OR: No error(s)?
    if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
        return;

    $theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
    echo '<h3>Theme Errors</h3>';
    foreach ( $theme_errors as $error )
        echo "{$error}\n";
}
add_action( 'shutdown', 'dump_theme_errors' );

Bạn có thể tìm thêm thông tin tại Q này . Một vé liên quan để sửa lỗi "làm việc cùng nhau" WP_Errorwp_die()được liên kết từ đó và một vé khác sẽ theo sau. Bình luận, phê bình và như vậy được đánh giá cao.


Tại sao bạn khởi tạo một đối tượng WP_Error nếu bạn chỉ truy cập các thuộc tính của nó và không bao giờ vượt qua thể hiện dưới dạng một đối tượng?
ProfK

@ProfK Tôi đã làm lại nó ngắn hơn và tiêu đề / nội dung wp_die();bị sai (đảo ngược). Về Q của bạn) Tôi không hoàn toàn hiểu được. Khi bạn thiết lập một thể hiện của lớp WP_Error bạn có thể truy cập vào dữ liệu của nó thông qua các chức năng như get_error_code();, get_error_message();, get_error_data();và các phiên bản số nhiều. Bạn cũng chỉ có thể khởi tạo nó một lần tại bootstrap của chủ đề hoặc plugin của mình và chỉ cần sử dụng $error->add();để lấp đầy các lỗi khác và cuối cùng xuất nó ở chân trang $error->get_error_messages();để bắt tất cả.
kaiser

@ProfK Tôi sẽ đăng các bản cập nhật trong tương lai cho Q này . Tôi hiện đang kiểm tra hành vi của lớp lỗi wp và muốn viết một vé về API lỗi chủ đề công cộng (dự thảo đã được thực hiện). Bạn sẽ tìm thấy một liên kết đến một vé đó sẽ đem lại WP_Errorwp_die()xích lại gần nhau (đã có một miếng vá) ở dưới cùng của Q. Bất kỳ ý kiến, đề nghị, phê bình và khác được đánh giá cao.
kaiser

18

Giảm thiểu tên được thêm vào không gian tên toàn cầu

Một plugin nên giảm tác động của nó hết mức có thể bằng cách giảm thiểu số lượng tên mà nó thêm vào không gian tên toàn cầu .

Điều này có thể được thực hiện bằng cách gói các chức năng của plugin vào một lớp hoặc bằng cách sử dụng tính năng không gian tên PHP . Tiền tố mọi thứ cũng có thể giúp nhưng không linh hoạt.

Bên cạnh các chức năng và các lớp, một plugin không nên giới thiệu các biến toàn cục. Sử dụng các lớp thường làm lỗi chúng và nó đơn giản hóa việc bảo trì plugin.

Liên quan


Bạn có thể vui lòng chuyển "không nên giới thiệu các biến toàn cục" sang câu trả lời của riêng mình không? Điều đó có liên quan đến việc tách biệt với câu hỏi này và thực sự tôi muốn tranh luận (cả hai vì tôi nghĩ tôi có thể không đồng ý là trường hợp đặc biệt và vì tôi muốn học hỏi từ ý kiến ​​của người khác.)
MikeSchinkel

17

Nhận xét bằng PhpDoc

Thực hành tốt nhất là gần với phong cách PhpDoc. Nếu bạn không sử dụng IDE như "Eclipse", bạn có thể xem Hướng dẫn sử dụng PhpDoc .

Bạn không cần phải biết chính xác làm thế nào điều này hoạt động. Các nhà phát triển chuyên nghiệp có thể đọc mã bằng mọi cách và chỉ cần điều này như một bản tóm tắt. Các lập trình viên và người dùng sở thích có thể đánh giá cao cách bạn giải thích nó ở cùng cấp độ kiến ​​thức.


17

Sử dụng API cài đặt trước khi add_option

Thay vì thêm các tùy chọn vào DB thông qua chức năng add_option, bạn nên lưu trữ chúng dưới dạng một mảng bằng cách sử dụng API Cài đặt chăm sóc mọi thứ cho bạn.

Sử dụng API sửa đổi chủ đề trước khi add_option

Các Modifications API là một cấu trúc khá đơn giản và là một cách an toàn cho phép thêm và lấy tùy chọn. Mọi thứ được lưu dưới dạng giá trị nối tiếp trong cơ sở dữ liệu của bạn. Dễ dàng, an toàn & đơn giản.


1
Và hơn nữa, sử dụng update_optionvà không bao giờ add_option, chức năng cập nhật sẽ tạo tùy chọn khi nó không tồn tại .. :)
t31os

3
Tôi sẽ không nói không bao giờ sử dụng add_option. Có một trường hợp sử dụng tốt cho trường hợp add_optionnếu tùy chọn đã được đặt, nó không bị thay đổi, vì vậy tôi sử dụng nó trong kích hoạt để duy trì các tùy chọn người dùng hiện có.
ProfK

1
Một trường hợp sử dụng khác add_optionlà khi bạn muốn vô hiệu hóa tải tự động. update_optionsẽ buộc tự động tải thành đúng, vì vậy bạn muốn tắt tự động tải, hãy sử dụng add_optionkhi ban đầu tạo tùy chọn.
Dave Romsey

16

Bảo vệ quyền riêng tư của người dùng Plugin

(Trước đây: Truyền thông API ẩn danh)

Nếu trình cắm giao tiếp với hệ thống bên ngoài hoặc API (ví dụ: một số Dịch vụ web), thì trình cắm đó sẽ ẩn danh hoặc cung cấp cho người dùng một tùy chọn ẩn danh để đảm bảo rằng không có dữ liệu nào liên quan đến người dùng plugin bị rò rỉ cho bên thứ hai không bị kiểm soát.


15

Plugin lưu trữ trên WordPress.org

Sử dụng kho lưu trữ SVN được cung cấp trên WordPress.org để lưu trữ các plugin. Nó giúp cho trải nghiệm người dùng cập nhật dễ dàng hơn và nếu bạn chưa từng sử dụng SVN trước đây, điều đó giúp bạn thực sự hiểu bằng cách sử dụng nó trong ngữ cảnh chứng minh điều đó.


15

Cung cấp Kiểm soát truy cập bằng cách sử dụng Quyền

Trong nhiều trường hợp, người dùng có thể không muốn tất cả mọi người có quyền truy cập vào các khu vực được tạo bởi plugin của bạn, đặc biệt với các plugin thực hiện nhiều thao tác phức tạp, một kiểm tra khả năng mã hóa cứng có thể không đủ.

Ít nhất, hãy kiểm tra khả năng phù hợp cho tất cả các loại thủ tục khác nhau mà plugin của bạn có thể được sử dụng.


12

Nhập / xuất cài đặt plugin

Nó không phổ biến trên các plugin, nhưng nếu plugin của bạn có (một số) cài đặt, thì nó sẽ cung cấp Nhập / Xuất dữ liệu như cấu hình và đầu vào của người dùng .

Nhập / Xuất cải thiện khả năng sử dụng của plugin.

Một plugin ví dụ có chức năng nhập và xuất như vậy (và cũng là cơ chế hoàn tác) là Breadcrumb NavXT (Plugin Wordpress) (tiết lộ đầy đủ: một số mã nhỏ của tôi trong đó, hầu hết đã được thực hiện bởi mtekk).

Liên quan


12

Sắp xếp mã của bạn

Thật khó để đọc mã không được viết theo thứ tự nó được thực thi. Đầu tiên bao gồm / yêu cầu, xác định, wp_enqueue_style & _script, v.v., sau đó là các chức năng mà plugin / chủ đề cần và cuối cùng là trình tạo (ví dụ: màn hình quản trị viên, nội dung tích hợp trong chủ đề, v.v.).

Cố gắng tách những thứ như css và js trong các thư mục riêng của họ. Cũng cố gắng làm điều này với các chức năng chỉ là người trợ giúp, như làm phẳng mảng và tương tự. Giữ tệp "chính" sạch và dễ đọc nhất có thể là cách giúp người dùng, nhà phát triển và bạn, khi bạn cố cập nhật trong một năm và không thấy mã trong thời gian dài hơn.

Thật tốt khi có một cấu trúc bạn lặp lại thường xuyên, vì vậy bạn luôn tìm thấy con đường của mình. Phát triển theo cấu trúc đã biết trên các dự án khác nhau sẽ cho bạn thời gian để làm cho nó tốt hơn và ngay cả khi khách hàng của bạn chuyển sang nhà phát triển khác, bạn sẽ không bao giờ nghe thấy "anh ta để lại một sự hỗn loạn". Điều này xây dựng danh tiếng của bạn và nên là một mục tiêu dài hạn.


Tôi sợ rằng đây là một chút quá nhiều về phong cách mà mọi người sẽ tranh luận và không thực hành khách quan tốt nhất mà tất cả những người được tôn trọng sẽ đồng ý. Điều rất quan trọng là chúng tôi chỉ giải quyết các thực tiễn tốt nhất khách quan để mọi người sẵn sàng đồng ý "ban phước" cho danh sách thay vì có các mục gây tranh cãi, bất kể ý nghĩa của nó tốt như thế nào.
MikeSchinkel

11

Chết với phong cách

chết một cách tử tế Tất cả các plugin (và thậm chí cả chủ đề) nên sử dụng wp_die()ở những nơi quan trọng để cung cấp cho người dùng một ít thông tin về những gì đã xảy ra. Lỗi php gây khó chịu và wp_diecó thể cung cấp cho người dùng một thông báo theo kiểu đẹp về những gì plugin (hoặc họ) đã làm sai. Thêm vào đó, nếu người dùng đã gỡ lỗi, plugin sẽ bị hỏng.

Việc sử dụng wp_die()cũng giúp các plugin / chủ đề của bạn tương thích với testsuite wordpress .

Liên quan:

11

Cung cấp màn hình trợ giúp cho người dùng

Sẽ tốt hơn khi nói RTFM (bấm trợ giúp) như một câu trả lời hơn là phải trả lời câu hỏi hết lần này đến lần khác.

/**
  * Add contextual help for this screen
  * 
  * @param $rtfm
  * @uses get_current_screen
  */ 
  function ContextualHelp( /*string*/ $rtfm) 
  { 
     $current_screen = get_current_screen();
     if ($current_screen->id == $this->_pageid) 
     {
        $rtfm .= '<h3>The WordPress Plugin - Screen A</h3>';
        $rtfm .= '<p>Here are some tips: donate to me ' .
     }
     return $rtfm; 
  }
add_action('contextual_help', array($this,'ContextualHelp'),1,1);

update / note: (xem bình luận từ kaiser): ví dụ trên sẽ được sử dụng trong một lớp


Nên có trong hộp công cụ của mọi người (miễn là bạn phải giải thích một màn hình ui quản trị cụ thể). +1
kaiser

Btw: Bạn nên đề cập rằng, điều này có nghĩa là cư trú trong Class và cách tương tác với $ this -> _ page_id & sẽ như thế nào nếu bạn thêm hook hành động từ tệp tin.php hoặc tệp plugin không có Class .
kaiser

10

Cung cấp các hình thức mở rộng

Khi một plugin cung cấp khả năng sở hữu dữ liệu đầu vào, nó sẽ luôn có một dấu móc ở cuối, ngay trước nút "gửi" và / hoặc "đặt lại", vì vậy các nhà phát triển có thể dễ dàng mở rộng biểu mẫu với không chỉ các trường, mà cả các nút.

Xem: API cài đặt

Liên quan


9

bao gồm chức năng luôn thông qua Hook, không trực tiếp.

Thí dụ:

  • Không sử dụng để bao gồm lớp của plugin thông qua mới mà không cần hook

  • Sử dụng plugin Hookins_loaded

    // add the class to WP                                   
    function my_plugin_start() {                                                               
        new my_plugin();   
    }                                                        
    add_action( 'plugins_loaded', 'my_plugin_start' );

Cập nhật: một ví dụ trực tiếp nhỏ: Plugin-svn-trunk-page và ví dụ giả

//avoid direct calls to this file where wp core files not present
if (!function_exists ('add_action')) {
        header('Status: 403 Forbidden');
        header('HTTP/1.1 403 Forbidden');
        exit();
}

if ( !class_exists( 'plugin_class' ) ) {
    class plugin_class {

        function __construct() {
        }

    } // end class

    function plugin_start() {

        new plugin_class();
    }

    add_action( 'plugins_loaded', 'plugin_start' );
} // end class_exists

Bạn cũng có thể tải qua mu_plugins_loaded trên multisite-install, xem codex để tham khảo hành động: http://codex.wordpress.org/Plugin_API/Action_Reference Ngoài ra, bạn có thấy, cách inlcude wP với hook này không: http: // adam. information / p / wp_hooks / hook / plugins_loaded? version = 2.1 & file = wp-settings.php Tôi sử dụng điều này rất thường xuyên và nó không quá khó và sớm, tốt hơn là một lớp mới cứng ();


@bueltige --- bạn có thể giải thích điều này thêm một chút không
NetConstructor.com

3
một nhỏ ví dụ trực tiếp: [Plugin-svn-cốp-page] svn.wp-plugins.org/filter-rewrite-rules/trunk/... và một ví dụ giả //avoid direct calls to this file where wp core files not present if (!function_exists ('add_action')) { header('Status: 403 Forbidden'); header('HTTP/1.1 403 Forbidden'); exit(); } if ( !class_exists( 'plugin_class' ) ) { class plugin_class { function __construct() { } } // end class function plugin_start() { new plugin_class(); } add_action( 'plugins_loaded', 'plugin_start' ); } // end class_exists
bueltge

2
@ Netconstructor.co - tôi đã cập nhật chủ đề, nhận xét ist xấu xí cho mã
bueltge

8

Plugins giấy phép theo Giấy phép tương thích GPL

Các plugin và chủ đề phải được cấp phép theo giấy phép tương thích với WordPress. Điều này cho phép chúng được phân phối lại với WordPress dưới dạng "chương trình". Giấy phép được đề nghị là GPL . Cẩn thận rằng tất cả các thư viện mã đi kèm với trình cắm đều tương thích với cùng một giấy phép.

(Đây là một vấn đềđiểm tranh luận nghiêm trọng cả trong quá khứ và hiện tại .)


Chúng ta hãy để điều đó với khả năng tương thích GPL vào lúc này: core.trac.wordpress.org/ticket/14685
hakre

8

Mô tả plugin của bạn nên chi tiết chính xác các chức năng của plugin của bạn. Có 10 plugin bài đặc trưng. Tất cả đều hiển thị các bài đăng nổi bật, nhưng nhiều người có các tính năng khác nhau. Thật dễ dàng để so sánh plugin của bạn với các plugin tương tự bằng cách đọc mô tả.

Bạn nên tránh khoe khoang về cách plugin của bạn đơn giản trừ khi nó thực sự rất cơ bản. Bạn nên bao gồm các liên kết hữu ích trong mô tả như liên kết đến cài đặt.


7

Giảm thiểu tác dụng phụ của Nguồn dữ liệu từ xa và Dịch vụ web

Một Plugin nên Cache / Shield Webservice và / hoặc XMLRPC / SOAP yêu cầu thông qua lớp bộ đệm / nhà cung cấp dữ liệu nếu bạn sử dụng chúng để không thực hiện các yêu cầu trước chờ phản hồi dịch vụ web (chậm).

Điều đó bao gồm việc tải xuống RSS feed và các trang khác. Thiết kế các plugin của bạn mà họ yêu cầu dữ liệu ở chế độ nền.

Một BƯỚC có thể là (Lấy bài đăng lên ping.fm làm ví dụ): Tạo bảng đệm, giả sử: ping_fm_buffer_post (ngày, giờ, tin nhắn, submit_time, trạng thái)

  1. Đối với mỗi lần bạn muốn gửi cập nhật cho ping.fm, hãy thêm nó vào bảng này.
  2. Bây giờ, chúng ta cần tạo một plugin để xử lý dữ liệu này. Plugin này sẽ chạy qua crontab để kiểm tra mọi bản cập nhật chưa được gửi
  3. Vì chúng tôi có bảng này, chúng tôi cũng có thể liệt kê mọi tin nhắn được gửi tới ping.fm và kiểm tra trạng thái của mỗi bài đăng. Chỉ trong trường hợp có vấn đề về phía ping.fm, chúng tôi có thể gửi lại.

Tôi không thực sự hiểu bạn đang đi đâu chính xác với điều này. Bạn có thể cung cấp một số liên kết đến tài liệu hỗ trợ?
MikeSchinkel

Ngoài ra, tôi không chắc chắn chính xác "Net Overhead" là gì. Không có một thuật ngữ tốt hơn? Nếu nó rõ ràng hơn, nó sẽ là một quy tắc khách quan tốt hơn. Và Ngăn chặn " là không thể; " Tối thiểu hóa " thay vào đó?
MikeSchinkel

Bạn (có lẽ) đúng. Từ ngữ xấu và ngăn chặn là không bao giờ có thể, giảm thiểu phù hợp tốt hơn.
hakre

7

Kiểm tra plugin của bạn

Chúng tôi chắc chắn nên có một số công cụ kiểm tra trên môi trường phát triển plugin của chúng tôi.

Dựa trên câu trả lời này của Ethan Seifert cho một câu hỏi kiểm tra, đây là những thực hành tốt để làm theo:

  • Kiểm thử đơn vị của bạn nên kiểm tra lượng hành vi nhỏ nhất mà một lớp có thể thực hiện.
  • Khi bạn đạt đến mức kiểm tra chức năng, đây là lúc bạn có thể kiểm tra mã của mình với các phụ thuộc Wordpress.
  • Tùy thuộc vào những gì plugin của bạn làm - hãy xem xét sử dụng các thử nghiệm dựa trên Selenium để kiểm tra sự hiện diện của dữ liệu trong DOM bằng cách sử dụng ID

Mặc dù kiểm tra là quan trọng, nói rằng kiểm tra đơn vị nên kiểm tra nhỏ nhất thay vì lớn nhất dường như không khôn ngoan. Nếu bạn gặp khó khăn khi kiểm tra các vấn đề phụ thuộc WordPress thì chỉ cần đi sâu vào lõi WordPress, bạn sẽ tìm thấy một loạt các biến toàn cục bên trong mà bạn có thể sử dụng để xem các mục có hoạt động không.
Backie

1
Nhưng bao gồm nhỏ nhất trước tiên là cơ bản, để bạn có thể đạt được thử nghiệm chức năng với WordPress như câu trả lời đã nói, phải không?
Fernando Briano

1
Đây là một plugin không phải là một ứng dụng, bạn có thể kiểm tra một ứng dụng Java mà không cần Java Runtime không? Có, bằng cách viết Java dưới dạng mockup và sau đó kiểm tra plugin của bạn. Rất có thể là những lỗi trong mockup của bạn. *) từ chối trách nhiệm hoặc biên dịch nó thành mã gốc.
edelwater
Licensed under cc by-sa 3.0 with attribution required.