Intereting Posts
ссылку на текущую категорию, используемую на странице category.php Как изменить порядок выставления счетов в шаблоне WooCommerce Checkout? Категории циклов по последнему сообщению создать сообщение с главной категорией и другими категориями из панели администратора создание короткого кода для вытягивания массива json Получите meta_id вместе с meta_key и meta_value Как вставить текст на все страницы и сообщения до или после определенных мест? Измените пользовательские полевые данные перед созданием нового сообщения Перенаправление WordPress, чтобы получить дружественный URL RSS Количество подписчиков без использования FeedBurner Пользовательская таксономия отключена на странице редактирования Как показать только блог-домен вместо целой постоянной ссылки в цикле Перенаправить не-www версию сайта на www POEdit с пользовательским кодом mu-plugins Проблемы с автозагрузкой классов через sp_autoload_register / возможно, помеха для WP-специфического автозагрузчика

Вывод короткого кода прикручивается, когда символ стрелки «<» присутствует в содержимом

У меня есть очень простой код для печати текста с использованием pre-тегов

function term_shortcode( $atts, $content = null ) { return "<pre>" . htmlentities($content) . "</pre>"; } add_shortcode( 'term', 'term_shortcode' ); 

Но при использовании короткого кода, если в содержимом есть символ стрелки, результат становится ужасно запутанным. Штрих-код получает содержимое за пределами короткого кода.

Вот пример

 [term] ABC < DEF [/term] MORE CONTENT. This is also taken up by the above shortcode. 

Если символ левой стрелки «<» удаляется, он выводится точно.

Как это исправить ?

Визуальный редактор полностью отключен. Использование только текстового редактора и набрав чистый html.

Эта проблема была введена в WP 4.2.3 с введением функции do_shortcodes_in_html_tags() , которая анализирует содержимое HTML для защиты от содержимого, содержащего короткие коды, созданные ненадежными вкладчиками / авторами, которые, создавая атрибуты короткого кода, могут создавать эксплойты XSS.

Если эта ситуация безопасности не применяется к вам, и вы хотите, чтобы это работало на вашем сайте, тогда простым способом является замена фильтра do_shortcode по умолчанию на вашу собственную версию с do_shortcodes_in_html_tags() , например

 add_action( 'init', function () { remove_filter( 'the_content', 'do_shortcode', 11 ); add_filter( 'the_content', function ( $content ) { global $shortcode_tags; if ( false === strpos( $content, '[' ) ) { return $content; } if (empty($shortcode_tags) || !is_array($shortcode_tags)) return $content; $tagnames = array_keys($shortcode_tags); $tagregexp = join( '|', array_map('preg_quote', $tagnames) ); $pattern = "/\\[($tagregexp)/s"; if ( 1 !== preg_match( $pattern, $content ) ) { // Avoids parsing HTML when there are no shortcodes or embeds anyway. return $content; } // Avoid check for users without unfiltered html: $content = do_shortcodes_in_html_tags( $content, $ignore_html ); $pattern = get_shortcode_regex(); $content = preg_replace_callback( "/$pattern/s", 'do_shortcode_tag', $content ); // Always restore square braces so we don't break things like <!--[if IE ]> // Not needed if do_shortcodes_in_html_tags not called: $content = unescape_invalid_shortcodes( $content ); return $content; }, 11 ); } ); 

При тестировании вы также можете столкнуться с wpautop() хотя …

Короткие коды не должны использоваться в качестве замены тегов html. В этом случае, если вы хотите использовать <pre> просто используйте его, не придумывайте для него короткий код.

Использование «<» нарушает правильность html в содержимом, которое может разорвать все виды парсера и, возможно, сломать синтаксический анализатор коротких кодов (и почти наверняка сломает его еще сложнее в версиях 4.4+).

В вашем случае противоположность того, что вы пытаетесь сделать, вероятно, является лучшим подходом. Вместо того, чтобы кодировать элементы html, вы должны предположить, что они уже закодированы, и вы их декодируете, чтобы поместить их в <pre> . Таким образом, вы также сможете использовать визуальный редактор для короткого кода.

Я попытался бы использовать htmlspecialchars() вместо htmlentities() и посмотреть, разрешит ли это проблему.