显示所有帖子,即使URL指向单个帖子

时间:2018-01-24 作者:Themushroomsound

我试图设计一个主题,所有帖子在网格布局中始终可见,使用index.php 作为我的单一模板。即使访问与单个帖子匹配的URL,也会显示所有帖子,只有一个和URL匹配的帖子会以某种方式突出显示。

这就像主页上的魅力(http://example.com/), 但如果我想访问帖子(http://example.com/mycategory/mypostname) 它没有显示任何内容。

我尝试设置一个pre\\u get\\u posts挂钩,如下所示:

function preGetPosts( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
        return;
    $query->set( \'posts_per_page\', -1 );
    $query->set( \'name\', "" );
    $query->set( \'category_name\', "" );
    return;
}
add_action( \'pre_get_posts\', \'preGetPosts\' );
但是我的页面上根本没有帖子。我已经尝试通过在模板中显示SQL请求来解决这个问题:

<?php echo $GLOBALS[\'wp_query\']->request; ?>
。。。生成的SQL请求很好:

SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = \'post\' ORDER BY wp_posts.post_date DESC
即使在phpMyAdmin中尝试请求,也会得到所有帖子的正确列表。我无法理解是什么阻止循环显示这些结果。

甚至连连接到loop_start 似乎完全跳过了操作。有什么想法吗?

谢谢

EDIT: 如果我倾倒$GLOBALS[\'wp_query\'] 在循环之前的模板中,我看到:

["post_count"] => int(0)
["found_posts"] => int(23)
确实有23个帖子应该显示出来。。。找到的帖子和帖子数量有什么区别?

EDIT: 完整查询转储:

object(WP_Query)#390 (48) {
  ["query"]=>
  array(3) {
    ["page"]=>
    string(0) ""
    ["name"]=>
    string(4) "sos3"
    ["category_name"]=>
    string(8) "mixtapes"
  }
  ["query_vars"]=>
  array(65) {
    ["page"]=>
    int(0)
    ["name"]=>
    string(0) ""
    ["category_name"]=>
    string(0) ""
    ["error"]=>
    string(0) ""
    ["m"]=>
    string(0) ""
    ["p"]=>
    int(0)
    ["post_parent"]=>
    string(0) ""
    ["subpost"]=>
    string(0) ""
    ["subpost_id"]=>
    string(0) ""
    ["attachment"]=>
    string(0) ""
    ["attachment_id"]=>
    int(0)
    ["static"]=>
    string(0) ""
    ["pagename"]=>
    string(0) ""
    ["page_id"]=>
    int(0)
    ["second"]=>
    string(0) ""
    ["minute"]=>
    string(0) ""
    ["hour"]=>
    string(0) ""
    ["day"]=>
    int(0)
    ["monthnum"]=>
    int(0)
    ["year"]=>
    int(0)
    ["w"]=>
    int(0)
    ["tag"]=>
    string(0) ""
    ["cat"]=>
    string(0) ""
    ["tag_id"]=>
    string(0) ""
    ["author"]=>
    string(0) ""
    ["author_name"]=>
    string(0) ""
    ["feed"]=>
    string(0) ""
    ["tb"]=>
    string(0) ""
    ["paged"]=>
    int(0)
    ["meta_key"]=>
    string(0) ""
    ["meta_value"]=>
    string(0) ""
    ["preview"]=>
    string(0) ""
    ["s"]=>
    string(0) ""
    ["sentence"]=>
    string(0) ""
    ["title"]=>
    string(0) ""
    ["fields"]=>
    string(0) ""
    ["menu_order"]=>
    string(0) ""
    ["embed"]=>
    string(0) ""
    ["category__in"]=>
    array(0) {
    }
    ["category__not_in"]=>
    array(0) {
    }
    ["category__and"]=>
    array(0) {
    }
    ["post__in"]=>
    array(0) {
    }
    ["post__not_in"]=>
    array(0) {
    }
    ["post_name__in"]=>
    array(0) {
    }
    ["tag__in"]=>
    array(0) {
    }
    ["tag__not_in"]=>
    array(0) {
    }
    ["tag__and"]=>
    array(0) {
    }
    ["tag_slug__in"]=>
    array(0) {
    }
    ["tag_slug__and"]=>
    array(0) {
    }
    ["post_parent__in"]=>
    array(0) {
    }
    ["post_parent__not_in"]=>
    array(0) {
    }
    ["author__in"]=>
    array(0) {
    }
    ["author__not_in"]=>
    array(0) {
    }
    ["posts_per_page"]=>
    int(-1)
    ["ignore_sticky_posts"]=>
    bool(false)
    ["suppress_filters"]=>
    bool(false)
    ["cache_results"]=>
    bool(true)
    ["update_post_term_cache"]=>
    bool(true)
    ["lazy_load_term_meta"]=>
    bool(true)
    ["update_post_meta_cache"]=>
    bool(true)
    ["post_type"]=>
    string(0) ""
    ["nopaging"]=>
    bool(true)
    ["comments_per_page"]=>
    string(2) "50"
    ["no_found_rows"]=>
    bool(false)
    ["order"]=>
    string(4) "DESC"
  }
  ["tax_query"]=>
  NULL
  ["meta_query"]=>
  object(WP_Meta_Query)#629 (9) {
    ["queries"]=>
    array(0) {
    }
    ["relation"]=>
    NULL
    ["meta_table"]=>
    NULL
    ["meta_id_column"]=>
    NULL
    ["primary_table"]=>
    NULL
    ["primary_id_column"]=>
    NULL
    ["table_aliases":protected]=>
    array(0) {
    }
    ["clauses":protected]=>
    array(0) {
    }
    ["has_or_relation":protected]=>
    bool(false)
  }
  ["date_query"]=>
  bool(false)
  ["request"]=>
  string(112) "SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = \'post\'  ORDER BY wp_posts.post_date DESC "
  ["posts"]=>
  &array(0) {
  }
  ["post_count"]=>
  int(0)
  ["current_post"]=>
  int(-1)
  ["in_the_loop"]=>
  bool(false)
  ["comment_count"]=>
  int(0)
  ["current_comment"]=>
  int(-1)
  ["found_posts"]=>
  int(23)
  ["max_num_pages"]=>
  int(0)
  ["max_num_comment_pages"]=>
  int(0)
  ["is_single"]=>
  bool(false)
  ["is_preview"]=>
  bool(false)
  ["is_page"]=>
  bool(false)
  ["is_archive"]=>
  bool(false)
  ["is_date"]=>
  bool(false)
  ["is_year"]=>
  bool(false)
  ["is_month"]=>
  bool(false)
  ["is_day"]=>
  bool(false)
  ["is_time"]=>
  bool(false)
  ["is_author"]=>
  bool(false)
  ["is_category"]=>
  bool(false)
  ["is_tag"]=>
  bool(false)
  ["is_tax"]=>
  bool(false)
  ["is_search"]=>
  bool(false)
  ["is_feed"]=>
  bool(false)
  ["is_comment_feed"]=>
  bool(false)
  ["is_trackback"]=>
  bool(false)
  ["is_home"]=>
  bool(false)
  ["is_404"]=>
  bool(true)
  ["is_embed"]=>
  bool(false)
  ["is_paged"]=>
  bool(false)
  ["is_admin"]=>
  bool(false)
  ["is_attachment"]=>
  bool(false)
  ["is_singular"]=>
  bool(false)
  ["is_robots"]=>
  bool(false)
  ["is_posts_page"]=>
  bool(false)
  ["is_post_type_archive"]=>
  bool(false)
  ["query_vars_hash":"WP_Query":private]=>
  string(32) "8932b0e7ba16b7a363737e0bb1065296"
  ["query_vars_changed":"WP_Query":private]=>
  bool(true)
  ["thumbnails_cached"]=>
  bool(false)
  ["stopwords":"WP_Query":private]=>
  NULL
  ["compat_fields":"WP_Query":private]=>
  array(2) {
    [0]=>
    string(15) "query_vars_hash"
    [1]=>
    string(18) "query_vars_changed"
  }
  ["compat_methods":"WP_Query":private]=>
  array(2) {
    [0]=>
    string(16) "init_query_flags"
    [1]=>
    string(15) "parse_tax_query"
  }
}

2 个回复
SO网友:Themushroomsound

我最终使用了请求过滤器,就像documentation:

function filterRequest( $request ) {
    global $single_post_slug;

    $dummy_query = new WP_Query();  // the query isn\'t run if we don\'t pass any query vars
    $dummy_query->parse_query( $request );

    if( $dummy_query->is_single() && !$dummy_query->is_admin() )
    {
        $single_post_slug = $request[\'name\'];
        $request[\'name\'] = "";
        $request[\'category_name\'] = "";
    }

    return $request;
}
add_filter( \'request\', \'filterRequest\' );
这可能不是最干净的方法,但我可以存储原始查询的slug以供以后使用。我可以避免影响管理。但我担心这可能会影响二次查询,因此我预计接下来会有麻烦:\\

SO网友:janh

通过使用标准install和TwentyEleven进行测试,问题出在WP::parse\\u请求中。与您的pre_get_posts 行动到位,简单地将其从等式中完全移除,对我来说是可行的:

add_filter("do_parse_request", function ($original_value, $query, $extra_vars) {
    $query->query_vars = array();
    return false;
}, 10, 3);
有必要将$query->query\\u vars设置为空数组,因为WP需要它,否则会收到警告。

您可能想彻底测试它,以确保它的行为符合您的要求,但快速看一眼,它在我的安装中看起来很好。

结束

相关推荐