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

16

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 series?

CoalaArmy
fuente
En primer lugar, NO está creando una base de datos completa, solo está creando un Tipo de publicación personalizado de WordPress. Y dentro del alcance de WordPress, tiene muchas oportunidades para clasificarlas, clasificarlas, etc. Y todas se realizan con una buena relación interna. Entonces, la relación de la que estás hablando ya está ahí, solo tienes que implementarla de la manera que necesites. Por lo tanto, le sugiero que implemente post_type como se indica, y luego edite la pregunta con su consulta real.
Mayeenul Islam
@ MayeenulIslam, "implement the post_type as directed"¿qué quieres decir?
CoalaArmy
Como se indica en el enlace proporcionado , o mediante el uso de un generador simple como: este generador de tipo de publicación .
Mayeenul Islam
@MayeenulIslam: No estoy convencido de que "la relación de la que estás hablando ya esté allí". Por defecto, no existe una relación directa entre los diferentes tipos de publicaciones.
s_ha_dum
@s_ha_dum Lo siento, me perdí parte de su pregunta en la que ya dijo que tenía dos post_types. Es mi error. Estoy tratando de hacerlo aclarar con sus detalles. Extrañé que el detalle ya esté allí. :( Estoy hablando de la relación interna de la taxonomía y el tipo de publicación personalizada si está definida.
Mayeenul Islam

Respuestas:

22

Usando un complemento

Algunos muy buenos complementos 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
} }
vmassuchetto
fuente
3
¡Me gusta la idea con los metaboxes (tratando de evitar complementos)!
CoalaArmy
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/series-name/movie-name:?
Xtremefaith
@Xtremefaith esto se puede hacer con otro código. Hay un complemento que creé para las categorías. Quizás puedas usarlo como referencia. wordpress.org/plugins/hierarchical-urls
vmassuchetto
5

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

Se le permite crear muchos-a-muchos entre los postes y los tipos de páginas, lo que significa que se puede vincular moviesa series, y cualesquiera otros TTC puede crear.

Este complemento también le permite crear metadatos de conexión que le permitirán obtener detalles más precisos al crear sus conexiones. Es bastante flexible en su uso, lo que permite el control sobre metaboxes de administrador, tipos de conexión y formas de mostrar sus conexiones en el front-end. Por último, está bien documentado .

JMB
fuente
Lo echaré un vistazo.
CoalaArmy
Estaba buscando algo. similares y probamos varias soluciones. Tengo que decir que este (Post 2 Post) fue perfecto, podría no ser lo que un 'no programador' estaría buscando, pero si está buscando algo más. como una biblioteca para usar en su plantilla, que esto es perfecto, bien documentado, bien integrado, ¡consígalo! ;)
Larzan
Hice un pequeño complemento para las relaciones posteriores, pero wordpress.org/plugins/softmixt-relations
Softmixt
2

Desafortunadamente, el complemento Posts 2 Posts está en desuso y ya no se mantiene. Hay un nuevo complemento alternativo para esas relaciones MB . 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 utiliza una tabla personalizada para almacenar relaciones (como P2P) para un mejor rendimiento (que post meta).

Vale la pena echarle un vistazo al complemento.

Anh Tran
fuente