web-dev-qa-db-ja.com

Posts2Postsの「parse_query」または「pre_get_post」でWP_Queryを使用する

UPDATE

このフックは(post__inのような) "古典的な" Wordpressフィルタで動作しているので、おそらくPosts2Postsの問題です。誰かが何かアイデアを持っている場合、私はまだ提案を探しています。

オリジナルPOST

私はすべての投稿をアーカイブページのissue numberで表示させようとしています。課題はカスタム投稿タイプです(post2postとリンクされているので、私はparse_queryの代わりにpre_get_postを使用します)

<?php

function categories_by_issue ($query) {

    if (! $query->is_category() || ! $query->is_main_query()) return;

    $query->set( 'connected_type', 'issue_to_posts');
    $query->set( 'connected_items', 71); // 71 needs to be dynamic
    $query->set( 'nopaging', true);
}

add_action('parse_query', 'categories_by_issue');
?>

このアクションフックはうまく機能します。問題は次のとおりです。別のクエリでissue IDを取得する必要があります。 (IDと号の番号はもちろん異なります。私の '#3'号のIDは '71'です)

私は自分のフックにWP_Queryを追加しようとしましたが、それは基本的に全部を壊します。発行番号を取得できますが、メインのクエリでようやくすべての投稿が表示されます。

<?php

function categories_by_issue ($query) {

    if (! $query->is_category() || ! $query->is_main_query()) return;

    $issues = new WP_Query ( /* ... */);
    $issue_id = $issues->get_posts()[0]->ID;
    var_dump($issue_id); // -> 71 : My ID is correct

    $query->set( 'connected_type', 'issue_to_posts');
    $query->set( 'connected_items', $issue_id);
    $query->set( 'nopaging', true);

}

add_action('parse_query', 'categories_by_issue');
?>

理想的には直接SQLリクエストを伴わずにフックに情報をリクエストする方法はありますか?

1
Jérémie

私はこの問題を解決することができませんでしたが、回避策を見つけました:parse_requestフックで私のissue IDを得て、それをparse_queryで使用します($ issue_id変数でクラスを作成しました、しかしグローバル変数も大丈夫です)。

それでもなぜあなたがparse_queryの中で直接WP_Queryを使うことができないのか知りません、しかし私はPosts2Posts githubでチケットをオープンしました: https://github.com/scribu/wp-posts-to-posts/issues/483

1
Jérémie

無限ループを呼び出しているのは、フックのある場所であるWP_Query内でWP_Queryを呼び出しているためです。したがって、それを何度も繰り返しparse_queryにフックしています。これを回避するには、コールバック関数の先頭に次のコードを追加してください。

// avoid infinite loop
remove_action( 'parse_query', __FUNCTION__ ); 


さらに注意して欲しいのですが、それは技術的には劣るかもしれませんが、私の考えでは正しいフックはpre_get_postsです。

1
Nicolai

私はこれを試しませんでした。しかしissue_idを取得するための関数を作るのはどうでしょうか。 wp_reset_postdata()WP_Query()は重要です。

function get_the_issue_id() {
  $issues = new WP_Query( /* .... */ );
  $issue_id = $issues->get_posts()[0]->ID;
  wp_reset_postdata(); //it's important
  return (int) $issue_id;  
}

それではparse_queryをやりましょう。

function categories_by_issue ($query) {    
    if (! $query->is_category() || ! $query->is_main_query()) return;

    $query->set( 'connected_type', 'issue_to_posts');
    $query->set( 'connected_items', get_the_issue_id() ); //using the function
    $query->set( 'nopaging', true);    
}    
add_action('parse_query', 'categories_by_issue');
0
Mayeenul Islam