Вывести определенный параграф the_content по его css?

Ссылка скопирована
1 ответ

Нужно вывести на странице категорий только часть 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;

Дополнительно:

Вывести определенный параграф the_content по его css?

Должно работать

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 скрываете все ненужное, и отображаете только нужное

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь NetOps Ответ

Если нужно вывести часть 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));
}

$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;
}

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

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, а завести отдельное поле “Текст для категории”. Это быстрее, понятнее и меньше ломается при изменении верстки.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно