2010-06-06 31 views
8

Tôi đọc qua tài liệu nhiều lần và đã có một thời gian khó cố gắng tìm ra những gì đang xảy ra với chức năng này. Tôi càng bối rối hơn sau khi xem tài liệu, xem xét mã nguồn.tài liệu bộ lọc wordpress? Cố gắng hiểu add_filter()

add_filter($tag, $hook, $priority, $args);

dường như với tôi chức năng mới mở rộng chức năng gốc. Câu đố của tôi là phần nào của cái móc trở nên bị ghi đè. trong một số ví dụ trong tài liệu tôi thấy rằng một số biến được thay thế bằng $ args trong thẻ $ mới của bạn.

Tôi gần như hiểu tất cả ở đây: http://www.andrewnacin.com/2010/05/18/rethinking-template-tags-in-plugins/

nhưng sau đó tôi không thể tìm ra cách bạn vượt qua các đối số và mà cuối cùng được ghi đè.

cảm ơn trước.

+0

Tôi nghĩ rằng tut chỉ gây nhầm lẫn hơn nếu bạn đã gặp sự cố khi hiểu bộ lọc và hành động. Bạn có thể giải thích ngữ cảnh mà bạn đang cố gắng sử dụng chúng không? Sau đó, chúng tôi có thể trả lời cụ thể hơn cho nhu cầu của bạn, thay vì chỉ lặp lại Codex. – TheDeadMedic

Trả lời

12

add_filter() là một chức năng đồng hành với apply_filters(). Trước khi apply_filters chạy cho một bộ lọc nhất định (đối số $tag trong add_filter()), bạn có thể sử dụng add_filter để đăng ký bộ lọc cho thẻ. Khi apply_filters() được thực thi với tên thẻ đó, nó sẽ gọi tất cả các bộ lọc đã đăng ký theo thứ tự. Các bộ lọc được sử dụng để truyền dữ liệu qua các hàm để thao tác. Ví dụ, cái mà tôi thường thấy mình sử dụng là bộ lọc wp_list_pages. Tôi sử dụng nó để xóa các ngắt dòng khỏi danh sách trang. Vì vậy, dưới đây là cách hoạt động:

Trước tiên tôi định nghĩa một hàm mang theo một tham số và trả về nó sau khi làm việc với nó:

function my_list_pages_filter($pages){ 
    $pages = preg_replace(array("\n","\r"), '', $pages); 
    return $pages; 
} 

Sau đó, tôi thêm móc lọc: add_filter ('wp_list_pages', 'my_list_pages_filter ');

add_filter thông báo cho WordPress "Khi hàm apply_filters được gọi với đối số đầu tiên là 'wp_list_pages', hãy gọi my_list_pages_filter." Bộ lọc phải gửi ít nhất một giá trị (thuộc bất kỳ loại nào: chuỗi, mảng, số nguyên, v.v.) và chúng mong đợi hàm trả về một giá trị.

Chúng cung cấp cho bạn cách để thao tác đầu vào trước khi gửi lại.

do_action là một móc hoàn toàn khác. Để gửi thông tin đến chức năng lọc của bạn, hãy thực hiện theo các bước sau (lấy từ ví dụ của bạn):

<div id="content" <?php $class='post post_content'; echo apply_filters('my_custom_classes', $class); ?>> 

Và sau đó trong các chức năng của bạn.tệp php, hãy thêm thông tin này:

add_filter('my_custom_classes','my_custom_classes_function'); 
function my_custom_classes_function($classes){ 
    $output 'class="'. $classes.'"'; 
    return $output; 
} 

Đó là cách sử dụng khá thô sơ của bộ lọc nhưng đó là sự khởi đầu. Bạn thực sự có thể có được một ý tưởng về những gì bạn có thể làm với các bộ lọc với các ví dụ tương tự với một số cải tiến:

function my_custom_classes_function($classes){ 
    $classes = explode(' ', $classes); 
    if(is_home()) 
    $classes[] = 'home_content'; 
    if(is_single()) 
    $classes[] = 'single_content'; 
    if(is_page()) 
    $classes[] = 'page_content'; 
    if(is_tag()) 
    $classes[] = 'tag_content'; 
    $output 'class="'. implode(' ', $classes) .'"'; 
    return $output; 
} 
+0

Xin cảm ơn! Bạn đã làm cho nó dễ hiểu hơn. – chrisjlee

0

tôi đã đặt móc ở đây trong mẫu file:

<div id="content" <?php content_class() ?>> 

móc chỉ tự thực hiện trong các chức năng file:

function content_class() { 
do_action('content_class'); 
} 

với bộ lọc của tôi đang cố gắng để vượt qua các lớp học này chức năng.

function content_class_filter($classes='') { 
    $output 'classes="'. $classes.'"'; 
    return $output; 
} 

rồi cuối cùng tôi thật sự bối rối như thế nào để viết bộ lọc ...

2

nó là rất tốt đẹp bài viết, nhưng tôi phải làm một số sai lầm ngu ngốc, tuy nhiên ....

tôi cố gắng để loại bỏ một số mặt hàng trong WP3 + menu dưới "Tùy chọn Screen" qua này "add_filter" kỹ thuật:

wp-admin/includes/nav-menus.php:

function wp_nav_menu_manage_columns() { 
    return array(
     '_title' => __('Show advanced menu properties'), 
     'cb' => '<input type="checkbox" />', 
     'link-target' => __('Link Target'), 
     'css-classes' => __('CSS Classes'), 
     'xfn' => __('Link Relationship (XFN)'), 
     'description' => __('Description'), 
    ); 
} 

mytheme/function.php:

Có vẻ như các chức năng ban đầu không phải là một phần của một số CLASS:

add_filter('wp_nav_menu_manage_columns', 'new_wp_nav_menu_manage_columns'); 
function new_wp_nav_menu_manage_columns() { 
    return array(
     '_title' => __('Show advanced menu properties'), 
     'cb' => '<input type="checkbox" />', 
     'link-target' => __('Link Target'), 
    ); 
} 

Nhưng kết quả là tôi có thể xem bản gốc "Screen Options" với tất cả các mặt hàng. Nếu tôi xóa các dòng: 'css-classes' => _ ('Lớp CSS'), 'xfn' => _ ('Mối quan hệ liên kết (XFN)'), 'description' => __ ('Mô tả'), trực tiếp trong lõi WP, mọi thứ đều OK, vì vậy tôi không chắc chắn nó có thể ghi đè lên tất cả các functon WP theo cách này.

Cảm ơn bạn rất nhiều vì lời khuyên của bạn. Với Trân, Milo

4

Chris, Bạn dường như bị nhầm lẫn bởi một vài điều:

  1. lọc và hành động không liên quan (họ vừa là loại gì WP gọi là 'móc' , nhưng nếu không có liên quan). Ở trên, bạn đã nói "với bộ lọc của tôi ..." nhưng do_action() dành cho Hành động không phải là Bộ lọc.
  2. Thẻ (ví dụ: tham số thẻ cho add_filter, apply_filter, add_action, do_action không liên quan gì đến các thẻ theo nghĩa XML/HTML (- có thể bạn biết điều đó)
  3. Khi gọi một Action, sử dụng do_action() bạn Ở trên bạn gọi là do_action ('content_class'), trước hết, sẽ không có tác dụng trừ khi bạn đăng ký Hành động với tên thẻ là "content_class" và thứ hai , trong hàm hành động của bạn content_class_filter (có thể được gọi là content_class_action như không có gì để làm với các bộ lọc), có một tham số tùy chọn $ classes, luôn luôn là '' vì bạn không cung cấp một đối số cho do_action sau tên thẻ Lưu ý rằng bạn có thể muốn viết $ output = ..
  4. Bộ lọc không "ghi đè" bất cứ điều gì (đặc biệt là trong ý nghĩa ngôn ngữ OO). Việc thêm nhiều bộ lọc với cùng một thẻ sẽ dẫn đến tất cả các bộ lọc được gọi khi hàm apply_filters cho thẻ được gọi. Bạn có thể kiểm soát thứ tự bằng cách sử dụng tham số ưu tiên. Cũng vậy với Hành động.
+0

Điểm tốt ở đó. Tôi đánh giá cao nó. – chrisjlee

Các vấn đề liên quan