Intereting Posts
Пользовательский фильтр запросов не работает на странице категории woocommerce Шаблон WordPress в iFrame хранить массив всех существующих терминов Добавление мета-поля настраиваемого типа сообщения в rss Поиск, где происходит короткий код Удалить верхний и нижний колонтитулы в iframe Как я могу скрыть определенные боковые панели от некоторых пользователей? Изменить сообщения администратора WordPress из табличного представления в календарь ОШИБКА. Ваш фид недействителен (после обновления WP4.7) в пользовательских типах Как настроить сайт для разработки / размещения, чтобы внести существенные изменения в тему, а затем обновить сайт? Синхронизация контента в Multisite. Возможное? Используйте функцию для обновления метаданных сообщений на основе других метаданных Управление списками категорий таксономии, чтобы скрыть и отобразить особенности Как избежать конфликтов имен плагинов с уведомлением об обновлении? WP API и прокси-сервер

Shortcode API: как получить имя, которое соответствует короткому коду RegEx?

Я ищу способ воспроизвести то, что описано в документации: перегруженный обратный вызов короткого кода.

Согласно документам, массив $atts будет содержать строку, которая соответствует короткому коду RegEx. Позиция внутри $atts зависит от того, соответствует ли имя обратного вызова короткому коду или нет. Следующий пример берется из документов:

 add_shortcode('foo','foo'); // two shortcodes referencing the same callback add_shortcode('bar','foo'); produces this behavior: [foo a='b'] ==> callback to: foo(array('a'=>'b'),NULL,"foo"); [bar a='c'] ==> callback to: foo(array(0 => 'bar', 'a'=>'c'),NULL,""); 

Поэтому я зарегистрировал свои короткие коды следующим образом:

 add_shortcode('foo', 'foo'); add_shortcode('bar', 'foo'); function foo($attributes, $content = null) { echo '<pre>'; var_dump($attributes); echo '</pre>'; } 

К сожалению, $ attributes всегда пуст, он не содержит имя короткого кода (WP 4.0).

Это ошибка в документации или я что-то не так?

Я думаю, вы просто забыли запустить короткие коды [foo a='b'] и [bar a='c'] через фильтр do_shortcode :

 do_shortcode( '[foo a='b'] [bar a='c']' ) 

Выходной the_content() фильтруется через do_shortcode , поэтому вы можете просто добавить его в свой редактор.

Запустив код, я получаю следующий вывод для дампа $arguments :

 array (size=1) 'a' => string 'b' (length=1) 

а также

 array (size=1) 'a' => string 'c' (length=1) 

поэтому здесь нет '0' => 'bar' .

Но вы можете получить текущий тег короткого кода из третьего параметра обратного вызова короткого кода (я впервые услышал об этом в этом ответе @toscho)

Я только что проверил источник, и если мы проверим функцию do_shortcode_tag мы найдем:

 // self-closing tag return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, null, $tag ) . $m[6]; 

где $tag – третий параметр, содержащий тег shortcode.

Поэтому в вашем случае вы можете изменить свой обратный вызов на:

 function foo( $attributes = array(), $content = null, $tag = '' ) { echo $tag; // current shortcode tag echo '<pre>'; var_dump($attributes); echo '</pre>'; } 

для получения информации о текущем теге shortcode.

Обратные вызовы короткого кода получают третий аргумент с именем короткого кода. есть примечание об этом в документах:

Кажется, что он всегда появляется в качестве третьего аргумента в отношении 2.9.2.

 add_shortcode('foo', 'wpse173855_shortcode'); add_shortcode('bar', 'wpse173855_shortcode'); function wpse173855_shortcode($atts, $content, $name) { echo '<pre>'; var_dump($name); echo '</pre>'; } 

Взгляд на источник показывает, что шорткод, который был сопоставлен, всегда передается.