Вывести определенный параграф the_content по его css?
Нужно вывести на странице категорий только часть the_content с определенным css-классом. Через хук, но как именно, знаний не хватает:
add_filter('the_content', 'the_sub'); function the_sub( ... ){ return $text; |
add_filter('the_content', 'the_sub'); function the_sub( ... ){ return $text;
Дополнительно:
Должно работать
add_filter('the_content', 'the_sub'); function the_sub($text) { if (is_category()) { $element_class = 'ваш-css-класс'; $dom = new DOMDocument(); libxml_use_internal_errors(true); $dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8')); libxml_clear_errors(); $xpath = new DOMXPath($dom); $elements = $xpath->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $element_class ')]"); $new_content = ''; foreach ($elements as $element) { $new_content .= $dom->saveHTML($element); } return $new_content; } return $text; } |
add_filter('the_content', 'the_sub'); function the_sub($text) { if (is_category()) { $element_class = 'ваш-css-класс'; $dom = new DOMDocument(); libxml_use_internal_errors(true); $dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8')); libxml_clear_errors(); $xpath = new DOMXPath($dom); $elements = $xpath->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $element_class ')]"); $new_content = ''; foreach ($elements as $element) { $new_content .= $dom->saveHTML($element); } return $new_content; } return $text; }
- А без Дом можно решить? Для меня это совсем сложно
Ответы:
Я бы выбирал из двух вариантов:
1. Вместо the_content() использовать the_excerpt()
2. Если лень заполнять excerpt, можно с помощью CSS скрывать все ненужное.
- Excerpt не нравится по ряду принципиальных причин. Задачи не скрыть все ненужное, а отобразить лишь один параграф по указанному классу. Мне казалось, что условие в php - самый простой из способов. Но я с php тооько начинаю осваиваться
А причем тут пхп?
Через css скрываете все ненужное, и отображаете только нужное
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Если нужно вывести часть
the_contentпо CSS-классу, самый корректный способ действительно через DOMDocument/XPath. Регулярками HTML разбирать нельзя: вложенные блоки, переносы строк и атрибуты быстро сломают логику. Но если DOM кажется сложным, можно сделать проще архитектурно: не вытаскивать кусок из контента, а вынести нужный фрагмент в отдельное поле.Лучший вариант для WordPress: ACF-поле, метаполе или отдельный блок Gutenberg. Тогда на странице категории Вы выводите это поле напрямую, а не парсите весь контент записи.
$summary = get_post_meta(get_the_ID(), '_category_excerpt', true); if ($summary) { echo wp_kses_post(wpautop($summary)); }
Если всё-таки нужно именно вытащить HTML-элемент с классом, рабочий вариант такой:
function get_content_part_by_class($html, $class) { if (!$html || !$class) { return ''; } libxml_use_internal_errors(true); $dom = new DOMDocument('1.0', 'UTF-8'); $dom->loadHTML('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">' . $html); $xpath = new DOMXPath($dom); $query = "//*[contains(concat(' ', normalize-space(@class), ' '), ' " . $class . " ')]"; $nodes = $xpath->query($query); $output = ''; foreach ($nodes as $node) { $output .= $dom->saveHTML($node); } libxml_clear_errors(); return $output; }
Использование:
add_filter('the_content', function ($content) { if (is_category()) { return get_content_part_by_class($content, 'my-special-block'); } return $content; });
Но важный нюанс: фильтр
the_contentна архиве категории может применяться не там, где Вы ожидаете. Часто на архиве вообще выводятthe_excerpt()или кастомный шаблон карточки. Поэтому сначала проверьте, что в нужном месте действительно вызываетсяthe_content().Если задача постоянная и для редактора, лучше не парсить HTML, а завести отдельное поле “Текст для категории”. Это быстрее, понятнее и меньше ломается при изменении верстки.