Jak utworzyć relację między dwoma niestandardowymi typami postów?


16

Chcę zbudować bazę danych seriali telewizyjnych za pomocą WordPress. Wykonałem kilka samouczków i mam dwa niestandardowe typy postów: jeden dla movies, jeden dla i series. Śledziłem ten post dla struktury .

Moje pytanie brzmi: jak mogę powiązać filmy z typami postów z seriali?


Po pierwsze, NIE tworzysz całej bazy danych, po prostu tworzysz niestandardowy typ postu WordPressa. A w zakresie WordPress masz wiele możliwości ich kategoryzacji, sortowania itp. I wszystkie z nich mają dobrą relację wewnętrzną. Tak więc relacja, o której mówisz, już istnieje, musisz ją wdrożyć tak, jak potrzebujesz. Sugeruję więc zaimplementowanie typu post_ zgodnie z zaleceniami, a następnie edycję pytania za pomocą prawdziwego zapytania.
Mayeenul Islam

@MayeenulIslam, "implement the post_type as directed"co masz na myśli?
CoalaArmy

Zgodnie z dostarczonym wątkiem linku lub za pomocą prostego generatora, takiego jak: ten typ generatora postów .
Mayeenul Islam

@MayeenulIslam: Nie jestem przekonany, że „związek, o którym mówisz, już istnieje”. Domyślnie nie ma bezpośredniego związku między różnymi typami postów.
s_ha_dum

@ s_ha_dum Przepraszamy, przeoczyłem jakąś część jego pytania, w którym już powiedział, że ma dwa post_typy. To mój błąd. Staram się, żeby wyjaśnił mu szczegóły. Tęskniłem za tym, że szczegóły już tam są. :( Mówię o wewnętrznej relacji taksonomii i niestandardowego typu postu, jeśli jest zdefiniowany.
Mayeenul Islam,

Odpowiedzi:


22

Korzystanie z wtyczki

Kilka bardzo dobrych wtyczek do relacji:

Korzystanie z Metabox

Możesz zbudować prostą relację za pomocą metaboksów:

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'] ) );

}

A następnie, aby uzyskać relację filmów jako listę postów z serii:

$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
} }

3
Podoba mi się ten pomysł z metaboxami (starającymi się unikać wtyczek)!
CoalaArmy

Czy bez tworzenia kolejnego postu możemy dodać do tego, jak utworzyć bezpośredni link z tej relacji rodzic / dziecko? Na przykład http://domain.com/series-name/movie-name:?
Xtremefaith

@ Xtremefaith można to zrobić za pomocą innego kodu. Utworzyłem wtyczkę dla kategorii. Może możesz użyć jako odniesienia. wordpress.org/plugins/hierarchical-urls
vmassuchetto

5

Polecam wtyczkę Posts 2 Posts , z której właśnie zacząłem korzystać.

Pozwala tworzyć relacje „wiele do wielu” między postami a typami stron, co oznacza, że ​​możesz linkować moviesdo seriesdowolnych innych CPT, które możesz utworzyć.

Ta wtyczka umożliwia także tworzenie metadanych połączeń, które pozwolą uzyskać bardziej szczegółowe szczegóły podczas tworzenia połączeń. Jest dość elastyczny w użyciu, pozwalając kontrolować metaboksy administratora, typy połączeń i sposoby wyświetlania połączeń w interfejsie. Wreszcie jest dobrze udokumentowany .


Rzucę na to okiem.
CoalaArmy

Szukałem czegoś. podobne i wypróbowane różne rozwiązania. Muszę powiedzieć, że ten (Post 2 Post) był doskonały, może nie być tym, czego szukałby „nieprogramista”, ale jeśli szukasz czegoś więcej. jak biblioteka do wykorzystania w szablonie, to jest po prostu idealne, dobrze udokumentowane, dobrze zintegrowane, zdobądź to! ;)
Larzan,

Zrobiłem małą wtyczkę do relacji pocztowych, ale wordpress.org/plugins/softmixt-relations
Softmixt

2

Niestety wtyczka Posts 2 Posts jest przestarzała i nie jest już obsługiwana. Istnieje nowa alternatywna wtyczka dla tych relacji MB . Jest zainspirowany P2P i zapewnia podobny interfejs API do tworzenia relacji między postami, warunkami i użytkownikami.

Relacje MB domyślnie obsługują relacje dwukierunkowe i używają niestandardowej tabeli do przechowywania relacji (takich jak P2P) w celu uzyskania lepszej wydajności (niż po meta).

Warto spojrzeć na wtyczkę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.