2012-12-31 23 views
0

我正在使用一個翻譯插件,它爲the_title,the_content和其他東西創建鉤子。 除了一點不顯示標題的代碼之外,所有工作都正常。 它使用此代碼:使用apply_filters跳過Wordpress函數?

$page_title = apply_filters('the_title',get_the_title()); 

如果我嘗試使用get_the_title()the_title(),它打破。

應用過濾器做了什麼,以及如何讓它不會從翻譯插件跳過鉤子?

回答

2

the_titlethe_content也存在於Wordpress核心中。它們被用於很多事情。如果你知道什麼是鉤子,爲什麼這樣的線是有用的。

過濾鉤和動作鉤基本上是洗衣清單。你可以把函數放在一個鉤子上,一個接一個地形成一個隊列,當這個鉤子被調用時(分別爲do_actionapply_filters),Wordpress會將一個函數依次排列。就像它那樣,它會執行它們。

add_action('test', 'func1'); 
add_action('test', 'func2'); 
do_action('test'); // Executes func1 and then func2 

操作和過濾器之間的區別是雖然它們都可以接受值,但只有過濾器會返回修改後的值。行動本身做一些重要的事情;過濾器會獲取一個值並返回它的修改版本,稍後可以使用它。例如,要利用每一個集團的印刷與the_title我們可以使用下面的代碼段標題:

add_filter('the_title', function($title) { 
    return strtoupper($title); 
}); 

因爲我們知道沉迷於the_title的所有功能 - 掛鉤,而不是功能 - 將被apply_filters只執行我們希望能在功能the_title的某處找到它。其實這功能基本上echo get_the_title,這裏是如何get_the_title如下:

function get_the_title($id = 0) { 
     $post = &get_post($id); 

     $title = isset($post->post_title) ? $post->post_title : ''; 
     $id = isset($post->ID) ? $post->ID : (int) $id; 

     if (!is_admin()) { 
       if (!empty($post->post_password)) { 
         $protected_title_format = apply_filters('protected_title_format', __('Protected: %s')); 
         $title = sprintf($protected_title_format, $title); 
       } else if (isset($post->post_status) && 'private' == $post->post_status) { 
         $private_title_format = apply_filters('private_title_format', __('Private: %s')); 
         $title = sprintf($private_title_format, $title); 
       } 
     } 
     return apply_filters('the_title', $title, $id); 
} 

我張貼整個函數因爲學習來尋找源代碼掛鉤是最重要的萌發WordPress開發。源代碼充滿了鉤子,因此它們可以用來修改Wordpress內置函數的許多方面。現在您已在源代碼中找到apply_filters('the_title', ...),您可以欣賞它的重要性!

the_title只需get_the_title相呼應,給它的值,你可以修改或者甚至取代值get_the_title返回由過濾器連接到掛鉤the_title

現在,我希望你不要認爲我迄今爲止寫的所有內容都是無償的。事實上,現在我們可以輕鬆回答你的主要問題,即「爲什麼它不起作用?」

首先,你永遠不能將the_title傳遞給一個函數!這將像寫作somefunction($var1, echo $var2, $var3)。我們不能通過使用echo將值傳遞給函數,因爲echo會將其輸出發送到瀏覽器。

更好的嘗試是你貼

$page_title = apply_filters('the_title',get_the_title()); 

的之一,但正如我們看到的,get_the_title已申請the_title其返回值了。你只是第二次應用所有這些功能。如果您有一些自定義過濾器連接到the_title或它無能爲力,可能會導致奇怪。所以它要麼混淆結果要麼是無償的。這就是爲什麼你應該簡單地這樣做:

$page_title = get_the_title(); 

現在,你也說

只是一個代碼位不顯示 標題所有工作正常

這令人困惑,因爲我們不希望變量賦值輸出任何東西!要輸出的標題,你可以這樣做

$page_title = get_the_title(); 
echo $page_title; 

但是,正如我們已經知道,這是真的(看看源代碼,略有差異)一樣:

the_title(); 

所以我寫了很多隻是爲了得出結論,你可能想自己使用the_title。但我希望這可以成爲濾鏡/動作鉤子的好資源。

有任何問題歡迎。

+0

你的智慧超越你的年齡!謝謝o WordPress的大師,我混合了變數和功能,導致我的死亡!你已經解決了我的問題,並且感激我一杯啤酒! – R0b0tn1k