異なるCPTを接続するにはどうすればよいですか?


11

この質問がここにあることを願っています。

カスタム分類の使い方の一般的なチュートリアルの例(本/著者/タイトル、映画/俳優/監督など)のように、異なるカスタム投稿タイプを一緒に接続することはかなり一般的なニーズであるといつも思っていました。個人的には「投稿2件」を使っていますが、サポートが止まりました。

Googleで最も関連性の高い結果は、現在このプラグインを指しています。どのような長期的な選択肢がありますか?P2Pプラグインが完成した場合、経験豊富なWordPress Web開発者は、WordPressを使用して本/著者/タイトル管理システムを今日設計するために何を使用しますか?


カスタム投稿タイプを作成するためにどのコードを使用しましたか?あなたは、このコード使用してカスタム分類の種類を作成するためのサポートを追加することができますwordpress.stackexchange.com/a/128544/9884を
ブラッド・ダルトン

1
非常に多くの人々がまだp2pを使用していると思うので、誰かがgithubでフォークしてメンテナンスするだけですぐに失敗することはありません。ただし、サポートが中止された場合、それはscribuが何か新しいことに取り組んでいるか、機能がコアに組み込まれている可能性があることを意味します。使わない理由とは思わない。
sanchothefat 2014年

1
サンチョはよくわかりません。P2PのWPプラグインページでのダウンロードは55,000しかなく、思っていたよりもはるかに人気がありません。また、CPTを接続することは非常に基本的で一般的なニーズのように聞こえるので、なぜだかわかりません。基本的なものだけに対処するプラグインで、ダウンロード数が55,000に過ぎないのはどうしてですか?それは私を超えています。唯一の説明は、それに対処するための別の良い方法があるため、私の質問です。
drake035 2014年

3
このプラグインを引き続き使用でき、プラグインが何らかの理由で失敗した場合は、リポジトリをフォークして自分で維持できます。github.com / scribu / wp-posts-to-posts.gitリポジトリからの引用:If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay

4
WordPressのHABTMは本当に興味深いと思うので、この質問に賛成してスターを付けました。とは言っても、プラグインが消えてしまうのを心配する必要はないでしょう。また、一部のWPプラグインは300000ダウンロードまたはその他のものを持っているかもしれませんが、多くはgithubに472つ星を持っています。それを維持するために、それは数えられる数です!
2014年

回答:


13

プログラマーとして、自分の投稿タイプを接続するための独自のコードを書き始めました。簡単な方法ではありませんし、簡単でもありませんが、とても楽しいです。

投稿タイプ

我々は2つの単純なポストタイプを作成することから始め、AuthorそしてBooks

add_action('init', 'p2p2_register_author');
add_action('init', 'p2p2_register_book');

function p2p2_register_author(){
    $labels = array(
        'name'               => 'Author',
        'singular_name'      => 'Author',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Author',
        'edit_item'          => 'Edit Author',
        'new_item'           => 'New Author',
        'all_items'          => 'All Authors',
        'view_item'          => 'View Authors',
        'search_items'       => 'Search Authors',
        'not_found'          => 'No authors found',
        'not_found_in_trash' => 'No authors found in Trash',
        'parent_item_colon'  => '',
        'menu_name'          => 'Authors'
    );

    register_post_type(
        'Author',
        array (
            'labels'             => $labels,
            'public'             => true,
            'publicly_queryable' => true,
            'show_ui'            => true,
            'show_in_menu'       => true,
            'query_var'          => true,
            'rewrite'            => array( 'slug' => 'author' ),
            'capability_type'    => 'post',
            'has_archive'        => true,
            'hierarchical'       => false,
            'menu_position'      => null,
            'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
        )
    );
}
function p2p2_register_book(){
    $labels = array(
        'name'               => 'Books',
        'singular_name'      => 'Book',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Book',
        'edit_item'          => 'Edit Book',
        'new_item'           => 'New Book',
        'all_items'          => 'All Books',
        'view_item'          => 'View Book',
        'search_items'       => 'Search Books',
        'not_found'          => 'No books found',
        'not_found_in_trash' => 'No books found in Trash',
        'parent_item_colon'  => '',
        'menu_name'          => 'Books'
    );

    register_post_type(
        'Book',
        array (
            'labels'             => $labels,
            'public'             => true,
            'publicly_queryable' => true,
            'show_ui'            => true,
            'show_in_menu'       => true,
            'query_var'          => true,
            'rewrite'            => array( 'slug' => 'book' ),
            'capability_type'    => 'post',
            'has_archive'        => true,
            'hierarchical'       => false,
            'menu_position'      => null,
            'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
        )
    );
}

そこには派手なものは何もありません。実際、それはコーデックスからです!

メタボックス

続いて、著者のメタボックスを本の投稿タイプに追加します。

add_action('admin_init', 'p2p2_add_author_metabox');

function p2p2_add_author_metabox(){
    add_meta_box( 
        'book_author', 
        __('Book Author', 'bandpress'), 
        'p2p2_book_author_metabox', 
        'book', 
        'side', 
        'default', 
        array( 'id' => 'p2p2_author') 
    );
}

ここp2p2_book_author_metaboxでは、メタボックス内にあるコールバック関数を確認できます。

メタボックスの内容

関数を作成しましょう:

function p2p2_book_author_metabox($post, $args){
    wp_nonce_field( plugin_basename( __FILE__ ), 'p2p2_book_author_nonce' );
    $author_id = get_post_meta($post->ID, 'p2p2_book_author', true);

    echo "<p>Select the author of the book</p>";
    echo "<select id='p2p2_book_author' name='p2p2_book_author'>";
    // Query the authors here
    $query = new WP_Query( 'post_type=author' );
    while ( $query->have_posts() ) {
        $query->the_post();
        $id = get_the_ID();
        $selected = "";

        if($id == $author_id){
            $selected = ' selected="selected"';
        }
        echo '<option' . $selected . ' value=' . $id . '>' . get_the_title() . '</option>';
    }
    echo "</select>";
}

ここで魔法が起こります。まず、データベースに作成者を照会し、次にa <select>に照会結果を入力します。についての詳細はコーデックスを確認してくださいWP_Query。これで、本の投稿タイプに移動して、ドロップダウンを確認できます。

私たちのドロップダウン

コンテンツを保存する

もちろん、選択を保存したいので、メタボックスを保存する別の関数を追加します。

add_action('save_post', 'p2p2_save_author_metabox', 1, 2);

function p2p2_save_author_metabox($post_id, $post){
    // Don't wanna save this now, right?
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;
    if ( !isset( $_POST['p2p2_book_author_nonce'] ) )
        return;
    if ( !wp_verify_nonce( $_POST['p2p2_book_author_nonce'], plugin_basename( __FILE__ ) ) )
        return;

    // We do want to save? Ok!
    $key = 'p2p2_book_author';
    $value = $_POST["p2p2_book_author"];
    if ( get_post_meta( $post->ID, $key, FALSE ) ) { // If the custom field already has a value
        update_post_meta( $post->ID, $key, $value );
    } else { // If the custom field doesn't have a value
        add_post_meta( $post->ID, $key, $value );
    }
    if ( !$value ) delete_post_meta( $post->ID, $key ); // Delete if blank
}

次に、著者と一緒に本を保存します。本の著者はwp_postmetaデータベーステーブルに保存され、ドロップダウンの選択された値はメタの値になります。

本の著者コラム

本の管理領域を拡大しましょう。まず、列を変更します。

add_filter('manage_edit-book_columns', 'p2p2_add_book_columns');

function p2p2_add_book_columns($columns){
    $new_columns['cb'] = '<input type="checkbox" />';

    $new_columns['title'] = _x('Title', 'column name', 'bandpress');

    $new_columns['p2p2_author'] = __('Author', 'bandpress');

    return $new_columns;
}

この関数により、title列とp2p2_author列のみが表示されるようになります。WordPressの一括編集機能には、cbチェックボックス列が必要です。次に、いくつかの情報を列に追加する必要があります。次の関数を追加します。

add_action('manage_book_posts_custom_column', 'p2p2_fill_book_columns', 10, 2);

function p2p2_fill_book_columns($column_name, $id) {
    global $wpdb;
    switch ($column_name) {
        case 'p2p2_author':
            $author_id = get_post_meta($id, 'p2p2_book_author', true);
            $author = get_post($author_id);
            $permalink = get_permalink($author_id);
            echo "<a href='" . $permalink . "'>" . $author->post_title . "</a>";
            break;
        default:
            break;
    } // end switch
}

スイッチは、前の関数で追加したすべての列にあります。あなたが見せたいものをエコーすることによってそれを埋めます。私たちは本の著者である投稿を取得し、彼/彼女の「プロフィールページ」への素晴らしいパーマリンクを作成します。これは次のようになります。

著者コラム

つづく

WordPressサイトのバックエンドで2つの投稿タイプを接続しましたが、フロントエンドではそれを確認できません。これを達成するにはさらに多くの作業が必要になりますが、可能性はいくぶん無限です。我々は出来た:

  1. 著者別に本を並べ替え
  2. 著者のページに本のリストを表示する
  3. 本のページに著者の他の本のリストを表示する
  4. 著者の写真を使用して、派手なメタボックスを作成します
  5. 彼/彼女が書いた本の著者管理ページに列を作成する
  6. そしてもっとたくさん...

この解決策は自分で必要なので、私はこの答えに取り組んでいきます。しかし、私は今のところ作業をやめます。この回答は明日更新します。


素晴らしい返信を共有していただきありがとうございます。著者が書いた本のリストをどのように表示しますか?
ウィリアム

4

2人の優れた開発者がサポートを続けることを申し出たので、あまり心配しません。ただし、他のものを使用する場合は、ACF関係フィールドを確認してください。


ローンリンクとプラグインの推奨事項は、質の低い回答と見なされます。理由は単純です。リンクが失われた場合、答え(およびこのサイト)はリンクの腐敗の影響を受けます。
カイザー2014

3
リンクフリーソリューションも時間の経過とともに廃止される可能性があり、一部の人々はこれらの廃止されたソリューションを実装しようとして時間を無駄にして、機能しないことを知らない場合があるため、これはデッドリンクよりも最悪です。さらに、ACFとそのWebサイトは、非常に長期間続く可能性があります。最後に、この素​​晴らしい代替案について多くのビョルンに感謝します。
drake035 14年

2

元の質問は「P2Pがなくなったらどうしますか?」考え/提案があります。プラグインを作成している場合、ユーザーに別のプラグインをインストールするように指示することが常に実行できるとは限らないので、私は実際に必要でした。

簡単な方法の1つは、Post Metaを使用することです。例えば。Authorのpost_metaに、本を保存できます。一意のエントリ、単一のコンマ区切りのエントリ、またはシリアル化された配列のいずれか。次に、本に著者の逆の情報を保存します。

もう1つは、関係とその他の関連情報を格納する新しいDBテーブル(眉をひそめている)を追加することです。

どちらのソリューションがどれほど効率的であるかはわかりませんが、機能します。

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