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リクエストを伴わずにフックに情報をリクエストする方法はありますか?
私はこの問題を解決することができませんでしたが、回避策を見つけました:parse_requestフックで私のissue IDを得て、それをparse_queryで使用します($ issue_id変数でクラスを作成しました、しかしグローバル変数も大丈夫です)。
それでもなぜあなたがparse_queryの中で直接WP_Queryを使うことができないのか知りません、しかし私はPosts2Posts githubでチケットをオープンしました: https://github.com/scribu/wp-posts-to-posts/issues/483
無限ループを呼び出しているのは、フックのある場所であるWP_Query
内でWP_Query
を呼び出しているためです。したがって、それを何度も繰り返しparse_query
にフックしています。これを回避するには、コールバック関数の先頭に次のコードを追加してください。
// avoid infinite loop
remove_action( 'parse_query', __FUNCTION__ );
さらに注意して欲しいのですが、それは技術的には劣るかもしれませんが、私の考えでは正しいフックはpre_get_posts
です。
私はこれを試しませんでした。しかし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');