current_shortcode ()-현재 사용 된 단축 코드를 감지


11

플러그인 클래스에서 전자 메일, 전화 번호, Twitter 등 공개 데이터에 대한 간단한 필드를 제공하고 싶습니다. 목록을 확장 할 수 있습니다.

자세한 내용은 플러그인 GitHub의 공개 연락처 데이터 를 참조하십시오.

사용법을 간단하게 유지하기 위해 입력하기 쉬운 짧은 코드를 제공하고 싶습니다.

  • [public_email]
  • [public_phone]
  • [public_something]

유일한 차이점은 두 번째 부분입니다. 단축 코드에 대한 추가 인수는 오류가 발생하기 쉽기 때문에 원하지 않습니다. 따라서 플러그인 클래스의 모든 필드에 대해 하나의 단축 코드 처리기를 등록합니다 .

foreach ( $this->fields as $key => $value )
{
    add_shortcode( 'public_' . $key, array( $this, 'shortcode_handler' ) );
}

이제 shortcode_handler()어떤 단축 코드가 호출되었는지 알아야합니다. 내 질문은 : 어떻게해야합니까?

현재 해결 방법은 다른 기능입니다.

protected function current_shortcode()
{
    $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS );
    return $backtrace[3]['args'][0][2];
}

이것은 ... 작동합니다 the_content(). 그러나 그것은 우아하거나 강력하지 않습니다.
나는 읽었 wp-includes/shortcodes.php지만 지금은 더 잘하는 법을 볼 수 없습니다.


1
당신은 지금 모두 궁금합니다. 나는 이것을 잠시 살펴볼 것이다. shortcodes.php는 많은 함수입니다 .OOP를 사용하여 올바르게 작성했다면 current_shortcode 클래스 변수가 있었으며 모든 것이 더 쉬워졌습니다. 내 지식에 따르면 Wordpress는 모든 단축 코드와 콜백을 배열로만 저장합니다. 각 단축 코드를 처리 할 때 코어 파일을 해킹하지 않고 변수에 저장할 수있는 방법이 있는지 궁금합니다.
Dwayne Charrington

@ toscho Agreed, 나는 그것이 문제라고 생각합니다. 짧은 코드가 수행되는 방식으로의 리모델링 (위젯과 같은 더 많은 OOP 포함)을 염두에 두어야합니다. 나는 그것을 돕기를 원하고 나중에 이것을 Core에 대한 업데이트로 보냅니다.
Webord

@brasofilo 맞아, 지금 막 그렇게 했어.
fuxia

답변:


3

이것은 테스트되지 않았지만 콜백 함수에는 인수 배열이 $args제공되어 단축 코드와 함께 제공된 매개 변수를 제공합니다. 0 번째 항목 에는 사용 된 단축 코드의 이름이 포함되는 경우 가 있습니다 (예 :) public_email. 가끔은 ...

속성 배열의 0 번째 항목 ($ atts [0])에는 단축 코드 정규식과 일치하는 문자열이 포함되지만 콜백 이름과 다른 경우에만 콜백 함수의 세 번째 인수로 나타납니다.

( 코덱스 참조 ). 당신의 목적은 다음의 경우 $atts[0]중 하나를 포함 public_email, public_phone

function shortcode_handler($atts,$content=NULL){
     if(!isset($atts[0]))
         return; //error?

     switch($atts[0]):
         case 'public_email':
              //deal with this case
              break;
         case 'public_phone':
              //deal with this case
              break;
         case 'public_something':
              //deal with this case
              break;
     endswitch;   
}

아, 나는 오래 전에 비슷한 것을 겪었다는 것을 기억합니다. 제 경우에는 단축 코드 처리기의 세 번째 인수입니다. 첫 번째는 $args, 두 번째 $content는 마지막 코드입니다.
fuxia

정말? 단축 코드는 콜백 이름 'shortcode_handler'와 다릅니다 ...에서 제공되었을 것이라고 생각했을 것 $args입니다. 그러나 그것이 당신을 위해 작동한다면 ... : D.
스티븐 해리스

2

Stephen Harris의 답변을 바탕으로 모든 처리기가 짧은 코드 이름 인 세 번째 인수를 수락하도록했습니다.

/**
 * Handler for all shortcodes.
 *
 * @param  array  $args
 * @param  NULL   $content Not used.
 * @param  string $shortcode Name of the current shortcode.
 * @return string
 */
public function shortcode_handler(  $args = array (), $content = NULL, $shortcode = '' )
{
    $key = $this->current_shortcode_key( $shortcode );
    $args['print'] = FALSE;
    return $this->action_handler( $key, $args );
}

/**
 * Returns the currently used shortcode. Sometimes.
 *
 * @return string
 */
protected function current_shortcode_key( $shortcode )
{
    return substr( $shortcode, 7 );
}

내 질문에 링크 된 플러그인에서 작동하는지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.