为什么在一些404上循环不是空的?

时间:2014-09-12 作者:kraftner

我遇到了一个奇怪的问题。

假设您访问一个随机url,深度为三级或三级以上:

http://example.com/a/b/c
http://example.com/a/b/c/d
...
那么is_404()true. 到目前为止还不错。但出于某种原因,最后的帖子会被查询。

$wp_query->request
是的

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
    FROM wp_posts 
    WHERE 1=1 
        AND wp_posts.post_type = \'post\' 
        AND (
            wp_posts.post_status    = \'publish\' 
            OR wp_posts.post_status = \'private\'
            ) 
    ORDER BY wp_posts.post_date DESC 
    LIMIT 0, 5
那当然have_posts() 回来true 等等有人能解释一下吗?

到目前为止,我发现:

之所以只在三个或三个以上的层次上深入,是因为在此之前,WP会寻找导致其他行为的帖子和附件。

看起来,即使WP在某一点上将请求识别为404,它也会获取最新的帖子。在@kaiser@G.M. 我从某处找到了这个/wp-includes/class-wp.php:608

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

你可能会感到惊讶,但这并不奇怪。

首先,让我们澄清一下,在WordPress中,当您访问前端URL时,您会触发一个查询。总是

这个查询只是一个标准WP_Query, 就像通过以下方式运行的:

$query = new WP_Query( $args );
只有一个区别:$args WordPress使用WP::parse_request() 方法该方法所做的只是查看URL和重写规则,并将URL转换为参数数组。

但是,如果由于URL无效,该方法无法做到这一点,会发生什么情况?查询参数就是这样一个数组:

array( \'error\' => \'404\' );
(来源herehere).

因此该数组被传递给WP_Query.

现在尝试执行以下操作:

$query = new WP_Query( array( \'error\' => \'404\' ) );
var_dump( $query->request );
您是否对查询正好是OP中的查询感到惊讶?我不是。

所以

  1. parse_request() 使用传递给的错误键构建数组WP_Query, 就这样运行了handle_404() 运行after 查询将查看\'error\' 参数和集合is_404() 要实现这一点,have_post()is_404() 不相关。问题是WP_Query 没有系统在出现问题时短路查询,因此一旦构建对象,向其传递一些参数,查询将运行。。。

    Edit:

    有两种方法可以克服此问题:

    创建404.php 样板WordPress会将其加载到404个URL上,您无需在那里进行检查have_posts()$wp_query 在404上为空,类似于:

    add_action( \'wp\', function() {
        global $wp_query;
        if ( $wp_query->is_404() ) {
            $wp_query->init();
            $wp_query->is_404 = true; // init() reset 404 too
        }
    } );
    
结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post