2つのカスタム投稿タイプ間の関係を作成するにはどうすればよいですか?


16

WordPressを使用してTVシリーズデータベースを構築したい。私はいくつかのチュートリアルに従いました。2つのカスタム投稿タイプmoviesがありseriesます。構造についてはこの投稿に続きました

私の質問は、映画とシリーズの投稿タイプとの関係をどのように作成すればよいですか?


まず、データベース全体を作成するのではなく、WordPressのカスタム投稿タイプを作成するだけです。また、WordPressの範囲内では、それらを分類したり、並べ替えたりする多くの機会があります。そして、それらはすべて、良い内部関係で行われます。ですから、あなたが話している関係はすでにそこにあります。あなたは必要な方法でそれを実装するだけです。したがって、指示どおりにpost_typeを実装し、実際のクエリで質問を編集することをお勧めします。
Mayeenulイスラム14年

@MayeenulIslam、"implement the post_type as directed"どういう意味ですか?
CoalaArmy 14年

提供されたリンクスレッドで指示されているように、または次のような単純なジェネレーターを使用して:このPost Type Generator
Mayeenulイスラム14年

@MayeenulIslam:「あなたが話している関係はすでにそこにある」とは確信していません。デフォルトでは、異なる投稿タイプの間に直接の関係はありません。
s_ha_dum 14年

@s_ha_dum申し訳ありませんが、彼が2つのpost_typeを持っていると既に言っていた彼の質問の一部を見逃しました。それは私の間違いです。私は彼に彼の詳細を明確にしようとしています。詳細がすでにそこにあることを逃しました。:(定義されている場合、分類法とカスタム投稿タイプの内部関係について話している。
Mayeenul Islam 14年

回答:


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 14年

別の投稿を作成せずに、この親子関係からパーマリンクを作成する方法を追加できますか?例:http://domain.com/series-name/movie-name
エクストリームフェイス

@Xtremefaithこれは他のコードで実行できます。カテゴリ用に作成したプラグインがあります。たぶん、あなたは参照として使うことができます。wordpress.org/plugins/hierarchical-urls
vmassuchetto

5

使用を開始したばかりのPosts 2 Postsプラグインをお勧めします。

これにより、投稿とページタイプの間に多対多の関係を作成できます。つまり、にリンクしmoviesたりseries、作成する他のCPTにリンクしたりできます。

このプラグインを使用すると、接続メタデータを作成することもできます。これにより、接続の作成時に詳細を取得できます。使い方は非常に柔軟で、管理メタボックス、接続タイプ、およびフロントエンドでの接続の表示方法を制御できます。最後に、十分に文書化されています


それを見てみましょう。
CoalaArmy 14年

私はsthを探していました。同様のさまざまなソリューションを試しました。私はこの1つ(ポスト2ポスト)が完璧だったと言わざるを得ません。「非プログラマ」が探しているものではないかもしれませんが、sthをもっと探しているなら。テンプレートで使用するライブラリのように、これは完璧で、十分に文書化され、十分に統合されているので、入手してください!;)
ラルザン14

私は投稿関係用の小さなプラグインを作成しましたが、wordpress.org
plugins / softmixt

2

残念ながら、Posts 2 Postsプラグインは非推奨であり、メンテナンスされていません。そのMB関係の新しい代替プラグインがあります。P2Pに触発され、同様のAPIを提供して、投稿、用語、ユーザー間の関係を作成します。

MBリレーションシップは、デフォルトで双方向リレーションシップをサポートし、カスタムテーブルを使用してリレーションシップ(P2Pなど)を格納し、パフォーマンスを向上させます(ポストメタよりも)。

プラグインを見てみる価値があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.