Вопрос или проблема
Я уже могу:
- Создать два разных настраиваемых типа записей (например: “Книги” и “Авторы”) и отображать их содержимое.
- Связать эти два настраиваемых типа записей между собой в админке и на фронтенде (используя WP Query и “поле взаимосвязи” из ACF);
- Отображать данные из первого CPT во втором (например, “Запись книги” отображает информацию о “Записи автора”, а “Запись автора” отображает информацию о “Записи книги”).
Что я хочу добиться, так это программно сгенерировать на третьей записи (которая не является ни записью книги, ни записью автора) специфическое содержание, которое объединяет данные из обеих записей. Допустим, чтобы проиллюстрировать эту точку:
“Джон Доу, родившийся в 1900 году, который написал Название романа, является автором этой знаменитой цитаты: [здесь цитата].
Приведенный выше пример отличается от отображения содержания из “записи автора” на “записи книги”. Его цель как раз заключается в генерации этого содержания на третьей записи, которая не является example.com/john-doe/ и не является example.com/title-of-the-novel/, а является example.com/quote-from-john-doe-in-title-of-the-novel/.
Существует ли функция WordPress, которую я могу использовать для генерации новых записей из содержимого, извлеченного из других записей?
Чтобы отобразить содержимое из двух настраиваемых типов записей (CPT), таких как “Книги” и “Авторы”, на третьем CPT (например, “Цитаты”), выполните следующие шаги:
1. Создайте тип записи “Цитаты”
В functions.php
зарегистрируйте новый CPT:
function create_quote_post_type() {
register_post_type( 'quote',
array(
'labels' => array(
'name' => __( 'Цитаты' ),
'singular_name' => __( 'Цитата' )
),
'public' => true,
'has_archive' => true,
'supports' => array( 'title', 'editor' ),
'rewrite' => array( 'slug' => 'quotes' ),
)
);
}
add_action( 'init', 'create_quote_post_type' );
2. Добавьте поля взаимосвязи ACF
С помощью Advanced Custom Fields (ACF) добавьте два поля взаимосвязи к CPT “Цитаты”:
- Одно связывающее с “Авторами”
- Другое связывающее с “Книгами”
3. Отображайте объединенное содержимое
В шаблоне single-quote.php
получите данные из связанных записей и отобразите их:
<?php
$author = get_field( 'author_relationship_field' );
$book = get_field( 'book_relationship_field' );
if ( $author && $book ) {
$author_name = get_the_title( $author->ID );
$birth_year = get_field( 'birth_year', $author->ID );
$book_title = get_the_title( $book->ID );
$book_quote = get_field( 'quote', $book->ID );
echo "<p>{$author_name}, родившийся в {$birth_year}, написал <em>{$book_title}</em> и сказал: \"{$book_quote}\".</p>";
}
?>
Вот и все!
Теперь, когда вы создаете запись “Цитата” и связываете ее с “Книгой” и “Автором”, шаблон будет извлекать содержимое из обеих и отображать его.
Ответ или решение
Чтобы программно сгенерировать пост, который будет отображать содержимое из двух различных постов, принадлежащих двум различным типам пользовательских постов (например, "Книги" и "Авторы"), выполните следующие шаги:
1. Создайте новый тип поста "Цитаты"
В файле functions.php
вашей темы зарегистрируйте новый тип поста:
function create_quote_post_type() {
register_post_type( 'quote',
array(
'labels' => array(
'name' => __( 'Цитаты' ),
'singular_name' => __( 'Цитата' )
),
'public' => true,
'has_archive' => true,
'supports' => array( 'title', 'editor' ),
'rewrite' => array( 'slug' => 'quotes' ),
)
);
}
add_action( 'init', 'create_quote_post_type' );
2. Добавьте поля связи с помощью ACF
Используя плагин Advanced Custom Fields (ACF), добавьте два поля связи в тип поста "Цитаты":
- Первое поле, которое ссылается на "Авторов"
- Второе поле, которое ссылается на "Книги"
3. Отобразите объединенное содержимое в шаблоне
В шаблоне single-quote.php
получите данные из связанных постов и отобразите их следующим образом:
<?php
$author = get_field( 'author_relationship_field' );
$book = get_field( 'book_relationship_field' );
if ( $author && $book ) {
$author_name = get_the_title( $author->ID );
$birth_year = get_field( 'birth_year', $author->ID );
$book_title = get_the_title( $book->ID );
$book_quote = get_field( 'quote', $book->ID );
echo "<p>{$author_name}, родился в {$birth_year}, написал <em>{$book_title}</em> и сказал: \"{$book_quote}\".</p>";
}
?>
Заключение
Теперь, когда вы создадите пост типа "Цитата" и свяжете его с "Книгой" и "Автором", шаблон будет извлекать содержимое из обоих постов и отображать его в нужном формате. Это позволяет создать контент, который программно объединяет данные из двух различных пользовательских постов в одном посте, который не является ни постом "Автора", ни постом "Книги".
Если у вас есть дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!