Как экранировать символ ']' в шорткоде?
Как экранировать закрывающую скобку в шорткоде?
Я работаю с плагином Google Maps, где закодированные точки полигонов могут содержать символ ']', из-за чего WordPress ошибочно воспринимает его как конец шорткода.
Пример:
[my_shortcode latitude='36.93' longitude='-72.98' encoded_points='ortlF~g]tM?cZEH`z]}|@DQfi]']
Пробовал использовать ]
- это решает проблему для WordPress, но вызывает ошибки в коде Google Maps. Можно конечно использовать Regex для замены, но возможно есть более простое решение. Есть ли в шорткодах специальный символ для экранирования?

Я не знаю официального синтаксиса экранирования для шорткодов, и, скорее всего, его не существует.
Когда WordPress обрабатывает шорткоды, он ищет символы [ и ]. Если вам нужно использовать квадратные скобки внутри шорткода, вы можете заменить их соответствующими HTML-сущностями ASCII.
То есть заменить [ на [
и ] на ]
. WordPress не распознает ]
как конец шорткода.
Будет ли это работать для ваших целей, зависит от того, преобразуется ли это обратно в ] перед передачей в API Google Maps или же API корректно обработает такие символы. У меня нет опыта в этом вопросе, поэтому я не могу сказать точно.

Спасибо за ваш ответ. В моём вопросе я забыл поставить ']' в блоке кода, поэтому отобразилось как ']'. Я отредактировал свой вопрос. HTML-сущность работает для WP, но не для Google Maps. Мне придётся использовать Regex для замены HTML-сущностей. Большое спасибо за помощь.

@Laxmidi Моё предположение выше об отсутствии escape-символа граничит с уверенностью — просто хотел быть осторожным, чтобы не ввести в заблуждение. Если бы он был, я уверен, что в статье кодекса про Shortcode API это упоминалось бы. Думаю, замена после обработки — ваш лучший вариант. Но нужен ли вам regex для одного символа? Кажется, str_replace()
тоже справится с задачей. Это было бы менее ресурсоёмко, если сработает.

@JohannesPille привет, это старый вопрос, но мне нужно заменить [ ] также на ]. При первом сохранении в WP это работает, но при редактировании записи/страницы WP превращает ] в ]. (нужно для отслеживания событий Google в кнопках с шорткодами) с уважением

Как сказал @alex, если переключиться на визуальную вкладку и вернуться на вкладку с кодом, можно заметить, что tinyMCE преобразует специальные символы обратно в [ ], тем самым ломая код.

tinyMCE — это Javascript и модульный редактор. Посмотрите wpse/questions/223677/adding-custom-text-patterns-in-the-wp-4-5-visual-editor. @alex

Похоже, что официальная страница находится здесь: Экранирование шорткодов
Выдержка:
Для этого вам нужно экранировать шорткод, используя двойные квадратные скобки вместо одинарных. Таким образом, чтобы отобразить это в вашем посте:
[gallery]
Вы должны написать так:
[[gallery]]

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

На основе ответа Йоханнеса Пилле есть функция WordPress для экранирования квадратных скобок при использовании текста в параметрах шорткода:
function my_esc_brackets($text = ''){
return str_replace( [ "[" , "]" ] , [ "[" , "]" ] , $text );
}
Часто предлагают использовать $content шорткода для текстовых параметров, но бывают случаи, когда у шорткода много таких текстовых параметров.

Даже если вы НЕ работаете с URL, используйте urldecode(ваше_значение_атрибута) с %5B и %5D в качестве замены для [ и ] в вашем значении атрибута.
Ваш код может выглядеть следующим образом:
На вашей странице WordPress: [my_shortcode myattr="%5Bmyattribute_value%5D"]
Затем, в функции шорткода, просто сделайте следующее:
$origvalue=urldecode($atts['myattr']);
Это восстановит символы [ и ] в переменной $origvalue, так что теперь она будет содержать: [myattribute_value]
СОВЕТ: Если вы работаете с URL, делайте то же самое, но добавьте следующий код в функцию:
$urlvalue = urlencode($origvalue);
Если это не понятно: ДА, я использую urlencode(urldecode(некоторое значение из $atts)) для создания корректной части URL.
Довольно просто, надеюсь, это поможет.
Пьер

Самый простой вариант - если нужно экранировать только один атрибут, это использовать шорткоды в открывающей/закрывающей версии тега, вот так:
[my_shortcode latitude='36.93' longitude='-72.98']ortlF~g]tM?cZEH`z]}|@DQfi][/my_shortcode]
Тогда вы получаете проблемное содержимое в виде второго аргумента $content
(первый - $attr
).
Вы можете ознакомиться с документацией по этому вопросу, чтобы получить больше информации.

Это старый вопрос, но вот обходное решение с использованием CSS. Вместо скобок, заключите символы в span, вот так:
<span class="bracket">некоторая строка</span>
затем добавьте это в таблицу стилей темы:
span.bracket:before {
content: '['
}
.colored-blocks span.bracket:after {
content: ']'
}
результат будет выглядеть так:
[некоторая строка]
