Come creare una relazione tra due tipi di post personalizzati?
Voglio costruire un database di serie TV utilizzando WordPress. Ho seguito alcuni tutorial e ho due tipi di post personalizzati: uno per movies
e uno per series
. Ho seguito questo post per la struttura.
La mia domanda è: come posso creare la relazione tra i tipi di post movies e series?

Utilizzo di un Plugin
Alcuni ottimi plugin per gestire le relazioni:
Utilizzo di un Metabox
Puoi creare una semplice relazione utilizzando i metabox:
add_action( 'admin_init', 'add_meta_boxes' );
function add_meta_boxes() {
add_meta_box( 'some_metabox', 'Relazione Film', '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">Film</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 ) {
// esegui solo per i post di tipo series
if ( 'series' != get_post_type( $post_id ) )
return $post_id;
// verifica il nonce
if ( empty( $_POST['movies_nonce'] ) || !wp_verify_nonce( $_POST['movies_nonce'], basename( __FILE__ ) ) )
return $post_id;
// controlla l'autosalvataggio
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;
// controlla i permessi
if ( !current_user_can( 'edit_post', $post_id ) )
return $post_id;
// salva
update_post_meta( $post_id, '_movies', array_map( 'intval', $_POST['movies'] ) );
}
E poi, per ottenere la relazione dei film come lista per i post di tipo 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
} }

Senza creare un altro post, possiamo aggiungere qui come creare un permalink da questa relazione genitore/figlio? Ad esempio: http://domain.com/nome-serie/nome-film
?

@Xtremefaith questo può essere fatto con altro codice. C'è un plugin che ho creato per le categorie. Forse puoi usarlo come riferimento. https://wordpress.org/plugins/hierarchical-urls/

Consiglio il plugin Posts 2 Posts, che ho appena iniziato a utilizzare.
Ti permette di creare relazioni molti-a-molti tra post e tipi di pagina, il che significa che puoi collegare movies
a series
, e qualsiasi altro CPT (Custom Post Type) che potresti creare.
Questo plugin ti consente anche di creare metadati di connessione che ti permetteranno di ottenere maggiori dettagli quando crei le tue connessioni. È abbastanza flessibile nel suo utilizzo, consentendo il controllo su metabox nell'amministrazione, tipi di connessione e modi per visualizzare le tue connessioni sul front end. Infine, è ben documentato.

Stavo cercando qualcosa di simile e ho provato varie soluzioni. Devo dire che questa (Post 2 Post) era perfetta, potrebbe non essere ciò che un 'non-programmatore' cercherebbe, ma se stai cercando più qualcosa come una libreria da usare nel tuo template, allora è semplicemente perfetta, ben documentata, ben integrata, prendila! ;)

Ho creato un piccolo plugin per le relazioni tra post ma https://wordpress.org/plugins/softmixt-relations

Sfortunatamente, il plugin Posts 2 Posts è deprecato e non più mantenuto. Esiste una nuova alternativa per questo scopo: MB Relationships. È ispirato a P2P e fornisce un'API simile per creare relazioni tra articoli, termini e utenti.
MB Relationships supporta relazioni bidirezionali per impostazione predefinita e utilizza una tabella personalizzata per memorizzare le relazioni (come P2P) per una migliore performance (rispetto ai post meta).
Vale la pena dare un'occhiata a questo plugin.
