当不满足条件时,自定义查询上的IF/ELSE返回200 OK?

时间:2013-10-13 作者:its_me

What? 我正在修改我的主题,以便在单独的页面上显示帖子的评论。

How? 主要地based on this answer 但是通过改进的检查和代码。这就是我的页面评论。php(有点像):

(The code is very easy to scan through, trust me!)

<?php get_header(); ?>

<?php
    /*
     * (Example URL: example.com/comments/?original_post=ID)
     *
     * Check if HTTP variable (original_post) exists in queried URL,
     * AND that it is set to some value (ID), AND that the value (ID) is a number.
     */
    if( array_key_exists( \'original_post\', $_GET ) && isset( $_GET[\'original_post\'] ) && ctype_digit( $_GET[\'original_post\'] ) ) {

        $query_original_post = new WP_Query( array(
            \'posts_per_page\' => 1,
            \'p\'              => $_GET[\'original_post\'],
            \'post_type\'      => \'any\',
        ) );

        if( $query_original_post->have_posts() ) {

            while ( $query_original_post->have_posts() ) : $query_original_post->the_post();

                // [...]

            endwhile;
            wp_reset_postdata();

        } else {

            /*
             * Return 404 error if there are no posts
             */
            global $wp_query;
            $wp_query->set_404();
            status_header( 404 );
            nocache_headers();
            get_template_part( \'404\', \'archive\' );
            //exit();

        }

    } else {

        /*
         * Return 404 error if the HTTP variable (original_post) doesn\'t
         * exist in queried URL, OR it isn\'t set to any value (ID),
         * OR the value (ID) isn\'t a number.
         */
        global $wp_query;
        $wp_query->set_404();
        status_header( 404 );
        nocache_headers();
        get_template_part( \'404\', \'archive\' );
        //exit();

    }
?>

<?php get_footer(); ?>
(我用来返回404错误的代码基于these two solutions.)

正如你所看到的,我在代码中做了两次检查(at least that\'s what I intended to do):

检查查询的URL中是否存在HTTP变量(original\\u post),并将其设置为某个值(ID),并且该值(ID)是一个数字。否则,返回一个404错误和适当的标题。

检查自定义WordPress查询($query_original_post) 有任何要循环的结果。否则,返回一个404错误和适当的标题。

Problem:

<这样做对吗?(或者至少,它能更简单些吗?)

  • (如果对#1是)它似乎可以工作,但当我转到如下URL时,返回200 OK标头:example.com/comments/?original_post=NUMBER, 其中数字是长度超过4位的任何正整数(例如14532)。

    我不理解这种关系。为什么要这样做呢。com/注释/?original\\u post=14532 `当我登录WordPress时返回200 OK标题,当我没有登录WordPress时返回404 error(应该是哪个错误)?

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

    在您尝试更改标题之前很久就会发送标题。标头由与关联的操作发送get_header(), 因此,当代码执行时,更改标头为时已晚。你可以通过一个简单的实验来证明这一点。请尝试以下各项:

    get_header(); 
    status_header( 404 );
    
    以及

    status_header( 404 );
    get_header(); 
    
    在模板文件中,并使用以下工具查看输出HttpFoxWireshark (如果你真的想找点乐子:))。

    要有效地更改标题,您需要在之前运行逻辑get_header().

    我相信这将获得您想要的效果,只需引导更少的代码行:

    /*
    * (Example URL: example.com/comments/?original_post=ID)
    *
    * Check if HTTP variable (original_post) exists in queried URL,
    * AND that it is set to some value (ID), AND that the value (ID) is a number.
    */
    
    if( 
      array_key_exists( \'original_post\', $_GET ) 
      && isset( $_GET[\'original_post\'] ) 
      && ctype_digit( $_GET[\'original_post\'] ) 
    ) {
      $query_original_post = new WP_Query( 
        array(
          \'posts_per_page\' => 1,
          \'p\'              => $_GET[\'original_post\'],
          \'post_type\'      => \'any\',
        ) 
      );
      if( !$query_original_post->have_posts() ) {
        global $wp_query;
        $wp_query->set_404();
        status_header( 404 );
        nocache_headers();
      } 
    }
    
    get_header();
    if( !empty($query_original_post) && $query_original_post->have_posts() ) {
      while ( $query_original_post->have_posts() ) {
        $query_original_post->the_post();
        // [...]
      }
      wp_reset_postdata();
    } else {
      get_template_part( \'404\', \'archive\' );
    }
    get_footer();
    
    出于对所有神圣事物的热爱,请不要使用PHP开头和结尾标记,除非您确实需要它们。

    结束

    相关推荐

    Query Not working as expected

    所以我在前一段时间写了一个相当不吸引人的函数,我正在重新分解一些代码,我意识到我的查询函数不起作用。。。我最近发表了一篇关于my tansient posts were not working 这一切归结为查询不起作用的基本原因。现在是的,我确实得到了一个post对象,是的,我确实设法循环它并显示一些内容。不管分页有多坏,不管你的页码是多少,都是同一组帖子。因此,在阅读这篇文章时,我检查了一下,以确保我获得了最大页数。而我是。但是如上所述,无论我在哪一页上,帖子都是一样的。我的另一个问题的答案中应用的相同