Hành động, chức năng và điều kiện


7

Khi phát triển các chủ đề và plugin, đôi khi cần phải thêm một số chức năng vào một số hook bằng cách sử dụng các câu lệnh có điều kiện.

Thí dụ:

function my_custom_function() {
    if( is_home()) {
       <---what should the function do--->
    }
}

 add_action( 'some_hook', 'my_custom_function' );

Theo hiểu biết của tôi, bất cứ khi nào có bất kỳ điều kiện nào khác ( is_hometrả về false), nội dung của hàm không được thực thi, tuy nhiên hàm được thực thi, mặc dù nó "trống". Điều này có nghĩa là một hàm trống được truyền vào hook. Đây là cách mà tất cả các ví dụ được hiển thị trong codex sử dụng các thẻ có điều kiện.

Tôi hiểu rằng điều này là an toàn để làm như vậy và nó sẽ không có tác động đáng kể đến thời gian tải (nếu có bất kỳ tác động nào đến thời gian tải).

Tôi đã suy nghĩ, cùng một đoạn mã, như ví dụ, có thể được viết như sau

if( is_home()) {
   function my_custom_function() {
     <---what the function should do--->
   }

  add_action( 'some_hook', 'my_custom_funtion' );

}

Điều này sẽ hoàn toàn bỏ qua mọi thứ nếu is_hometrả về false.

Tôi không phiền khi sử dụng bất kỳ phương pháp nào trong hai phương pháp này. Nhưng những gì tôi muốn biết, vì ví dụ đầu tiên được sử dụng rộng rãi, có bất kỳ tiêu chuẩn mã hóa nào nói rằng đây là phương pháp chính xác để sử dụng, hay đây là cách được ưu tiên theo các nhà phát triển wordpress, hoặc chỉ là sở thích cá nhân.

Câu trả lời:


8

Các tiêu chuẩn mã hóa WordPress cho PHP không nêu bất cứ điều gì về điều này và không có tiêu chuẩn nào khác, do đó, tùy thuộc vào các nhà phát triển để chọn cách này hay cách khác.

Tôi phải nói rằng 2 phương pháp có cách tiếp cận khác nhau; trong khi cái đầu tiên chứa logic điều kiện, cái thứ hai là một khai báo hàm có điều kiện, có nghĩa là nếu bạn cố gắng gọi hàm, bạn sẽ gặp một lỗi nghiêm trọng.

Ngay cả khi sử dụng phương thức đầu tiên, khi hàm chạy (với tác động rất nhỏ đến hiệu suất không liên quan và bị mất trong tải ứng dụng), thì đó là cách tiếp cận tốt hơn để sử dụng nó, bởi vì khi sử dụng phương thức thứ hai, logic nghiệp vụ của ứng dụng của bạn được chuyển từ các chức năng sang phân tích tệp.

Hơn nữa, bạn nên xem xét có một cách thứ ba bạn chưa đề cập:

function my_custom_function() {
    // what the function should do
}

if ( is_home() ) {
    add_action( 'some_hook', 'my_custom_function' );
}

Lợi ích của cách tiếp cận này dễ nhận biết hơn khi bạn sử dụng lập trình OOP: trong trường hợp đó, khai báo có điều kiện lớp không có ý nghĩa (và khai báo có điều kiện phương thức là không thể), nhưng nó rất có ý nghĩa khi chạy các tác vụ chỉ trong các điều kiện cụ thể ( móc bắn).


Việc quyết định giữa bạn và @toscho thật khó khăn, nhưng tôi phải đưa nó cho bạn để liên kết với các tiêu chuẩn wordpress. Cảm ơn vì một câu trả lời tuyệt vời
Pieter Goosen

7

Không tạo chức năng khi đang bay. Điều này là khó đọc và gỡ lỗi. Thay vào đó, thực hiện tách các mối quan tâm và tách riêng việc đăng ký các cuộc gọi lại khỏi việc thực hiện (logic nghiệp vụ). Việc thiết lập các kiểm tra có điều kiện một cách hợp lý trước đăng ký gọi lại là đơn giản.
Đợi hành động template_redirectkhởi tạo trình xử lý đăng ký đó, vì đó là khi bạn biết nếu is_home()có thể được kiểm tra.

Thí dụ

class Theme_Hooks
{ 
    public function setup()
    {
        if ( ! is_404() ) {
            add_action(
                get_stylesheet() . '_breadcrumb',
                [ new Breadcrumb, 'render' ]
            );
        }

        if ( is_home() ) {
            add_action(
                get_stylesheet() . '_home_widget',
                [ new Home_Widget, 'render' ]
            );
        }
    }
}

add_action( 'template_redirect', [ new Theme_Hooks, 'setup' ] );

Làm cho cảm giác hoàn hảo. +1
Pieter Goosen

Thật tốt khi đề cập rằng bạn không nên gọi is_home()sớm như vậy, hoặc bạn sẽ nhận được điều này : PHP Notice: is_home was called <strong>incorrectly</strong>. Conditional query tags do not work before the query is run. Before then, they always return false. Please see <a href="http://codex.wordpress.org/Debugging_in_WordPress">Debugging in WordPress</a> for more information. (This message was added in version 3.1.).
JD

4

Tôi chỉ muốn thêm rằng nói chung, người ta nên cẩn thận khi sử dụng các thẻ có điều kiện như:

if( is_*() )
{
    // stuff
}

trong phạm vi toàn cầu functions.php, bởi vì nó sẽ chạy trước khi bất kỳ bộ lọc hoặc hành động nào được kích hoạt với do_action()hoặc apply_filters().


0

Tôi muốn nói sở thích cá nhân.

Ngoài ra, sẽ tốt hơn khi thực hiện lệnh gọi hàm bên ngoài câu lệnh if và hành động bên trong nó. Theo cách đó, hàm sẽ vẫn chỉ được gọi bằng hành động nếu câu lệnh if trả về true.

Luôn luôn giữ các định nghĩa hàm bên ngoài câu lệnh if đảm bảo rằng bạn sẽ không bao giờ kết thúc việc gọi một hàm xảy ra bị mắc kẹt và không thể gọi được.


0

Chỉ muốn thêm tùy chọn khác. Khung lõi lai đã thực hiện một phương pháp gọi là "móc thông minh hơn" để nhận ra bối cảnh.

Nguồn đầy đủ có thể được xem tại đây:

https://github.com/justintadlock/hyịt-core/blob/master/fifts/core.php

Lý tưởng nhất, nó có thể được sử dụng như thế này:

Một ví dụ về hook cơ bản sẽ là 'hybrid_header'. Hàm do_atomic () mở rộng điều đó để cung cấp thêm các hook như 'hybrid_singular_header', 'hybrid_singular-post_header' và 'hybrid_singular-post-ID_header'.

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.