current_shortcode () - виявляє використовуваний в даний час короткий код


11

У класі плагінів я хочу надати прості поля для публічних даних: електронна пошта, номер телефону, Twitter тощо. Список можна розширити.

Докладні відомості див. У плагінах .

Щоб зробити використання простим, я також хочу запропонувати короткі шрифти, які легко набрати:

  • [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 зберігає лише всі шорт-коди та зворотні виклики в масиві, мені цікаво, чи є спосіб, щоб він зберігав кожен короткий код у змінну, як він обробляється, і без злому основних файлів?
Дуейн Чаррінгтон

@toscho Погодився, я думаю, це справді проблема, реконструкція в способі, що робиться шорт-коди (охоплюючи більше OOP, як віджети), слід пам’ятати. Я хотів би допомогти у цьому, а пізніше надішле це як оновлення до Core.
Вебкор

@brasofilo Правильно, я це зробив саме зараз.
фуксія

Відповіді:


3

Це не перевірено , але функція зворотного виклику надається масивом аргументів, $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;   
}

Ага, я пам’ятаю, я давно наткнувся на щось подібне. У моєму випадку це третій аргумент для обробника короткого коду. Перший - $argsдругий $contentі останній - короткий код!
фуксія

Дійсно? Короткий код відрізняється від імені зворотного виклику 'shortcode_handler' ... Я б подумав, що це було б вказано в $args. Але якщо це працює для вас ...: D.
Стівен Харріс

2

На підставі відповіді Стівена Гарріса я змусив всіх обробників зловити прийняти третій аргумент, який є коротким ім'ям:

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

Дивіться це в дії в плагіні, пов'язаному з моїм запитанням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.