¿Cómo crear una relación entre dos tipos de contenido personalizados?

5 ene 2014, 14:30:56
Vistas: 49.3K
Votos: 19

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?

5
Comentarios

En primer lugar, NO estás creando una base de datos completa, solo estás creando un Custom Post Type de WordPress. Y dentro del alcance de WordPress tienes muchas oportunidades para categorizarlos, ordenarlos, etc. Y todo esto se hace con una buena relación interna. Así que la relación de la que hablas ya está ahí, solo tienes que implementarla de la manera que necesites. Por lo tanto, te sugiero que implementes el post_type como se indica y luego edites la pregunta con tu consulta real.

Mayeenul Islam Mayeenul Islam
5 ene 2014 14:53:29

@MayeenulIslam, "implement the post_type as directed" ¿qué quieres decir?

CoalaArmy CoalaArmy
5 ene 2014 14:59:34

Como se indica en el hilo que proporcionaste, o usando un generador simple como: este generador de Post Type.

Mayeenul Islam Mayeenul Islam
5 ene 2014 15:03:47

@MayeenulIslam : No estoy convencido de que "la relación de la que hablas ya esté ahí". Por defecto, no hay una relación directa entre diferentes tipos de entradas.

s_ha_dum s_ha_dum
5 ene 2014 17:07:52

@s_ha_dum Lo siento, me perdí una parte de su pregunta donde ya mencionaba que tenía dos post_types. Es mi error. Estaba intentando que aclarara los detalles. No me di cuenta de que los detalles ya estaban ahí. :( Estaba hablando de la relación interna entre taxonomía y tipo de entrada personalizado si está definida.

Mayeenul Islam Mayeenul Islam
5 ene 2014 17:52:11
Todas las respuestas a la pregunta 3
3
30

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
} }
5 ene 2014 15:02:12
Comentarios

Me gusta la idea con los metaboxes (¡intentando evitar plugins)!

CoalaArmy CoalaArmy
5 ene 2014 15:16:18

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 Xtremefaith
8 abr 2015 08:23:14

@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/

vmassuchetto vmassuchetto
7 ago 2016 14:38:47
3

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.

5 ene 2014 14:55:45
Comentarios

Lo revisaré.

CoalaArmy CoalaArmy
5 ene 2014 14:58:19

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! ;)

Larzan Larzan
18 dic 2014 19:59:55

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

Softmixt Softmixt
4 jul 2017 10:37:46
0

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.

29 ene 2018 05:18:10