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

时间:2014-01-05 作者:CoalaArmy

我想用WordPress建立一个电视剧数据库。我已经学习了一些教程,我有两种自定义帖子类型:一种用于movies, 一个用于和series. 我跟着this post for the structure.

我的问题是:我该如何处理电影和连续剧帖子类型之间的关系?

3 个回复
最合适的回答,由SO网友:vmassuchetto 整理而成

使用插件建立关系的一些非常好的插件:

  • ACF Relationship Field
  • Posts-2-Posts
    • 使用元盒可以使用元盒建立简单的关系:

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

SO网友:JMB

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

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

此插件还允许您创建connection metadata 这将允许您在创建连接时获得更详细的信息。它的使用非常灵活,允许控制管理元盒、连接类型以及在前端显示连接的方式。最后,它是well-documented.

SO网友:Anh Tran

不幸的是,Posts 2 Posts插件已被弃用,不再维护。有一个新的替代插件MB Relationships. 它的灵感来自P2P,并提供了类似的API来创建帖子、术语和用户之间的关系。

MB Relationships默认支持双向关系,并使用自定义表存储关系(如P2P),以获得更好的性能(比post meta)。

值得一看这个插件。

结束

相关推荐