WordPress. Связывание записей разного типа
Решим такую задачу: У клиента есть сайт со списком статей медицинской тематики, необходимо к каждой статье добавить врача-эксперта, который помогал в написании или писал эту статью. Врач-эксперт так же имеет свою страничку на сайте с фото и краткой биографией, а так же со списком всех связанных с ним статей.
Для решения нам необходимо создать новый тип записи Expert и связать его с типом записи Post. Разобьем все наши действия на несколько шагов:
Шаг 1. Создаем собственный тип записей
Для начала создадим собственный тип записей «Эксперты» куда мы будем добавлять информацию об эксперте, такую как Имя, Описание (биографию) и Фото.
Новый тип записи добавляем с помощью функции register_post_type()
которую вешаем на событие init
.
Добавьте в файл functions.php следующий код:
add_action( 'init', function () {
$labels = array(
'name' => 'Эксперты',
'singular_name' => 'Эксперты',
'add_new' => 'Добавить эксперта',
'add_new_item' => 'Добавить нового эксперта',
'edit_item' => 'Редактировать эксперта',
'new_item' => 'Новый эксперт',
'all_items' => 'Все эксперты',
'view_item' => 'Посмотреть эксперта на сайте',
'search_items' => 'Искать эксперта',
'not_found' => 'Эксперт не найден!',
'not_found_in_trash' => 'В корзине нет эксперта',
'menu_name' => 'Эксперты'
);
$args = array(
'labels' => $labels,
'public' => true,
'show_ui' => true, // показывать в админке
'menu_icon' => 'dashicons-buddicons-buddypress-logo',
'menu_position' => 4, // порядок в меню
'supports' => array('title', 'editor', 'thumbnail')
);
register_post_type('experts', $args);
});
В menu_icon
можно указать название иконки из набора Dashicons, который входит в состав WordPress или указать путь к файлу иконки например в вашем шаблоне
В массиве supports
указываем поддерживаемые поля на странице создания/редактирования этого типа записи, например Блок Заголовок, Блок Автор и тд.
После этого нужно перестроить структуру постоянных ссылок, для этого необходимо зайти в Настройки — Постоянные ссылки и ничего не трогая нажать Сохранить изменения.
Шаг 2. Добавим метабокс выбора эксперта к посту
Нам необходимо чтобы при редактировании поста можно было привязать к нему эксперта, поэтому следующим шагом необходимо добавить метабокс (блок) выбора эксперта на страницу с редактированием поста.
Сделаем это с помощью функции add_meta_box()
которую повесим на событие add_meta_boxes
, для этого в functions.php добавим следующий код:
add_action('add_meta_boxes', function () {
add_meta_box( 'post_expert', 'Эксперт статьи', 'post_expert_metabox', 'post', 'side', 'low' );
});
// Метабокс с выбором эксперта
function post_expert_metabox( $post ){
$experts = get_posts(array( 'post_type'=>'experts', 'posts_per_page'=>-1, 'orderby'=>'post_title', 'order'=>'ASC' ));
if( $experts ){
echo '
<select name="post_parent">';
foreach( $experts as $expert ){
echo '
<option value="'. $expert->ID .'" '. selected($expert->ID, $post->post_parent) .'>'.esc_html($expert->post_title).'</option>
';
}
echo '</select>';
}
else
echo 'Эксперты не найдены!';
}
Теперь если зайти на страницу редактирования поста, то слева мы увидим наш блок содержащий select с выбором эксперта.
Шаг 3. Страница эксперта
В пользовательской части сайта у эксперта будет своя страница на которой отображается его имя, биография, фото и список связанных с ним статей. Для этого в шаблоне создадим файл single-experts.php с таким содержимым:
<?php
get_header();
?>
<?php
while ( have_posts() ) :
the_post();
echo '<h2>';
the_title();
echo '</h2>';
the_content();
endwhile;
// Так же выведем все связанные с этим экспертом статьи
$expert_posts = get_posts(array('post_parent'=>$post->ID));
if($expert_posts) {
foreach ($expert_posts as $post) {
?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php
}
wp_reset_postdata();
}
?>
<?php
get_footer();
Хочу обратить внимание, это не полноценный файл шаблона который выведет нам красивую страницу эксперта, это пример того как можно сделать. Тут нет форматирования, здесь просто выводится имя и описание эксперта, а так же название связанных с ним статей.
Мы уже решили часть поставленной задачи, у нас есть страничка врача-эксперта с информацией о нем и связанными статьями.
Шаг 4. Вывод эксперта у статьи
Теперь необходимо у самой статьи показать с каким экспертом она связана, для этого в шаблоне статьи single.php, например после вывода основного содержания статьи, добавим следующий код:
<?php
// Вывод имени эксперта связанного со статьей
$expert = get_post( $post->post_parent );
?>
<a href="<?php the_permalink($expert); ?>"><?php echo $expert->post_title; ?> </a><br>
<?php
echo esc_html( $expert->post_content );
?>
Теперь под содержанием статьи выводиться имя эксперта и его биография.
Все задача решена 🙂