¿Cómo creo una relación entre dos tipos de publicaciones personalizadas?

15

Quiero construir una base de datos de series de TV usando WordPress. He seguido algunos tutoriales y tengo dos tipos de publicaciones personalizadas: una para movies , una para y series . Seguí esta publicación para la estructura .

Mi pregunta es: ¿cómo puedo establecer la relación entre las películas y los tipos de publicaciones de la serie?

    
pregunta CoalaArmy 05.01.2014 - 13:30

3 respuestas

19

Usando un complemento

Algunos complementos muy buenos para las relaciones:

Usando un Metabox

Puedes construir una relación simple usando metaboxes:

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

}

Y luego, para obtener la relación de películas como una lista de publicaciones de la serie:

$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
} }
    
respondido por el vmassuchetto 05.01.2014 - 14:02
5

Recomiendo el complemento Posts 2 Posts , que acabo de comenzar a usar.

Le permite crear relaciones de muchos a muchos entre publicaciones y tipos de páginas, lo que significa que puede vincular movies a series , y cualquier otro CPT que pueda crear.

Este complemento también te permite crear metadatos de conexión que te permitirán para obtener más detalles al crear sus conexiones. Es bastante flexible en su uso, lo que permite el control sobre los metaboxes de administración, los tipos de conexión y las formas de mostrar sus conexiones en la parte frontal. Por último, está bien documentado .

    
respondido por el JMB 05.01.2014 - 13:55
1

Desafortunadamente, el plugin Posts 2 Posts está obsoleto y ya no se mantiene. Hay un nuevo complemento alternativo para ese MB Relationships . Está inspirado en P2P y proporciona una API similar para crear relaciones entre publicaciones, términos y usuarios.

MB Relationships admite relaciones bidireccionales de forma predeterminada y usa una tabla personalizada para almacenar relaciones (como P2P) para un mejor rendimiento (que la meta meta).

Vale la pena echarle un vistazo al complemento.

    
respondido por el Anh Tran 29.01.2018 - 04:18

Lea otras preguntas en las etiquetas