it-swarm.com.de

Wie erstelle ich eine Beziehung zwischen zwei benutzerdefinierten Beitragstypen?

Ich möchte eine TV-Seriendatenbank mit WordPress erstellen. Ich habe einige Tutorials befolgt und habe zwei benutzerdefinierte Beitragstypen: einen für movies, einen für und series. Ich folgte diesem Beitrag für die Struktur .

Meine Frage ist: Wie kann ich die Beziehung zwischen Filmen und Serienposttypen herstellen?

15
CoalaArmy

Verwendung eines Plugins

Einige sehr gute Plugins für Beziehungen:

Verwenden einer Metabox

Sie können eine einfache Beziehung mit Metaboxen erstellen:

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

}

Und dann, um die Beziehung zum Film als Liste für Serienbeiträge zu erhalten:

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

Ich empfehle das Posts 2 Posts Plugin, mit dem ich gerade angefangen habe.

Sie können viele-zu-viele-Beziehungen zwischen Posts und Seitentypen erstellen, dh, Sie können movies mit series und allen anderen CPTs verknüpfen, die Sie möglicherweise erstellen.

Mit diesem Plugin können Sie auch Verbindungsmetadaten erstellen , mit denen Sie beim Erstellen Ihrer Verbindungen detailliertere Informationen erhalten. Es ist sehr flexibel in seiner Verwendung und ermöglicht die Kontrolle über Admin-Metaboxen, Verbindungstypen und Möglichkeiten, um Ihre Verbindungen auf dem Front-End anzuzeigen. Schließlich ist es gut dokumentiert .

5
JMB

Leider ist das Plugin Posts 2 Posts veraltet und wird nicht mehr gepflegt. Es gibt ein neues alternatives Plugin für das MB Relationships . Es ist von P2P inspiriert und bietet eine ähnliche API zum Erstellen von Beziehungen zwischen Posts, Begriffen und Benutzern.

MB-Beziehungen unterstützen standardmäßig bidirektionale Beziehungen und verwenden eine benutzerdefinierte Tabelle zum Speichern von Beziehungen (wie P2P), um eine bessere Leistung zu erzielen (als nach dem Meta).

Ein Blick auf das Plugin lohnt sich.

1
Anh Tran