2013-02-21 3 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'); 

수동 기능이 좀 (스크립트가 이와 같은 기능의 수십 내장 특히) 내 시도의 원래 목적을 패배 이름을 갖는 .

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

추신 : 나는 이것에 대해 많이 봤지만 "stackoverflowed"하지만 내 요구에 맞는 작업 솔루션을 찾지 못했고 WordPress 오류 메시지를 생성하지 않습니다.

감사합니다.

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

답변

5

, 여기에 비슷한 잘린 프로젝트를 형성합니다.

코드를 문자열로 사용하는 접근 방식과 마찬가지로이 응답은과 병행하여 병합을 유도합니다 (다른 것들 중에서도).


임 확실하지 그것을 사용하는 것이 좋습니다 경우, 또는 당신을 도움이되지만 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

을 사용하는 것입니다 사용할 수 있다고 생각 (또는 어쩌면 내가하지 않았다 당신의 요점을 이해하십시오). 스크립트가 함수가 이미 존재하는지 확인하고 함수가 맨 처음에 수동으로 만들어 졌는지 확인합니다. 맞습니까? 나는 기존 함수를 동적으로 "호출"하려고하지 않고, 내가하려고하는 것은 정확하게 그 함수를 동적으로 "생성"하는 것이다. 위의 스크립트에서 간단하게하기 위해, 나는 어디에서든지 "뉴스"라는 단어를 지우고 싶지만 맨 처음 지시문을 지우고 스크립트를 작동 시키려고합니다. 내가 널 데려 오지 않으면 미안해. – Baylock

+0

제대로 이해했다면 "news_something"및 "blog_something"등과 같은 여러 가지 기능을 원합니다. 그런 다음 동적으로 필요한 것을 호출하십시오. 필자가 제공 한 코드는 init()에서 호출하고 호출 할 함수를 선택해야합니다. 원하는 기능이 여러 위치에서 호출되는 경우, PHP에 등록해야하기 때문에 함수를 만들어서 동일한 함수를 호출해야한다고 생각합니다. – hexblot

+0

도움을 주셔서 감사합니다. 나는 작동하지 않는 예제로 나의 목적을 더 잘 이해하기 위해 위의 메시지를 편집했다. – Baylock

1

편집 (2017-04) : 익명 함수 (제대로 구현), 이동 데이비드 Vielhuber 의해 답변을 볼 수있는 방법이 간단한만큼

+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는 유효한 콜백을 수락 함)에 전달됩니다. Wordpress가 실제로 거기에 도착하는지 확인하려면 코드 문자열에 die ("i had here")를 추가하십시오. – cernunnos

3

이 오래된 스레드 단순히 익명 함수 사용

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

그리고 많은 함수를 선언 할 필요가 없기를.

+0

루프에있는지도를 사용하여 여러 게시물 유형을 만들 때 강력한 기술. 게시물 유형이 일부 기능을 공유하지만 데이터 계층 구조와 다르거 나 부모 등으로 서로 결합되어서는 안되는 경우 일반적으로 좋습니다. – sampoh

+0

사람들이 다른 모듈의 기능을 직접 호출 한 경우 문제가 있습니다. 당신은 그렇게해야하지만 그것이 일어날 수 있습니다. – jgmjgm