Вопрос или проблема
Чтобы описать мой сценарий: у меня есть несколько базовых страниц и пользовательский тип записей (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();
}
Описание изменений
-
Получение дочерних постов: Мы используем функцию
get_posts
для получения всех дочерних постов, связанных с текущим постом. Прописываем параметры для получения дочерних постов в иерархии. -
Вывод ссылки на файл PDF: Изначально мы получаем файл PDF, связанный с ресурсом, и выводим соответствующую ссылку. Этот процесс также повторяется для дочерних постов.
-
Структура вывода: Мы добавляем вложенные списки (
<ul class="children">
), чтобы визуально обозначить иерархию и сделать вывод более читабельным.
Завершение
Теперь этот шорткод будет правильно отображать все связанные ресурсы вместе с дочерними постами и их ссылками на PDF файлы. Это решение обеспечивает простоту и читаемость на фронтенде, позволяя посетителям легко находить все необходимые документы.
Для того чтобы повысить SEO-оптимизацию, убедитесь, что заголовки и ссылки содержат ключевые слова, относящиеся к контенту ресурса, что поможет в ранжировании страниц вашего сайта.