Wie erstelle ich eine Beziehung zwischen zwei benutzerdefinierten Beitragstypen?

16

Ich möchte eine TV-Seriendatenbank mit WordPress erstellen. Ich habe einige Tutorials befolgt und ich 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?

CoalaArmy
quelle
Zunächst erstellen Sie NICHT eine ganze Datenbank, sondern nur einen benutzerdefinierten Beitragstyp für WordPress. Und im Rahmen von WordPress haben Sie viele Möglichkeiten, sie zu kategorisieren, zu sortieren usw. Und alle von ihnen haben eine gute interne Beziehung. Die Beziehung, über die Sie sprechen, ist also bereits vorhanden. Sie müssen sie nur so implementieren, wie Sie es benötigen. Ich empfehle Ihnen daher, post_type wie angegeben zu implementieren und die Frage dann mit Ihrer tatsächlichen Abfrage zu bearbeiten.
Mayeenul Islam
@ MayeenulIslam, "implement the post_type as directed"was meinst du?
CoalaArmy
Wie in Ihrem Link-Thread angegeben oder mit einem einfachen Generator wie diesem Post Type Generator .
Mayeenul Islam
@ MayeenulIslam: Ich bin nicht überzeugt, dass "die Beziehung, über die Sie sprechen, bereits da ist". Standardmäßig besteht keine direkte Beziehung zwischen verschiedenen Beitragstypen.
s_ha_dum
@s_ha_dum Entschuldigung, ich habe einen Teil seiner Frage verpasst, in der er bereits sagte, dass er zwei post_types hatte. Es ist mein Fehler. Ich versuche ihn mit seinen Details klar zu machen. Ich habe vermisst, dass das Detail schon da ist. :( Ich spreche über die innere Beziehung von Taxonomie und benutzerdefinierten Beitragstyp, wenn definiert.
Mayeenul Islam

Antworten:

22

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
} }
vmassuchetto
quelle
3
Ich mag die Idee mit den Metaboxen (versuche Plugins zu vermeiden)!
CoalaArmy
Können wir, ohne einen weiteren Beitrag zu erstellen, hinzufügen, wie ein Permalink aus dieser Eltern-Kind-Beziehung erstellt wird? Zum Beispiel http://domain.com/series-name/movie-name:?
Xtremefaith
@ Xtremefaith dies kann mit anderem Code erfolgen. Es gibt ein Plugin, das ich für Kategorien erstellt habe. Vielleicht können Sie als Referenz verwenden. wordpress.org/plugins/hierarchical-urls
vmassuchetto
5

Ich empfehle das Plugin Posts 2 Posts , das ich gerade erst verwendet habe.

Hiermit können Sie viele-zu-viele-Beziehungen zwischen Posts und Seitentypen erstellen , dh, Sie können Verknüpfungen movieszu seriesanderen CPTs herstellen, die Sie möglicherweise erstellen.

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

JMB
quelle
Ich werde es mir ansehen.
CoalaArmy
Ich suchte nach etw. ähnlich und versuchte verschiedene Lösungen. Ich muss sagen, dass dieses (Post 2 Post) perfekt war, es könnte nicht das sein, wonach ein "Nicht-Programmierer" suchen würde, aber wenn Sie mehr nach etw suchen. Wie eine Bibliothek, die Sie in Ihrer Vorlage verwenden können, ist diese einfach perfekt, gut dokumentiert, gut integriert. ;)
Larzan
Ich habe ein kleines Plugin für
Postrelations erstellt,
2

Leider ist das Plugin Posts 2 Posts veraltet und wird nicht mehr gepflegt. Es gibt ein neues alternatives Plugin für diese MB-Beziehungen . 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.

Anh Tran
quelle