Как вывести дочерние страницы с аннотациями, например, [child-pages depth=”1″ excerpt=”1″]

Вопрос или проблема

Я хотел бы создать функцию шорткода для генерации HTML-списка дочерних страниц родительской страницы и включения отрывка. Что-то вроде этого:

<ul>
  <li>
    <h3>Название дочерней страницы 1</h3>
    <p>Отрывок 1</p>
  <li>
  <li>
    <h3>Название дочерней страницы 2</h3>
    <p>Отрывок 2</p>
  <li>
</ul>

Я пробовал плагин List Pages Shortcode, но этот плагин не позволяет использовать несколько параметров, таких как [child-pages depth=”1″ excerpt=”1″].

Я публикую это сообщение, потому что верю, что этот шорткод будет полезен не только мне.

Буду благодарен за помощь.

Когда я создаю шорткоды с большим количеством HTML, я использую две функции. Одна шаблонная функция, которая содержит весь код шорткода. И одна простая функция для создания шорткода из первой функции. Я склонен использовать эту настройку, потому что функция шорткода должна return содержимое.

Сначала нам нужно создать шаблонную функцию, которая будет содержать HTML-код и атрибуты шорткода.

function child_pages_shortcode_template( $atts ) {

    // Атрибуты
    // это атрибуты, которые вы можете вставить в шорткод
    // т.е. [show_child_pages sort_order="desc"]
    // смотрите документацию для get_pages для всех атрибутов
    // они также используются как настройки значений по умолчанию
    $atts = shortcode_atts(array(
        'sort_order'   => 'asc',
        'sort_column'  => 'post_title',
        'show_excerpt' => 1, // отрывок отображается по умолчанию, установите любое другое число, чтобы отключить
        ), $atts );
    extract( $atts );

    // получаем ID текущей страницы
    $current_page_id = get_the_ID();

    // устанавливаем ID текущей страницы как параметр child_of
    // это значит, что мы показываем только дочерние страницы текущей страницы
    $args = array(
        'child_of'      => $current_page_id,
        'parent'        => $current_page_id, // добавьте это, чтобы показать только 1 уровень глубины, удалите, чтобы также показать внуков
        'post_type'     => 'page',
        'sort_order'    => $sort_order, // это приходит из shortcode_atts выше, так что вы можете изменить это с помощью шорткода
        'sort_column'   => $sort_column, // это приходит из shortcode_atts выше, так что вы можете изменить это с помощью шорткода
    );

    $child_pages = get_pages( $args );

    // начинаем только если у нас есть дочерние страницы
    if ($child_pages) {

        echo '<ul>';

        foreach ($child_pages as $child_page) {

            echo '<li>';

            $child_page_title = $child_page->post_title; // получаем название дочерней страницы
            $child_page_excerpt = $child_page->post_excerpt; // получаем отрывок дочерней страницы
            $child_page_id = $child_page->ID; // получаем ID дочерней страницы для создания постоянной ссылки
            $child_page_permalink = get_permalink($child_page_id); // получаем постоянную ссылку на дочернюю страницу

            echo '<h3><a href="'.$child_page_permalink.'">'.$child_page_title.'</a></h3>';

            // показываем отрывок только если $show_excerpt равно 1
            if ($show_excerpt == 1) {
                echo '<p>'.$child_page_excerpt.'</p>';
            } 

            echo '</li>';

        }

        echo '</ul>';

    } 
}

После этого мы берем первую функцию и создаем из нее шорткод:

function child_pages_shortcode($atts, $content = null){
    ob_start();
        $content = child_pages_shortcode_template($atts);
        $content = ob_get_contents();
    ob_end_clean();

    return $content;

}
add_shortcode('show_child_pages', 'child_pages_shortcode');

Теперь вы можете использовать, например, [show_child_pages show_excerpt="0"]

С помощью ob_start(), ob_get_contents() и ob_end_clean() мы можем перехватить содержимое нашей первой функции. Только с этой функцией наш шорткод будет обработан. Содержимое нашей первой функции будет здесь буферизовано.


Некоторые пояснения:

$atts = shortcode_atts(array(
        'sort_order'   => 'asc',
        'sort_column'  => 'post_title',
        'show_excerpt' => 1, // отрывок отображается по умолчанию, установите любое другое число, чтобы отключить
        ), $atts );
    extract( $atts );

Это все атрибуты для шорткода. Вы можете увидеть, что мы можем комбинировать атрибуты здесь. Например, sort_order и sort_column являются атрибутами, которые мы вставим в наш запрос get_pages() в качестве аргументов. Но show_excerpt – это просто пользовательский атрибут. Позже в коде мы можем проверить, был ли введен атрибут и что именно было введено.

if ($show_excerpt == 1) {
   echo '<p>'.$child_page_excerpt.'</p>';
}

Здесь мы просто проверяем, установлен ли атрибут $show_excerpt в 1. Если было введено любое другое число или строка, отрывок отображаться не будет.

$args = array(
        'child_of'      => $current_page_id,
        'parent'        => $current_page_id, // добавьте это, чтобы показать только 1 уровень глубины, удалите, чтобы также показать внуков
        'post_type'     => 'page',
        'sort_order'    => $sort_order, // это приходит из shortcode_atts выше, так что вы можете изменить это с помощью шорткода
        'sort_column'   => $sort_column, // это приходит из shortcode_atts выше, так что вы можете изменить это с помощью шорткода
    );

Это аргументы для нашей функции get_pages. С помощью 'child_of' => $current_page_id, мы гарантируем, что мы перечисляем только дочерние элементы текущей страницы.
С помощью 'parent' => $current_page_id, мы можем влиять на глубину. Если мы установим его также на текущую страницу, то внуки не будут перечислены. Нам нужно использовать это, так как get_pages не имеет аргумента depth.

Ответ или решение

Для решения задачи по созданию шорткода в WordPress, который будет выводить список дочерних страниц с кратким описанием, необходимо разработать функцию. Мы обсудим, как успешно реализовать этот шорткод в несколько этапов, начиная с подготовки функции для сбора данных и заканчивая его интеграцией в WordPress.

Этап 1: Подготовка функции для шорткода

Начнем с написания функции child_pages_shortcode_template, которая будет собирать дочерние страницы текущей страницы и формировать HTML-список с их названиями и краткими описаниями.

function child_pages_shortcode_template( $atts ) {
    // Устанавливаем атрибуты для шорткода
    $atts = shortcode_atts(array(
        'depth'        => 1,
        'show_excerpt' => 1, // Если установлен 1, отображаем краткое описание
    ), $atts );

    // Получаем ID текущей страницы
    $current_page_id = get_the_ID();

    // Задаём параметры для запроса дочерних страниц
    $args = array(
        'child_of'     => $current_page_id,
        'parent'       => $current_page_id, // Отображаем только первый уровень глубины
        'post_type'    => 'page',
        'sort_order'   => 'ASC', // Порядок сортировки
        'sort_column'  => 'post_title',
    );

    // Получаем список дочерних страниц
    $child_pages = get_pages( $args );

    // Проверяем наличие дочерних страниц
    if ($child_pages) {
        $output = '<ul>'; // Начало HTML списка

        foreach ($child_pages as $child_page) {
            $child_page_title = $child_page->post_title; // Название страницы
            $child_page_excerpt = $child_page->post_excerpt; // Краткое описание страницы
            $child_page_id = $child_page->ID; // ID дочерней страницы
            $child_page_permalink = get_permalink($child_page_id); // Ссылка на дочернюю страницу

            // Формируем HTML для списка
            $output .= '<li>';
            $output .= '<h3><a href="' . esc_url($child_page_permalink) . '">' . esc_html($child_page_title) . '</a></h3>';

            // Проверяем, нужно ли выводить краткое описание
            if ($atts['show_excerpt'] == 1) {
                $output .= '<p>' . esc_html($child_page_excerpt) . '</p>';
            }
            $output .= '</li>';
        }

        $output .= '</ul>'; // Закрытие HTML списка

        return $output; // Возвращаем сгенерированный HTML
    }
    return ''; // Возвращаем пустую строку, если дочерних страниц нет
}

Этап 2: Регистрация шорткода

Теперь, когда у нас есть функция для обработки шорткода, необходимо зарегистрировать его в WordPress с помощью следующей функции:

function child_pages_shortcode($atts, $content = null){
    return child_pages_shortcode_template($atts);
}
add_shortcode('child-pages', 'child_pages_shortcode');

Этап 3: Использование шорткода на сайте

Теперь вы можете использовать шорткод в любом из ваших постов или страниц. Например, чтобы вывести список дочерних страниц с краткими описаниями, добавьте:

[child-pages show_excerpt="1"]

Если вы хотите скрыть описания, измените параметр:

[child-pages show_excerpt="0"]

Заключение

Создание шорткода для вывода дочерних страниц в WordPress — это полезный инструмент, который поможет динамически отображать контент на вашем сайте. Используя данный подход, вы сможете легко адаптировать и расширять функциональность согласно вашим требованиям. Такой шорткод не только улучшит пользовательский опыт, но и повысит внутреннюю структуру сайта, что может положительно сказаться на SEO-позициях.

Оцените материал
Добавить комментарий

Капча загружается...