Отображать заголовок дочерних страниц в шорткоде

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

Мне сложно понять, как отобразить название дочерних страниц в качестве 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 (домашняя страница).

Проблемные Моменты

  1. Неверное понимание иерархии страниц: Вы указали, что news и othernews являются сиблингами родительской страницы, но в данном контексте это звучит неправильно, так как они должны быть дочерними.

  2. Пробелы в идентификаторах: Использование заголовков для ID может приводить к ошибкам из-за наличия пробелов и спецсимволов. Использование урл-адреса (слага) вместо заголовков могло бы быть более надежным и безопасным решением.

Решение

Измененный Подход

  1. Корректировка 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;
}
  1. Оптимизация и безопасность:

    • Использование esc_attr() для безопасного вывода атрибутов.
    • Убедитесь, что нет прямого возвращения результата в цикле while. Это может приводить к преждевременному выходу из функции.
    • Использование wp_reset_postdata() вместо wp_reset_query(), так как это обеспечивает корректное восстановление объекта global $post.
  2. SEO и Кодирование:

    • Убедитесь, что используете уникальные и понятные слаги для улучшения SEO каждого элемента на странице.
    • Применение лучших практик кодирования WordPress обеспечит более чистый и поддерживаемый код.

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

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

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