WordPress. Связывание записей разного типа

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 с выбором эксперта.

Блок содержащий 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 );
?>

Теперь под содержанием статьи выводиться имя эксперта и его биография.

Все задача решена 🙂

Хостинг для ваших проектов