在Posts2Posts的“parse_Query”或“PRE_GET_POST”中使用WP_QUERY

时间:2015-06-18 作者:Jérémie

UPDATE:

钩子正在使用“经典”Wordpress过滤器(如post__in), 所以这可能是Posts2Posts的问题。如果有人有任何想法,我仍在寻求建议。

ORIGINAL POST

我正在尝试在归档页面中按问题编号显示所有帖子。问题是一种自定义的帖子类型(与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\');
?>
这个动作挂钩works fine! 问题是:我需要通过另一个查询获取问题ID。(ID和版本号当然不同,我的“#3”版本有“71”ID)

我试图添加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请求?

3 个回复
最合适的回答,由SO网友:Jérémie 整理而成

我无法解决这个问题,但找到了一个解决方法:我在parse\\u请求挂钩上获取我的问题ID,并在parse\\u查询中使用它(我创建了一个带有$issue\\u ID var的类,但全局变量也应该可以)。

仍然不知道为什么不能在parse\\u Query中直接使用WP\\u Query,但我在Posts2Posts-github上打开了票证:https://github.com/scribu/wp-posts-to-posts/issues/483

SO网友:Nicolai Grossherr

您正在调用无限循环,因为您正在调用WP_Query 在…内WP_Query, 这是挂钩所在的位置,所以您要将其挂钩到parse_query 一次又一次要避免这种情况,请在回调函数的开头放置以下内容:

// avoid infinite loop
remove_action( \'parse_query\', __FUNCTION__ ); 
另请注意,这可能只是一个较小的技术性问题,但在我看来,正确的钩子应该是pre_get_posts.

SO网友:Mayeenul Islam

我不想试试这个。但是,创建一个函数来获取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\');

结束

相关推荐

AJAX加载更多帖子-WP_QUERY参数不起作用

我试图用一个Ajax加载更多帖子按钮来代替标准的WP分页。我基本上是按照this question 这在很大程度上很有效。以下是相关代码:HTML(博客索引页):<div id=\"content\"> <?php $args = array( \'posts_per_page\' => 5 ); if (isset($_GET[\'views\'])) { $args[\'orderby\'] = \'met