2009-09-06 64 views
15

我試圖通過一個簡單的過濾器來過濾所有的小部件輸出,但找不到任何鉤子,並希望能夠指向正確的方向。或者可能我的努力甚至不可能?是否存在WordPress小部件(或側欄)掛鉤?

我簡單的過濾器是這樣的:

function clean_widget_output($input) { 
    return str_replace(array("\t", "\n", "\r"), '', $input); 
} 

add_[FILTER OR ACTION]('need_a_hook', 'clean_widget_output', 99); 

任何想法?我對PHP很新,但我可以解決。

+0

我不知道他們什麼時候引入widget_text過濾器,也許他們沒有在' 09年當這個問題最初被問到。 在我的答案中查看我的示例代碼以獲取完整(且非常簡單)的工作示例。 – 2014-03-30 21:43:31

回答

7

這是出於需要/希望來清理由WordPress的小部件噴出的糟糕的HTML。我喜歡他們做的事,但是一些輸出讓我哭了。

簡短的答案是output buffering,因爲我找不到任何窗口小部件或邊欄掛鉤。

長的答案是:

function tidy_sidebar($sidebar_name_or_id) 
{ 
    ob_start(); 

    $bool = dynamic_sidebar($sidebar_name_or_id); 

    if ($bool) 
    { 
     $str = ob_get_contents(); 
     $str = 'do cleanup stuff...'; 
    } 
    else 
    { 
     $str = ''; 
    } 
    ob_end_clean(); 

    return $str; 
} 

然後從你的主題叫echo tidy_sidebar('sidebar-name-or-id');

+0

現在,您可以在註冊側邊欄時控制窗口小部件包裝和小部件標題html,因此不知道需要多少。如果你不喜歡一個小部件,最好用你喜歡的輸出重寫它。看看小部件API(http://codex.wordpress.org/Widgets_API)和register_sidebar功能(http://codex.wordpress.org/Function_Reference/register_sidebar) – roborourke 2010-11-03 13:36:13

4

有很多掛鉤不記錄wordpress的小部件。 wordpress codex沒有列出它們,因爲任何原因(例如這些鉤子將來可能會發生變化,並會因爲新的更新和版本而意外中斷)......所以請謹慎使用它們。

,找出它們是什麼,至少有2個地方看看:

<wordpress install directory>/wp-includes/default-filters.php 
<wordpress install directory>/wp-includes/default-widgets.php 

包含在這兩個文件中所有的鉤子WordPress使用的一個非常好的上市。

一個例子是對小部件的過濾器是widget_title

再次,使用這些謹慎,他們不能保證過去你看代碼的特定版本的工作。

7

我有一個類似的問題,並通過亞當布朗的list of all WordPress filter hooks後,發現我需要的鉤子確實存在(widget_title,因爲pxl提到),但沒有鉤子來獲取所有的部件輸出。我想我會詳細說明適用於我的解決方案。

理論上,widget_title掛鉤應該會影響博客上的所有小部件,但我相信某些第三方小部件會忽略包含必要的代碼行來應用任何標題過濾器,因此它不是萬無一失的。它適用於我,然而,它可以用於將自定義「簡碼」(更準確地說,在這種情況下,'長碼')或語法應用於您的小部件標題。例如,我想偶爾在我的小部件標題中包含html代碼,但默認情況下,所有的html都被刪除。因此,爲了能夠加入像<em>標籤的東西在我的一些標題的文本,我選擇了一個自定義的語法:的[[代替< & ]]而不是>(對前,[[em]][[/em]]),然後創建一個功能我的主題功能。PHP文件以處理該自定義的語法和與HTML等效替換:

function parse_html_widget_title($text) { 
    return str_replace(array('[[', ']]'), array('<', '>'), $text); 
} 

然後,我添加下方的行添加功能作爲過濾器:自動

add_filter('widget_title', 'parse_html_widget_title', 11); // 11 is one above the default priority of 10, meaning it will occur after any other default widget_title filters 

add_filter/apply_filter功能將被過濾的內容作爲第一個參數傳遞給指定爲過濾器的函數,這就是您所需要做的。

爲了對小部件的主要輸出做類似的事情,您需要查看所有小部件以查看它們使用的掛鉤並驗證它們是否具有主輸出的篩選器,而不是每個使用add_filter()鉤您與您的自定義的回調函數找到(例如,它是搜索表單widget_text的文本小組件輸出,或者get_search_form [你可以看到它在WP-包括/一般的template.php,在get_search_form()功能])。問題是,一些動態生成的小部件沒有鉤子(如Meta小部件),這就是爲什麼Jeff提供的輸出緩衝解決方案是最通用但不理想的解決方案。

+0

謝謝!!我一直在尋找這樣的東西 - 你是一個救星。 :) – Michelle 2011-05-04 19:56:52

2

我不知道,當他們推出了widget_text過濾器,也許他們沒有它在09年的時候這個問題最初提出,但由於它的存在,現在,任何人的緣故應該得到這個像計算器我做了谷歌,只是碰巧閱讀足夠遠,看到這個答案,它現在其實很簡單:

function my_widget_filter($content) 
{ 
    // manipulate $content as you see fit 
    return $content; 
} 

add_filter('widget_text', 'my_widget_filter', 99);