2010-06-06 158 views
8

我多次閱讀文檔,並且一直在努力弄清楚函數的情況。查看文檔後,我越來越困惑,查看源代碼。wordpress過濾文檔?試圖理解add_filter()

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

在我看來,新的功能,擴展了父功能。什麼困惑是我的鉤子的哪些部分被覆蓋。在文檔中的一些例子中,我看到一些變量被$ new標籤中的$ args替換。

我幾乎明白這一切在這裏:http://www.andrewnacin.com/2010/05/18/rethinking-template-tags-in-plugins/

但我無法弄清楚如何傳遞參數,並最終得到覆蓋。

在此先感謝。

+0

我認爲,如果您已經無法理解過濾器和操作,那麼tut只會更混亂。你能解釋一下你試圖使用它們的上下文嗎?然後,我們可以更具體地回答您的需求,而不僅僅是重複食典。 – TheDeadMedic 2010-06-06 12:11:37

回答

12

add_filter()是伴侶功能apply_filters()。在某個過濾器(add_filter()中的參數$tag)運行apply_filters之前,可以使用add_filter爲標記註冊過濾器。當使用該標籤名執行apply_filters()時,它會按順序調用所有已註冊的過濾器。過濾器用於通過函數傳遞數據進行操作。例如,我經常發現自己使用的是wp_list_pages過濾器。我用它從頁面列表中刪除換行符。因此,這裏的工作原理是:

首先,我定義一個函數,它接受一個參數,並與它的工作後返回它:

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

然後,添加過濾器鉤: 的add_filter(「wp_list_pages」,「my_list_pages_filter ');

add_filter告訴WordPress「當函數apply_filters被調用時,第一個參數爲'wp_list_pages',請致電my_list_pages_filter。」過濾器必須至少發送一個值(任何類型:字符串,數組,整數等),並且他們期望函數返回一個值。

它們爲您提供了一種在發回之前處理輸入的方法。

do_action是一個完全不同的鉤子。爲了將信息發送到您的過濾功能,請執行以下操作(從你的例子所):

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

然後在你的函數。php文件,加上:

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

這是一個非常基本的過濾器使用,但它是一個開始。你真的可以得到的,你可以通過過濾器做什麼用的一些增強功能相同的例子一個想法:

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

謝謝。你已經使它更容易理解。 – chrisjlee 2010-06-09 06:20:52

0

我已經在模板文件放在這裏鉤:

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

掛鉤只是自我執行的功能文件:

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

與我的過濾器我試圖類傳遞給該功能。

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

然後最後我真的很困惑,如何寫一個過濾器...

2

這是非常好的文章,但我必須做一些愚蠢的錯誤,不過....

我想通過這個 「的add_filter」 技術消除在 「屏幕選項」,在WP3 +導航菜單的一些項目:

可溼性粉劑管理員/包括/ 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:

看來原來的功能是不是有些類的一部分:

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'), 
    ); 
} 

但作爲一個結果,我可以看到原來的「屏幕選項」的所有項目。 如果刪除了行: 'CSS-類'=> _ ( 'CSS類'), 'XFN'=> _( '鏈接關係(XFN)'), '描述'=> __( 'Description'), 直接在WP核心中,一切看起來都不錯,所以我不確定它是否可以通過這種方式覆蓋所有的WP功能。

非常感謝您的建議。 與問候,米洛

4

克里斯, 你似乎是由幾件事情混爲一談:

  1. 篩選器和操作是不相關的(他們都是一個類型的東西WP稱之爲「鉤子」 ,但是不相關)。上面你說「用我的過濾器...」,但do_action()是用於操作而不是過濾器。
  2. 標籤(即標籤參數的add_filter,apply_filter,ADD_ACTION,do_action什麼都沒有做的XML/HTML感標籤( - )。也許你知道,
  3. 當調用一個動作,使用do_action()你除了強制標記名稱之外,你可能還想傳遞一個參數,在你上面調用do_action('content_class'),首先,除非你首先註冊了一個標籤名爲「content_class」的Action,否則它將不起作用,其次,在你的動作函數content_class_filter(這將更好地命名爲content_class_action,因爲它與過濾器沒有關係),有一個可選參數$ classes,它總是「',因爲你沒有爲標籤名後的do_action提供參數。還請注意,你可能打算寫$ output = ..
  4. 過濾器不會「覆蓋」任何東西(特別是在OO語言意義上)。在調用標記的apply_filters時,添加具有相同標記的多個過濾器將導致它們全部被調用。您可以使用優先級參數來控制排序。操作同樣如此。
+0

好點。我很感激。 – chrisjlee 2011-04-27 15:52:48