Как создать связь между двумя произвольными типами записей?

5 янв. 2014 г., 14:30:56
Просмотры: 49.3K
Голосов: 19

Я хочу создать базу данных телесериалов с помощью WordPress. Я следовал некоторым руководствам и создал два произвольных типа записей: один для movies, другой для series. Я следовал этой статье для структуры.

Мой вопрос: как создать связь между типами записей фильмов и сериалов?

5
Комментарии

Прежде всего, вы НЕ создаёте целую базу данных, вы просто создаёте пользовательский тип записи в WordPress. В рамках WordPress у вас есть множество возможностей для их категоризации, сортировки и т.д. Всё это реализовано с хорошими внутренними связями. Таким образом, связи, о которых вы говорите, уже существуют, вам нужно лишь реализовать их нужным вам способом. Поэтому я рекомендую вам создать тип записи (post_type) как указано, а затем отредактировать вопрос с вашим конкретным запросом.

Mayeenul Islam Mayeenul Islam
5 янв. 2014 г. 14:53:29

@MayeenulIslam, "implement the post_type as directed" что вы имеете в виду?

CoalaArmy CoalaArmy
5 янв. 2014 г. 14:59:34

Как указано в вашей ссылке-обсуждении, или используя простой генератор, например: этот генератор типов записей.

Mayeenul Islam Mayeenul Islam
5 янв. 2014 г. 15:03:47

@MayeenulIslam : Я не уверен, что "связь, о которой вы говорите, уже существует". По умолчанию нет прямой связи между разными типами записей.

s_ha_dum s_ha_dum
5 янв. 2014 г. 17:07:52

@s_ha_dum Извините, я пропустил часть его вопроса, где он уже упомянул, что у него есть два post_types. Это моя ошибка. Я пытался уточнить у него детали, но пропустил, что они уже указаны. :( Я говорил о внутренней связи таксономии и пользовательского типа записи, если они определены.

Mayeenul Islam Mayeenul Islam
5 янв. 2014 г. 17:52:11
Все ответы на вопрос 3
3
30

Использование плагина

Некоторые очень хорошие плагины для работы со связями:

Использование метабокса

Вы можете создать простую связь между записями с помощью метабоксов:

add_action( 'admin_init', 'add_meta_boxes' );
function add_meta_boxes() {
    add_meta_box( 'some_metabox', 'Связь с фильмами', 'movies_field', 'series' );
}

function movies_field() {
    global $post;
    $selected_movies = get_post_meta( $post->ID, '_movies', true );
    $all_movies = get_posts( array(
        'post_type' => 'movies',
        'numberposts' => -1,
        'orderby' => 'post_title',
        'order' => 'ASC'
    ) );
    ?>
    <input type="hidden" name="movies_nonce" value="<?php echo wp_create_nonce( basename( __FILE__ ) ); ?>" />
    <table class="form-table">
    <tr valign="top"><th scope="row">
    <label for="movies">Фильмы</label></th>
    <td><select multiple name="movies">
    <?php foreach ( $all_movies as $movie ) : ?>
        <option value="<?php echo $movie->ID; ?>"<?php echo (in_array( $movie->ID, $selected_movies )) ? ' selected="selected"' : ''; ?>><?php echo $movie->post_title; ?></option>
    <?php endforeach; ?>
    </select></td></tr>
    </table>
}

add_action( 'save_post', 'save_movie_field' );
function save_movie_field( $post_id ) {

    // выполняем только для типа записи series
    if ( 'series' != get_post_type( $post_id ) )
        return $post_id;        

    // проверяем nonce
    if ( empty( $_POST['movies_nonce'] ) || !wp_verify_nonce( $_POST['movies_nonce'], basename( __FILE__ ) ) )
        return $post_id;

    // проверяем автосохранение
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    // проверяем права пользователя
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;

    // сохраняем данные
    update_post_meta( $post_id, '_movies', array_map( 'intval', $_POST['movies'] ) );

}

Затем, чтобы получить список связанных фильмов для записей сериалов:

$series = new WP_Query( array(
    'post_type' => 'movies',
    'post__in' => get_post_meta( $series_id, '_movies', true ),
    'nopaging' => true
) );

if ( $series-> have_posts() ) { while ( $series->have_posts() ) {
    $series->the_post();
    ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php
} }
5 янв. 2014 г. 15:02:12
Комментарии

Мне нравится идея с метабоксами (стараюсь избегать плагинов)!

CoalaArmy CoalaArmy
5 янв. 2014 г. 15:16:18

Не создавая отдельную запись, можно ли добавить к этому создание постоянной ссылки из родительских/дочерних отношений? Например: http://domain.com/название-серии/название-фильма?

Xtremefaith Xtremefaith
8 апр. 2015 г. 08:23:14

@Xtremefaith это можно реализовать другим кодом. Я создал плагин для категорий. Возможно, вы сможете использовать его как пример. https://wordpress.org/plugins/hierarchical-urls/

vmassuchetto vmassuchetto
7 авг. 2016 г. 14:38:47
3

Я рекомендую плагин Posts 2 Posts, который я недавно начал использовать.

Он позволяет создавать связи «многие ко многим» между записями и типами страниц, что означает, что вы можете связывать movies с series и любые другие пользовательские типы записей (CPT), которые вы создадите.

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

5 янв. 2014 г. 14:55:45
Комментарии

Я посмотрю на это.

CoalaArmy CoalaArmy
5 янв. 2014 г. 14:58:19

Я искал что-то подобное и пробовал различные решения. Должен сказать, что этот (Post 2 Post) был идеальным, возможно, это не то, что искал бы "не-программист", но если вам нужно что-то вроде библиотеки для использования в шаблоне, то это просто идеально, хорошо документировано, хорошо интегрировано, берите! ;)

Larzan Larzan
18 дек. 2014 г. 19:59:55

Я сделал небольшой плагин для связей между записями, но https://wordpress.org/plugins/softmixt-relations

Softmixt Softmixt
4 июл. 2017 г. 10:37:46
0

К сожалению, плагин Posts 2 Posts устарел и больше не поддерживается. Существует новый альтернативный плагин для этой цели — MB Relationships. Он вдохновлен P2P и предоставляет аналогичный API для создания связей между записями, терминами и пользователями.

MB Relationships по умолчанию поддерживает двунаправленные связи и использует собственную таблицу для хранения отношений (как P2P), что обеспечивает лучшую производительность (по сравнению с метаполями записей).

Стоит ознакомиться с этим плагином.

29 янв. 2018 г. 05:18:10