web-dev-qa-db-ja.com

複数のコンテンツタイプ間の関係を作成する

私は組み込みのものに加えて複数のコンテンツタイプがあるサイトで作業しています(下記のリストを見てください)。私は、どんな種類のコンテンツから他の種類のコンテンツにも、あらゆる方向に関連するコンテンツをマークする機能を確立したいと思います。

コンテンツタイプは次のとおりです。

  • post
  • page
  • topic(bbpressから)
  • case(これ以降のカスタムタイプ)
  • note
  • question
  • therapy_guideline

以下に、投稿から他のコンテンツタイプへの可能な接続を設定するために使用したfunctions.phpのコードを示します。

p2p_register_connection_type(
    array(
        'name' => 'post-to-post',
        'from' => 'post',
        'to' => 'post'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-page',
        'from' => 'post',
        'to' => 'page'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-topic',
        'from' => 'post',
        'to' => 'topic'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-case',
        'from' => 'post',
        'to' => 'case'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-note',
        'from' => 'post',
        'to' => 'note'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-question',
        'from' => 'post',
        'to' => 'question'
    )
);

p2p_register_connection_type(
    array(
        'name' => 'post-to-therapy_guideline',
        'from' => 'post',
        'to' => 'therapy_guideline'
    )
);

投稿から他のコンテンツタイプへの関係を確立するためだけのものです。私はこれらの呪文を繰り返して他のさまざまな接続を確立しました - 合計28個。私は繰り返しにしがみついた。さらにコンテンツタイプを追加したり、他のタイプのすべて(またはほとんど)に接続できるようにする必要がある場合、これは非常に厄介になる可能性があります。

私は、これらの各コンテンツタイプを繰り返し処理して他のタイプへの接続を生成するためにループを使用することができると思いましたが、それは正しくありません。 reciprocal の値についても読んだことがありますが、これはコンテンツタイプから同じタイプに戻ってきたようです。それぞれの方向(fromとto)にそれを行わなくても、異なるコンテンツタイプ間の接続を簡単に作成する方法はありますか?

私の意図は、コンテンツの作成/編集時にバックエンドを介して、現在のコンテンツに関連した関連コンテンツの選択を容易にすることです。次に、現在のコンテンツの表示に続いて「関連コンテンツ」セクションを表示します。これらの関連コンテンツは、使用中のさまざまなコンテンツタイプにまたがる可能性がありますが、最大限の関連性を確保するために手動で選択されます。

これらのコンテンツタイプでカスタム分類法を使用しており、関連するコンテンツを見つけるためにそれを使用することを検討していましたが、分類法はまだ広すぎます。手動による選択が有効な方法のようです。

4
Grant Palin

しないでください...

$my_post_types = array(
    'post', 
    'page', 
    'topic', 
    'case', 
    'note', 
    'question', 
    'therapy_guideline'
);

p2p_register_connection_type( array(
    'name' => 'my_post_relationships',
    'from' => $my_post_types,
    'to' => $my_post_types,
    'sortable' => 'any',
    'reciprocal' => false,
    'cardinality' => 'many-to-many',
    'title' => array(
        'from' => 'Children',
        'to' => 'Parent',
        ),
    'admin_column' => 'any',
    )
);

それとも似たようなもの?

編集する

前述の配列を使用して、入力しなくても複数のボックスを取得できる可能性があります。

foreach($my_post_types as $post_type){
    // use line below if you don't ever need to relate posts to posts, pages to pages, etc.
    $temp_array = array_diff($my_post_types, array($post_type));

    p2p_register_connection_type( array(
        'name' => 'my_'.$post_type.'_connections',
        'from' => $temp_array, // use $my_post_types if you didn't define $temp_array
        'to' => $post_type,
        'sortable' => 'any',
        'reciprocal' => false,
        'cardinality' => 'many-to-many',
        'admin_column' => 'any',
        )
    )
}

Temp配列により、各投稿タイプは他のすべての投稿タイプに関連付けられますが、それ自体は関連付けられません。それがあなたが望むものかそうでないものかどうかわからない、削除するのに十分簡単。

6
GhostToast

GhostToastはあなたの問題に繰り返し答えているようです。

あなたの特定の状況のた​​めにこれを実装することは関連した内容を示すべきです: https://github.com/scribu/wp-posts-to-posts/wiki/Related-posts

$ related = p2p_type( 'posts_to_pages') - > get_related(get_queried_object());

唯一の違いは、get_connected()をget_related()に置き換えたことです。

手動で特定のコンテンツを見つけるために、これは過去において私にとって有用であると証明されました: http://wordpress.org/plugins/better-internal-link-search/ /

3
128KB

そのための最善の方法は、関連付けが必要なさまざまな投稿タイプ間で共有される非階層的分類法を登録することです。

その後、WPに組み込まれている分類法のクエリを使用して、関連するすべてのコンテンツを任意の用語で取得できます。一般的な経験則として、フィールドで照会することはDBでははるかに重いため、照会するものはすべてフィールドではなく分類法にする必要があります。

1
Chris Cox

私にとっての実際の質問は、関係情報を何のために、どのように使用するのかということです。どこに表示されますか、またはビジネスロジックを追加するために必要ですか?

私の知る限り、この中核機能を使用する方法はありません。

過去にプラグインなしでこのようなことを達成したい場合、投稿タイプ間の関係情報を保存するための分類法を自動的に追加するカスタムPHPを作成しました。 post_metaを使用するよりも追加の分類法を使用する主な利点は、関係情報に基づいてコンテンツをより簡単にクエリおよびアクセスできることです。

プラグインのオーバーヘッドが目的の機能で問題ない場合は、 Advanced Custom Fields (リレーショナルまたはポストオブジェクトフィールドタイプ)を使用しました。 post_metaを使用して関係を保存します)。

1
s1lv3r

もしあなたがカスタム投稿タイプ間の関係を作りたいのなら、plugin _ types _ を使うことができます。このプラグインを使用すると、カスタム投稿タイプを作成し、親または子の関係のようにそれらの間の関係を設定することもできます。

もう1つの方法として、post_metaテーブルにリレーション値を保存して、リレーション情報に基づいてコンテンツをより簡単にクエリしてアクセスできるようにすることができます。

0
ksr89

これ以上、もっと複雑なものが必要ですか?

enter image description here

それは単なるプロトタイプの例です。 therapy_guidelineには、surgical_therapy_guidelineconservative_therapy_guidelinepalliative_therapy_guidelineなどがあります。

複雑にしても、実際に作成できます。あなたは実際にそのWebサイトにSemantic Webを実装する必要があります。セマンティクスを作成する最も簡単な方法は、RDFaデータを使用することです。 Enhanced Publication Plugin を使うことができます。 セマンティックウェブを作成するための多くの無料のリソースがあります 。 Apache StanbolとOpen Refineを使用することができます(Google Projectで検索)。何を使用するかは、考えられるクエリの大部分、データベースのスケーラビリティ、そして明らかにあなたの知識によって異なります。 Enhanced Publication PluginはWordPressのMySQLデータベースに少しずつ小さなデータを追加します(MySQLiでさえありません)。 WordPressとPluginを併用したい場合は、nginxサーバでPostgreSQLに変換したほうがよいでしょう。

明らかに、RDFa、JSON、またはAPIをApache Stanbolと共に使用し、それをPHPまたはWordPressのカスタムフックと共に使用することができます。プラグインを作成したい場合は、もう1つのRelated Post Pluginのフレームワークを使用できます。

0