如何在两种自定义帖子类型之间创建关系?


16

我想使用WordPress建立电视连续剧数据库。我遵循了一些教程,并且有两种自定义帖子类型:一种用于movies,一种用于和series。我按照这篇文章的结构

我的问题是:如何确定电影和系列文章类型之间的关系?


首先,您不是在创建整个数据库,而是在创建WordPress的“自定义帖子类型”。在WordPress范围内,您有很多机会对它们进行分类,排序等。所有这些工作都是通过良好的内部关系完成的。因此,您正在谈论的关系已经存在,您只需要按照所需的方式来实现它即可。因此,我建议您按照指示实施post_type,然后使用实际查询编辑问题。
Mayeenul Islam 2014年

@MayeenulIslam,"implement the post_type as directed"你是什​​么意思?
CoalaArmy 2014年

按照您提供的链接线程中的指示,或使用简单的生成器(例如:Post Type Generator)
Mayeenul Islam 2014年

@MayeenulIslam:我不相信“您正在谈论的关系已经存在”。默认情况下,不同帖子类型之间没有直接关系。
s_ha_dum 2014年

@s_ha_dum对不起,我错过了他的问题的一部分,他已经说过他有两种post_type。是我的错 我试图让他澄清他的细节。我错过了细节。:(我正在谈论分类法和自定义帖子类型的内部关系,如果已定义
。– Mayeenul Islam 2014年

Answers:


22

使用插件

一些非常好的关系插件:

使用元框

您可以使用元框建立简单的关系:

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

}

然后,将电影关系作为系列文章的列表:

$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
} }

3
我喜欢元框的想法(尽量避免使用插件)!
CoalaArmy 2014年

在不创建其他帖子的情况下,我们可以在此基础上添加如何从该父/子关系创建永久链接的方法吗?例如:http://domain.com/series-name/movie-name
Xtremefaith 2015年

@Xtremefaith这可以用其他代码来完成。我为类别创建了一个插件。也许您可以用作参考。wordpress.org/plugins/hierarchical-urls
vmassuchetto

5

我推荐我刚刚开始使用的Posts 2 Posts插件。

它允许您在帖子和页面类型之间创建多对多关系,这意味着您可以链接moviesseries和可能创建的任何其他CPT。

该插件还允许您创建连接元数据,该元数据将使您在创建连接时获得更详细的信息。它的用法非常灵活,允许控制管理元框,连接类型以及在前端显示连接的方式。最后,它有据可查


我来看一下。
CoalaArmy 2014年

我正在寻找某物。类似,并尝试了各种解决方案。我不得不说,这个(Post 2 Post)是完美的,它可能不是“非程序员”想要的东西,但是如果您正在寻找更多东西的话。就像要在模板中使用的库一样,这不只是完美的,文档齐全的,集成的,还可以!;)
Larzan 2014年

我为帖子关系做了一个小插件,但wordpress.org/plugins/softmixt-relations
Softmixt

2

不幸的是,Posts 2 Posts插件已被弃用,不再维护。该MB Relationships有一个新的替代插件。它受到P2P的启发,并提供类似的API在帖子,术语和用户之间创建关系。

MB关系默认情况下支持双向关系,并使用自定义表存储关系(如P2P)以获得更好的性能(比发布元数据更好)。

值得一看插件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.