¿Cómo crear una relación entre dos tipos de contenido personalizados?
Quiero construir una base de datos de series de TV usando WordPress. He seguido algunos tutoriales y tengo dos tipos de contenido personalizados: uno para movies
y otro para series
. He seguido esta publicación para la estructura.
Mi pregunta es: ¿cómo puedo crear la relación entre los tipos de contenido de películas y series?

Usando un Plugin
Algunos plugins muy buenos para 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', 'Relación de Películas', '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">Películas</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 ) {
// solo ejecutar para series
if ( 'series' != get_post_type( $post_id ) )
return $post_id;
// verificar nonce
if ( empty( $_POST['movies_nonce'] ) || !wp_verify_nonce( $_POST['movies_nonce'], basename( __FILE__ ) ) )
return $post_id;
// verificar autoguardado
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;
// verificar permisos
if ( !current_user_can( 'edit_post', $post_id ) )
return $post_id;
// guardar
update_post_meta( $post_id, '_movies', array_map( 'intval', $_POST['movies'] ) );
}
Y luego, para obtener la relación de películas como una lista para posts de series:
$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
} }

Sin crear otra publicación, ¿podemos agregar a esto cómo crear un enlace permanente a partir de esta relación padre/hijo? Por ejemplo: http://domain.com/nombre-serie/nombre-pelicula
?

@Xtremefaith esto se puede hacer con otro código. Hay un plugin que creé para categorías. Tal vez puedas usarlo como referencia. https://wordpress.org/plugins/hierarchical-urls/

Recomiendo el plugin Posts 2 Posts, que acabo de empezar a utilizar.
Permite crear relaciones de muchos a muchos entre tipos de posts y páginas, lo que significa que puedes vincular películas
con series
, y cualquier otro CPT que puedas crear.
Este plugin también te permite crear metadatos de conexión que te darán un mayor nivel de detalle al crear tus relaciones. Es bastante flexible en su uso, permitiendo control sobre metaboxes en el administrador, tipos de conexión y formas de mostrar tus relaciones en el front-end. Por último, está bien documentado.

Estaba buscando algo similar y probé varias soluciones. Tengo que decir que esta (Post 2 Post) fue perfecta, puede que no sea lo que busca alguien que no sea programador, pero si buscas más algo como una biblioteca para usar en tu plantilla, entonces esto es simplemente perfecto, bien documentado, bien integrado, ¡consíguelo! ;)

Hice un pequeño plugin para relaciones entre posts pero https://wordpress.org/plugins/softmixt-relations

Desafortunadamente, el plugin Posts 2 Posts está obsoleto y ya no se mantiene. Existe una nueva alternativa para eso: MB Relationships. Está inspirado en P2P y proporciona una API similar para crear relaciones entre entradas, términos y usuarios.
MB Relationships soporta relaciones bidireccionales por defecto y utiliza una tabla personalizada para almacenar las relaciones (como P2P) para un mejor rendimiento (que el meta de entradas).
Vale la pena echarle un vistazo al plugin.
