web-dev-qa-db-ja.com

connected_items配列を使用したposts2postsクエリの問題

私の設定は以下の通りです

私は 'events'という名前のカスタム投稿タイプと 'genres'という名前のカスタム投稿タイプを持っています。これらはscribuのPosts2Postsプラグインとリンクしています。各イベントには複数のジャンルを関連付けることができます。

やりたいこと

イベントページで、現在のイベントのジャンルに基づいて関連する他のイベントを表示します。

私がすべきだと思うこと

  1. 現在のイベントのすべてのジャンルIDを取得するクエリを実行します
  2. これらのIDを2つ目のクエリで渡し、1つ以上のジャンルがリンクされているすべてのイベントを見つけます。

私はconnected_itemsで与えられたジャンルの1つのAND/OR moreを持つすべてのイベントを出力したいP2Pクエリを持っています。ドキュメントと同じように、それらを配列として渡します。

私の結果を説明するために、それを言うことができます

  • event1はジャンルを投稿ID 1240、1241、1242、および1250とリンクさせています。
  • event2はジャンルを投稿ID 1240、1241、および1260とリンクさせています。
  • event3はジャンルを投稿ID 1241および1242にリンクさせています

最初のクエリで、すべてのジャンルIDを取得しましたが、これは機能します。

与えられたジャンルのすべてのイベントを取得する2番目のクエリ(それらを配列として渡します):

$args = array(
        'connected_type' => 'genres_to_events',
        'connected_items' => array(1240,1241,1242),
        'post_status' => 'publish',
        'posts_per_page' => -1,
    );

$query = new WP_Query($args);

問題は、出力が配列内の各接続をチェックすることです。したがって、クエリの出力は次のようになります。

  • イベント1
  • イベント1
  • イベント1
  • イベント2
  • イベント2
  • イベント3
  • イベント3

ただし、1つ以上のジャンルが関連付けられているかどうかに基づいて、各イベントを1回ずつ出力します。私はこれがドキュメンテーションで説明されているとは思わない、何か考え?

3
eskimo

ああ、わかったと思います。私はあなたがあなたの最初のループですべきことはあなたが言うようにコネクテッドジャンルを得ることであると思います。それから、それらに関連するすべてのイベントを取得したいので、ループ内でIDだけを集めて(1つの配列に集めて)、array_unique()を使ってすべての重複を取り除きます。このクリーンな配列をループに入れて、それらの投稿だけを取得します。理にかなって?

だから、このような何かがうまくいくかもしれません:

$args = array(
        'connected_type' => 'genres_to_events',
        'connected_items' => array(1240,1241,1242),
        'post_status' => 'publish',
        'posts_per_page' => -1,
    );

$query = new WP_Query($args);

$connected_out = array();

while($query->have_posts()) : $query->the_post();
    $connected_out[] = $post->ID;
endwhile;

$connected_out = array_unique($connected_out);
wp_reset_query();

$args = array(
    'post__in' => $connected_out;
);

$query = new WP_Query($args);
// go!
0
GhostToast

これは部分的なものであり、コメントに含まれている以上の文字が必要なため、これを回答として投稿しています。大丈夫だと思います:-)。

だから私は this post を読んだ後にposts_per_page問題を見つけました。

get_related関数に引数を渡すことは可能ですが、p2pコアを修正しなければならないようです。私がしたのはget_relatedという名前の私自身のmy_get_related関数を追加することでした。

コードは以下のとおりです。

public function my_get_related( $item, $extra_qv = array(), $output = 'raw' ) {
        $extra_qv['fields'] = 'ids';

        $connected = $this->get_connected( $item, $extra_qv, 'abstract' );

        $additional_qv = array( 'p2p:exclude' => _p2p_normalize( $item ), 'posts_per_page' => -1 );

        return $this->flip_direction()->get_connected( $connected->items, $additional_qv, $output );
    }

これをwp-content/plugins/posts-to-posts/core/directed-connection-type.phpに追加しました(オリジナルのget_related関数は94行目にあります)。

'posts_per_page'引数が追加されているのを見ることができます、それらをコンマで区切ることによってもっと簡単に追加することができます。

今、私はまだ1つ質問があります:どうやってp2pコアファイルの外側でこの関数を宣言するのですか?プラグインを更新するときに失敗する可能性があるので、ここには追加したくありません。それをfunctions.phpに追加したいのですが(Rootsテーマを使ってfunctions.php以外のファイルに入れますが、そこに入れるのはインクルードファイルなので同じです。 functions.phpの。

public function my_get_related...add_action('p2p_init', 'my_get_related')を試してみましたが、うまくいきません。

この機能をコアの外側に追加する方法について何かアイデアはありますか?

私はその後、問題がようやく解決したと思います:-)

0
eskimo