Отображение дочерних страниц и URL файлов в шорткоде поля связи ACF

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

Чтобы описать мой сценарий: у меня есть несколько базовых страниц и пользовательский тип записей (CPT) под названием ‘Ресурсы’. Тип записи ‘Ресурсы’ имеет поле ACF типа файл под названием ‘pdf_file’. Эти страницы имеют поле ACF отношений, которое позволяет связывать Ресурсы с каждой страницей. Эти страницы затем будут отображаться на фронтенде в виде простого списка со ссылками на соответствующий PDF-файл.

Тип записи ‘Ресурсы’ настроен в структуре родитель/дочерний.

У меня есть нечто, что я переработал из другого проекта, что проходит через связанные записи и выводит заголовок и URL. Я пытаюсь модифицировать это, чтобы выводить не только ссылку на PDF-файл, но также и структуру родитель-дитя.

Например:

‘Страница 1’ имеет ‘Ресурс 1’ в качестве связанной записи.

‘Ресурс 1’ имеет 2 дочерние записи; ‘Ресурс 2’ и ‘Ресурс 3’.

Таким образом, на фронтенде ‘Страницы 1’ отрисованный список будет выглядеть так:

Ресурс 1 (с ссылкой на PDF)

Ресурс 2 (с ссылкой на PDF)

Ресурс 3 (с ссылкой на PDF)

Код, который у меня в данный момент, приведен ниже:

add_shortcode( 'ca_acf_relationship_field', 'ca_get_relationship_field' ); 

function ca_get_relationship_field( $atts ) {
    ob_start();
    
    global $post;
    $defaults = array(
        'post_id' => $post->ID, // По умолчанию используется текущий ID записи.
        'field'   => 'related_resource',
    );
    
    $args = wp_parse_args( $atts, $defaults );
    
    $related_posts = get_field( $args['field'], $args['post_id'] );

    // Проверим, есть ли у нас одна запись (объект записи, ID записи) или массив записей, затем преобразуем в массив.
    if( is_object( $related_posts ) ) {
        $related_posts = array( $related_posts );
    } else if ( is_scalar( $related_posts ) ) {
        $related_posts = array( $related_posts );
    }
    if ( $related_posts ) {
        ?>
        
        <ul>
        <?php foreach( $related_posts as $related_post ) {
            if ( is_scalar( $related_post ) ) {
                $related_post = get_post( $related_post );
            }
            ?>
            <li>
                <a href="<?php echo esc_url( get_permalink( $related_post->ID ) ); ?>"><?php echo esc_html( get_the_title( $related_post->ID ) ); ?></a>
            </li>
        <?php } ?>
        </ul>
    <?php
    }
    return ob_get_clean();
}

Я надеюсь, что кто-то сможет помочь мне вывести дочерние записи и также отрисовать URL PDF-файла в ссылке. Это то, чего я никогда не мог достичь.

Спасибо

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

Чтобы правильно визуализировать дочерние страницы и ссылки на файлы в поле связи ACF (Advanced Custom Fields), необходимо внести изменения в ваш существующий шорткод. Мы будем использовать методы WordPress для получения дочерних постов и ссылок на файл PDF. Далее приведен доработанный код шорткода с комментариями, чтобы вы могли легко следить за изменениями:

add_shortcode( 'ca_acf_relationship_field', 'ca_get_relationship_field' );

function ca_get_relationship_field( $atts ) {
    ob_start();

    global $post;
    $defaults = array(
        'post_id' => $post->ID, // По умолчанию используем текущий ID поста.
        'field'   => 'related_resource',
    );

    $args = wp_parse_args( $atts, $defaults );

    // Получаем связанные посты по полю ACF.
    $related_posts = get_field( $args['field'], $args['post_id'] );

    // Преобразуем объекты и скаляры в массив.
    if( is_object( $related_posts ) ) {
        $related_posts = array( $related_posts );
    } else if ( is_scalar( $related_posts ) ) {
        $related_posts = array( $related_posts );
    }

    if ( $related_posts ) {
        echo '<ul>';

        // Проходимся по каждому связанному посту.
        foreach( $related_posts as $related_post ) {
            if ( is_scalar( $related_post ) ) {
                $related_post = get_post( $related_post );
            }
            // Выводим информацию о связанном посте.
            echo '<li>';
            echo '<a href="' . esc_url( get_permalink( $related_post->ID ) ) . '">' . esc_html( get_the_title( $related_post->ID ) ) . '</a>';

            // Получение и отображение PDF ссылки.
            $pdf_file = get_field('pdf_file', $related_post->ID);
            if ($pdf_file) {
                echo ' <a href="' . esc_url($pdf_file['url']) . '" target="_blank">[PDF]</a>'; // Ссылка на PDF
            }

            // Получаем и выводим дочерние посты.
            $children = get_posts(array(
                'post_type' => 'resources', // Замените на ваш CPT
                'post_parent' => $related_post->ID,
                'numberposts' => -1, // Получаем всех детей
            ));

            // Проверяем наличие дочерних постов.
            if ($children) {
                echo '<ul class="children">';
                foreach ($children as $child) {
                    echo '<li>';
                    echo '<a href="' . esc_url(get_permalink($child->ID)) . '">' . esc_html(get_the_title($child->ID)) . '</a>';

                    // Получение и отображение PDF ссылки для дочерних постов.
                    $child_pdf_file = get_field('pdf_file', $child->ID);
                    if ($child_pdf_file) {
                        echo ' <a href="' . esc_url($child_pdf_file['url']) . '" target="_blank">[PDF]</a>'; // Ссылка на PDF
                    }
                    echo '</li>';
                }
                echo '</ul>';
            }
            echo '</li>';
        }
        echo '</ul>';
    }

    return ob_get_clean();
}

Описание изменений

  1. Получение дочерних постов: Мы используем функцию get_posts для получения всех дочерних постов, связанных с текущим постом. Прописываем параметры для получения дочерних постов в иерархии.

  2. Вывод ссылки на файл PDF: Изначально мы получаем файл PDF, связанный с ресурсом, и выводим соответствующую ссылку. Этот процесс также повторяется для дочерних постов.

  3. Структура вывода: Мы добавляем вложенные списки (<ul class="children">), чтобы визуально обозначить иерархию и сделать вывод более читабельным.

Завершение

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

Для того чтобы повысить SEO-оптимизацию, убедитесь, что заголовки и ссылки содержат ключевые слова, относящиеся к контенту ресурса, что поможет в ранжировании страниц вашего сайта.

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

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