2013-02-21 23 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:私はグーグルでこれについて多くの "stackoverflowed"をしましたが、私のニーズに合ったワーキングソリューションが見つからず、WordPressエラーメッセージが生成されませんでした。

ありがとうございます。

答えて

5

十分なシンプルは、ここで同様のスニップは、プロジェクトを形成します:

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

を使用することで使用できると思いますあなたの意見を理解する)。あなたのスクリプトは、その関数がすでに存在するかどうかをチェックします。そのためには、関数が最初に手動で作成されていなければなりません。私は動的に既存の関数を呼び出すつもりはないが、私がしようとしているのは、その関数を動的に「作成」することである。上のスクリプトでは、簡単にするため、どこからでも「ニュース」という単語を消したいだけですが、最初の指示からスクリプトを削除して機能させています。もし私があなたを得なかったら、私は残念です。 – Baylock

+0

私が正しく理解していれば、 "news_something"や "blog_something"などのような多くの機能を使いたいと思っています。私が提供したコードはinit()で呼び出され、呼び出す関数を選択する必要があります。 複数の場所から同じ関数を呼び出す場合は、PHPで登録する必要があるため、関数を作成して同じ関数を呼び出す必要があると思います。 – hexblot

+0

助けて頂きありがとうございます。上記の私のメッセージを編集して、私の目的をよりよく理解してください。 – Baylock

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

+0

動作しません。少なくともWordPressにはない。別のコアページでエラーを発生させます(致命的なエラー:/home/www/xxx/web/admin/wp-includes/rewrite.phpの非オブジェクトのメンバ関数add_rewrite_tag()を呼び出します)。さらに、関数をトリガする "add_action"が文字列を必要とするため、これは方法だとは思わない。 – Baylock

+1

それは、genetareFunctionが文字列を返すということですが、$ prefixの代わりにあなたが期待する名前はありません。 "_ customblabla"は "lamda_5"のようなものですが、その名前は文字列として変数に保存されますadd_action(その有効なコールバック、およびwordpress add_action apiは有効なコールバックを受け付ける)に渡されます。コード・ストリングにdie(ここで死んだ)を追加して、wordpressが実際にそこにあるかどうかを確認してください。 – cernunnos

3

これは古いスレッドですが、単に無名関数を使用します。

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

そして、非常に多くの機能を宣言する必要はありません。

+0

ループ内のマップを使用して複数の投稿タイプを作成する際の強力なテクニックです。 ポストタイプがいくつかの機能を共有していてデータ階層と異なる場合、お互いに結合してはいけません。 – sampoh

+0

他のモジュールの機能を直接呼び出している人には問題があります。あなたはそうするべきではないが、それは起こり得る。 – jgmjgm