2013-02-21 93 views
7

我想簡化WordPress中「自定義帖子類型」的創建過程,因爲通過相同的腳本並手動更改所有自定義帖子類型名稱實例非常繁瑣。php中的動態函數名稱

創建一個包含CPT名稱的變量並在需要的地方使用它非常簡單。這樣,我所要做的就是在腳本的開始部分聲明變量,並且應該處理其餘部分。

唯一的問題是,爲了使它工作,我還需要在腳本內的每個函數的前面加上CPT名稱的前綴,並且似乎在函數名中使用變量並不容易,甚至不推薦在PHP中使用。

那麼我怎麼能解決這個問題呢?

這裏是下面一個例子來弄清楚:

$prefix = 'news'; 

function news_custom_type_init() 
{ 
    global $prefix; 

    register_post_type($prefix, array(
    'labels' => array(
      'name' => $prefix, 
      'singular_label' => $prefix, 
      'add_new' => 'Add', 
      ... 
     )); 

     register_taxonomy_for_object_type('category', $prefix); 
} 
add_action('init', $prefix.'_custom_type_init'); 

這幾乎是很好,如果我能動態地以重命名功能不都寫在單詞「新聞」可標準化它的前面,但使用「$前綴」來代替。

這本來是好的,但只是不工作:

$prefix = 'news'; 

$functionName= $prefix."_custom_type_init"; 

function $functionName() 
{ 
    global $prefix; 

    register_post_type($prefix, array(
    'labels' => array(
      'name' => $prefix, 
      'singular_label' => $prefix, 
      'add_new' => 'Add', 
      ... 
     )); 

     register_taxonomy_for_object_type('category', $prefix); 
} 
add_action('init', $prefix.'_custom_type_init'); 

有命名手動功能還挺打敗我的企圖(尤其是當該腳本嵌入幾十種功能,如這一個)的初衷。

這樣做的最好方法是什麼?

PS:我google和「stackoverflowed」了很多關於此,但沒有找到任何適合我的需求,並不會產生一個WordPress錯誤消息的工作解決方案。

謝謝。

回答

5

夠簡單,這裏有一個類似的文檔片斷形成項目:

$function = $prefix . '_custom_type_init'; 
if(function_exists($function)) { 
    $function(); 
} 
+0

我不知道我說清楚了(也許我沒有理解你的觀點)。你的腳本檢查功能是否已經存在,爲此,該功能應該首先手動創建,對嗎?我不是想動態調用一個現有的函數,我想要做的就是動態地「創建」該函數。爲了簡單起見,在上面的腳本中,我只想從第一條指令的任何地方刪除「新聞」一詞,並讓腳本起作用。如果我沒有得到你,我很抱歉。 – Baylock 2013-02-21 14:46:30

+0

如果我理解正確,你想有一些功能,如「news_something」和「blog_something」等,然後動態調用所需的。我提供的代碼應該在init()中調用並選擇要調用的函數。 如果你想要的是從幾個位置調用相同的函數,我相信你需要創建函數並使它們調用相同的函數,因爲它們需要在PHP中註冊。 – hexblot 2013-02-21 14:50:49

+0

感謝您的幫助hexbot。我編輯了上面的消息,以便通過一個非工作示例更好地理解我的目的。 – Baylock 2013-02-21 14:54:44

1

編輯(2017-04):匿名函數(正確實施)都去了,看看答案由大衛Vielhuber的方式。

這個答案不好建議,因爲這涉及代碼作爲一個字符串,因爲這會邀請(除其他外)串聯。


林不知道,如果它是建議使用,或者如果它可以幫助你,但是PHP允許您創建「匿名」功能:

function generateFunction ($prefix) { 
    $funcname = create_function(
     '/* comma separated args here */', 
     '/* insert code as string here, using $prefix as you please */' 
    ); 
    return $funcname; 
} 

$func= generateFunction ("news_custom_type_init"); 
$func(); // runs generated function 

我假設ADD_ACTION只是調用什麼功能,你通過。

http://php.net/manual/en/function.create-function.php

注:create_function不會跟你想要的名稱返回的功能,但該功能的內容將是你的控制之下,該函數的真實名稱並不重要。

+0

謝謝cernunnos,我會試試這個。我不僅受限於這裏的語言,我也受到WordPress機制的限制。希望它能工作。我會盡快給您回覆。 – Baylock 2013-02-21 14:59:33

+0

它不起作用。至少不是在WordPress。它會在另一個核心頁面上產生錯誤(致命錯誤:在/home/www/xxx/web/admin/wp-includes/rewrite.php中的非對象上調用成員函數add_rewrite_tag())。另外,我不相信這是一條路,因爲觸發函數的「add_action」需要一個字符串。 – Baylock 2013-02-22 14:46:00

+1

Thats the thing,genetareFunction returns a string,it would not have the name you expect:instead of $ prefix。「_ customblabla」它會像「lamda_5」那樣,但是這個名字會以字符串形式保存到變量中,並且可以是傳遞給add_action(它是一個有效的回調函數,而wordpress add_action api表示它接受有效的回調)。嘗試在代碼字符串中添加一個模子(「我死在這裏」),看看wordpress是否真的到達那裏(或者error_log(「bla」)) – cernunnos 2013-02-22 15:34:15

3

這是一個古老的線程,但簡單地使用匿名函數:

add_action('init', function() use($args) { 
    //... 
}); 

那就沒有必要宣佈如此多的功能。

+0

當您使用循環中的地圖創建多個帖子類型時,一種強大的技術。 如果帖子類型共享一些功能但與數據層次不同,並且不應該與父母等互相耦合,這通常是一個好主意。 – sampoh 2017-04-07 07:49:32

+0

如果人們直接調用其他模塊的功能,則存在問題。並不是說你應該這樣做,但可能會發生。 – jgmjgm 2018-02-14 16:08:52