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

16

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

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

CoalaArmy
источник
Прежде всего, вы НЕ создаете целую базу данных, вы просто создаете пользовательский тип записи WordPress. И в рамках WordPress у вас есть много возможностей классифицировать их, сортировать их и т. Д. И все они сделаны с хорошими внутренними отношениями. Итак, отношения, о которых вы говорите, уже существуют, вам просто нужно реализовать их так, как вам нужно. Итак, я бы предложил вам реализовать post_type в соответствии с указаниями, а затем отредактировать вопрос с вашим реальным запросом.
Mayeenul Islam
@ MayeenulIslam, "implement the post_type as directed"что ты имеешь в виду?
CoalaArmy
Как указано в предоставленной вами ссылке , или с помощью простого генератора, такого как: этот генератор типов постов .
Mayeenul Islam
@MayeenulIslam: Я не уверен, что «отношения, о которых вы говорите, уже есть». По умолчанию нет прямой связи между различными типами сообщений.
s_ha_dum
@s_ha_dum Извините, я пропустил некоторую часть его вопроса, где он уже сказал, что у него есть два post_types. Это моя ошибка. Я пытаюсь заставить его уточнить с его деталями. Я упустил, что деталь уже есть. :( Я говорю о внутренней взаимосвязи таксономии и пользовательского типа поста, если он определен.
Mayeenul Islam

Ответы:

22

Используя плагин

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

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

Вы можете построить простые отношения, используя метабоксы:

add_action( 'admin_init', 'add_meta_boxes' );
function add_meta_boxes() {
    add_meta_box( 'some_metabox', 'Movies Relationship', '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">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 ) {

    // only run this for series
    if ( 'series' != get_post_type( $post_id ) )
        return $post_id;        

    // verify nonce
    if ( empty( $_POST['movies_nonce'] ) || !wp_verify_nonce( $_POST['movies_nonce'], basename( __FILE__ ) ) )
        return $post_id;

    // check autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    // check permissions
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;

    // save
    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
} }
vmassuchetto
источник
3
Мне нравится идея с метабоксами (пытаясь избежать плагинов)!
CoalaArmy
Не создавая еще одну публикацию, можем ли мы добавить к этому, как создать постоянную ссылку на отношения родитель / потомок? Например: http://domain.com/series-name/movie-name?
Xtremefaith
@Xtremefaith это можно сделать с помощью другого кода. Есть плагин, который я создал для категорий. Может быть, вы можете использовать в качестве ссылки. wordpress.org/plugins/hierarchical-urls
vmassuchetto
5

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

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

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

JMB
источник
Я посмотрю на это.
CoalaArmy
Я искал что-нибудь. аналогичные и пробовали различные решения. Я должен сказать, что этот пост (Пост 2) был идеальным, это может быть не то, что ищет «непрограммист», но если вы ищете больше для чего-то другого. как библиотека для использования в вашем шаблоне, чем это просто отлично, хорошо документировано, хорошо интегрировано, получите это! ;)
Ларзан
Я сделал небольшой плагин для почтовых отношений, но wordpress.org/plugins/softmixt-relations
Softmixt
2

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

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

Стоит взглянуть на плагин.

Ань Чан
источник