Вопрос или проблема
Мне сложно понять, как отобразить название дочерних страниц в качестве id для div. Предположим, что ‘news’ и ‘othernews’ являются дочерними страницами родительской страницы home (39).
Я хочу что-то вроде этого:
<div class="wrapper" id="news">
content
</div>
<div class="wrapper" id="othernews">
content
</div>
Вот моя функция для шорткода:
function content_block( $atts, $content = null ){
extract( shortcode_atts( array(
'type' => 'white'
), $atts));
$childArgs = array(
'post_type' => 'page',
'parent_page' => 39
);
$child = new WP_Query($childArgs);
if ($child->have_posts()) {
while ($child->have_posts()) {
$child->the_post();
if ($type == 'white') {
$return .= '<div class="col-white">';
$return .= '<div class="wrap" id="'. get_the_title() .'">';
$return .= do_shortcode($content);
$return .= '</div>';
$return .= '</div>';
} else
if ($type == 'grey') {
$return .= '<div class="col-grey">';
$return .= '<div class="wrap" id="'. get_the_title() .'">';
$return .= do_shortcode($content);
$return .= '</div>';
$return .= '</div>';
}
wp_reset_query();
return $return;
}
}
}
Могу я предложить вам предоставить подробности о конкретной проблеме и о том, какие результаты дает ваш пример кода?
Также, похоже, что вы говорите, что страницы, у которых вы хотите получить заголовки, являются дочерними страницами главной страницы, так что на самом деле, они не являются детьми вовсе (Возможно, интересный сюжет для телевизионной драмы).
В любом случае, вместо использования заголовка для вашего ID, я бы предложил использовать slug (post_name):
$current_id = get_the_id();
$post = get_post($current_id);
$post->post_name;
Использование заголовка может привести к пробелам в вашем ID, что может привести к массиву ID, а не к одному.
Ответ или решение
Конечно. Давайте разберемся с вашей задачей по использованию шорткода для отображения заголовков дочерних страниц.
Задача
Вам необходимо отобразить заголовки дочерних страниц в виде идентификаторов div
. Учитывая пример, предоставленный вами — news
и othernews
— являются сиблингами родительской страницы с ID 39 (домашняя страница).
Проблемные Моменты
-
Неверное понимание иерархии страниц: Вы указали, что
news
иothernews
являются сиблингами родительской страницы, но в данном контексте это звучит неправильно, так как они должны быть дочерними. -
Пробелы в идентификаторах: Использование заголовков для ID может приводить к ошибкам из-за наличия пробелов и спецсимволов. Использование урл-адреса (слага) вместо заголовков могло бы быть более надежным и безопасным решением.
Решение
Измененный Подход
- Корректировка shorcode-функции: Используем урл-адрес (слаг) для ID.
function content_block( $atts, $content = null ){
extract( shortcode_atts( array(
'type' => 'white'
), $atts));
$childArgs = array(
'post_type' => 'page',
'post_parent' => 39 // Обратите внимание на 'post_parent'
);
$child = new WP_Query($childArgs);
$return = '';
if ($child->have_posts()) {
while ($child->have_posts()) {
$child->the_post();
$post_slug = get_post_field('post_name', get_the_ID()); // Получение слага
$div_class = ($type == 'white') ? 'col-white' : 'col-grey';
$return .= '<div class="' . $div_class . '">';
$return .= '<div class="wrap" id="' . esc_attr($post_slug) . '">';
$return .= do_shortcode($content);
$return .= '</div>';
$return .= '</div>';
}
wp_reset_postdata(); // Корректное завершение запроса
}
return $return;
}
-
Оптимизация и безопасность:
- Использование
esc_attr()
для безопасного вывода атрибутов. - Убедитесь, что нет прямого возвращения результата в цикле
while
. Это может приводить к преждевременному выходу из функции. - Использование
wp_reset_postdata()
вместоwp_reset_query()
, так как это обеспечивает корректное восстановление объектаglobal $post
.
- Использование
-
SEO и Кодирование:
- Убедитесь, что используете уникальные и понятные слаги для улучшения SEO каждого элемента на странице.
- Применение лучших практик кодирования WordPress обеспечит более чистый и поддерживаемый код.
Таким образом, решение заключается в корректном понимании иерархии страниц, а также в безопасности использования идентификаторов. Это обеспечит отображение ваших страниц в нужном формате.