Sự cố hiểu biết áp dụng_filters ()


19

Trong áp dụng_filters ()

apply_filters( $tag, $value, $var ... );

Tôi đang gặp rắc rối gói đầu của tôi xung quanh $value$var. Tôi đã đọc codex và nó có vẻ như $valuecó thể được sửa đổi $var, nhưng tôi không tìm thấy bất kỳ ví dụ nào về điều này trong tự nhiên. Nó dường như được sử dụng như một cách để vượt qua một biến. Trong trường hợp nào, sự khác biệt giữa cái đó và cái $vargì?

Câu trả lời:


35

Hãy thử xem chức năng với tên tốt hơn:

apply_filters(
    $filter_name,     // used for add_filter( $filter_name, 'callback' );
    $value_to_change, // the only variable whose value you can change
    $context_1,       // context
    $context_2        // more context
);

Vì vậy, khi chức năng đó được gọi là:

// wp-login.php line 94
apply_filters( 'login_body_class', $classes, $action );

Bạn có thể dùng …

add_filter( 'login_body_class', 'function_to_change_login_body_class', 10, 2 );

Nhận và nhận hai biến được truyền cho hàm đó. Bạn trả lại cái đầu tiên, cái thứ hai chỉ cung cấp thêm ngữ cảnh:

function function_to_change_login_body_class( $classes, $action )
{
    if ( 'login' === $action )
        $classes[] = 'foo';

    if ( 'postpass' === $action )
        $classes[] = 'bar';

    return $classes;
}

Các biến bổ sung có sẵn để làm cho quyết định của bạn dễ dàng hơn, không thay đổi những quyết định quá.


Nếu tôi hiểu đúng. Tôi không thêm một biến để thu thập giá trị được trả về từ application_filters vì nó được áp dụng cho $ value_to_change tự động?
r00tAcc3ss

@ r00tAcc3ss Không có gì xảy ra tự động. Bạn phải thay đổi giá trị trong cuộc gọi lại của bạn. Bạn cũng có thể trả lại nó không thay đổi nếu bạn muốn - tùy thuộc vào ngữ cảnh.
fuxia

Ồ, vâng. Ý tôi là, tôi không phải chấp nhận giá trị trả về vào một biến khác và gán nó cho giá trị $. Điều đó đã được thực hiện, nếu tôi thay đổi giá trị $ trong hàm hooked và trả về, "tự động".
r00tAcc3ss

11

Bộ lọc là gì?

Bộ lọc là các chức năng mà WordPress chuyển dữ liệu qua, tại một số điểm nhất định khi thực hiện, ngay trước khi thực hiện một số hành động với dữ liệu (chẳng hạn như thêm nó vào cơ sở dữ liệu hoặc gửi nó đến màn hình trình duyệt). Các bộ lọc nằm giữa cơ sở dữ liệu và trình duyệt (khi WordPress đang tạo trang) và giữa trình duyệt và cơ sở dữ liệu (khi WordPress đang thêm bài đăng và nhận xét mới vào cơ sở dữ liệu); hầu hết đầu vào và đầu ra trong WordPress đều đi qua ít nhất một bộ lọc. WordPress thực hiện một số bộ lọc theo mặc định và plugin của bạn có thể thêm bộ lọc riêng.

Nối vào bộ lọc

Để cho phép người dùng thay đổi một số dữ liệu cụ thể (một giá trị, đầu ra của hàm, v.v.) các móc lọc được cung cấp thông qua các apply_filtershàm.
Các móc lọc này bao gồm tên (hoặc thẻ ) của bộ lọc và ít nhất là tên hàm sẽ được sử dụng để lọc (nghĩa là thay đổi theo một cách nào đó) dữ liệu.

Để thay đổi tiêu đề của bài đăng, bạn có thể sử dụng the_titlemóc lọc, được xác định như sau:

apply_filters( 'the_title', $title, $id );

Điều này có nghĩa là, bộ lọc có thẻ / tên the_title, tham số đầu tiên $titlelà dữ liệu sẽ được thay đổi (nghĩa là tiêu đề bài đăng) và tham số thứ hai $idlà thông tin bổ sung (trong trường hợp này là ID bài đăng).

Ví dụ, để hiển thị tiêu đề của mỗi bài đăng trong UPPERCASE, bạn có thể sử dụng dòng sau:

add_filter('the_title', 'strtoupper');

Nếu chúng ta nhìn vào add_filterhàm, chúng ta thấy nó được định nghĩa như sau:

add_filter( $tag, $function_to_add, $priority, $accepted_args );

Chúng tôi chỉ chỉ định tham số thứ nhất và thứ hai (bắt buộc), trong khi tham số thứ ba và thứ tư được đặt thành giá trị mặc định tương ứng (nghĩa là 101).

Một bộ lọc phức tạp hơn

Nếu bạn chỉ muốn lọc một bài đăng nhất định , bạn có thể sử dụng thông tin bổ sung (trong trường hợp bộ lọc này: ID). Để làm như vậy, bạn phải chỉ định số lượng tham số (là 2 trong trường hợp này) và để thực hiện lại, bạn phải chỉ định tham số ưu tiên (đi trước số lượng đối số).

Giả sử chúng ta chỉ muốn ảnh hưởng đến tiêu đề của bài đăng với ID 42, thì nó trông như thế này:

add_filter('the_title', 'my_strtoupper', 10, 2);
function my_strtoupper($title, $id) {
    if (42 === $id) return strtoupper($title);
    return $title;
} // function my_strtoupper

Trong trường hợp này, chúng tôi phải chỉ định tất cả bốn tham số có sẵn.

Tôi có thông số gì?

Để xác định (số lượng) tham số khả dụng của một bộ lọc nhất định, bạn phải tìm kiếm nơi nó được xác định (trong trường hợp này: tại đây ).


Tài liệu tham khảo :


2
+1 cho một phản hồi kỹ lưỡng và lớp hoàn hảo (brochacho định dạng đẹp)!
bosco

Cảm ơn, điều đó rất kỹ lưỡng, nhưng không thực sự giải thích những gì tôi đang hỏi. ví dụ. sự khác biệt giữa biến $ value và biến $ var trong bộ lọc.
r00tAcc3ss

Hừm, tôi sẽ nói, nó có, nhưng tất nhiên, đó là cảm giác chủ quan của tôi. Tôi sẽ thêm một số thông tin về bộ lọc và các tham số của nó, mặc dù.
tfrommen
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.