текущий шорткод() - определяет используемый в данный момент шорткод


В классе плагинов я хочу предоставить простые поля для общедоступных данных: адрес электронной почты, номер телефона, Твиттер и т.д. Список может быть расширен.

Подробности смотрите в Общедоступных контактных данных плагина на 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, но сейчас не вижу, как это сделать лучше.

Author: fuxia, 2012-02-20

2 answers

Это непроверенный , но функция обратного вызова снабжена массивом аргументов$args, которые задают (если таковые имеются) параметры, предоставляемые коротким кодом. Нулевая запись иногда содержит название используемого шорткода (например, public_email). Под иногда я подразумеваю...

Нулевая запись массива атрибутов ($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;   
}
 3
Author: Stephen Harris, 2012-02-20 10:36:47

На основе ответа Стивена Харриса Я заставил свой обработчик catch all принять третий аргумент, который является именем шорткода:

/**
 * 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 );
}

Посмотрите это в действии в плагине, связанном с моим вопросом.

 2
Author: fuxia, 2017-04-13 12:37:52