Вопрос или проблема
Я хотел бы создать функцию шорткода для генерации 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-позициях.