WP_QUERY对空参数的‘响应’很差吗?

时间:2016-11-28 作者:dingo_d

我在一个文件中介绍了几个选项,并通过AJAX加载帖子,所以我把data 属性查询变量:cat, tag_id, author, yearmonthnum.

根据存在与否(如果您在分类页面cat 查询变量将是一些数字,但tag_id 例如,将为空)。现在查询如下所示:

$cat = ( isset( $_GET[\'cat\'] ) && \'\' !== $_GET[\'cat\'] ) ? sanitize_text_field( wp_unslash( $_GET[\'cat\'] ) ) : \'\'; // Input var okay.
$tag = ( isset( $_GET[\'tag\'] ) && \'\' !== $_GET[\'tag\'] ) ? sanitize_text_field( wp_unslash( $_GET[\'tag\'] ) ) : \'\'; // Input var okay.
$year = ( isset( $_GET[\'year\'] ) && \'\' !== $_GET[\'year\'] ) ? sanitize_text_field( wp_unslash( $_GET[\'year\'] ) ) : \'\'; // Input var okay.
$month = ( isset( $_GET[\'month\'] ) && \'\' !== $_GET[\'month\'] ) ? sanitize_text_field( wp_unslash( $_GET[\'month\'] ) ) : \'\'; // Input var okay.
$author = ( isset( $_GET[\'author\'] ) && \'\' !== $_GET[\'author\'] ) ? sanitize_text_field( wp_unslash( $_GET[\'author\'] ) ) : \'\'; // Input var okay.
$post__not_in = ( isset( $_GET[\'post__not_in\'] ) && \'\' !== $_GET[\'post__not_in\'] ) ? sanitize_text_field( wp_unslash( $_GET[\'post__not_in\'] ) ) : \'\'; // Input var okay.

$the_query = new WP_Query(array(
    \'cat\'          => $cat,
    \'tag_id\'       => $tag,
    \'author\'       => $author,
    \'date_query\' => array(
        array(
            \'year\'  => $year,
            \'month\' => $month,
        ),
    ),
    \'post_status\'  => \'publish\',
    \'post__not_in\' => json_decode( $post__not_in, true ),
));
post__not_in 是否可以确保当我将主页设置为博客页面时,加载了正确的帖子(我遇到了一些问题paged 这就解决了这个问题)。

现在我没有发现的是,如果查询参数为空,查询速度会变慢吗?

我应该基于哪个变量为空来创建查询参数吗?这样做是否比将其全部放在一个数组中更好?有些事情告诉我,这更好,因为查询变量更少,因此查询更具体?

此外,在使用AJAX加载帖子时,我是否应该添加no_found_rows => 1, 因为我没有使用分页?这应该会让我的查询比我读到的更快。

欢迎提供任何建议:)

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

我不会这样写,因为查询越混乱,返回意外结果的可能性就越大。

下面是我如何处理您的代码:

$args = array(); // All your WP_Query args go here.

// You don\'t need to pass \'post_status\' => \'publish\' because that\'s default

// Replace all instances of [ isset && \'\' !== ] with !empty
if ( !empty( $_GET[\'cat\'] ) ) 
    $args[\'cat\'] = sanitize_text_field( wp_unslash( $_GET[\'cat\'] ) );

if ( !empty( $_GET[\'tag\'] ) )
    $args[\'tag_id\'] = sanitize_text_field( wp_unslash( $_GET[\'tag\'] ) );

if ( !empty( $_GET[\'year\'] ) || !empty( $_GET[\'month\'] ) ) {
    $date_query = array();
    if ( !empty( $_GET[\'year\'] ) )
        $date_query[\'year\'] = sanitize_text_field( wp_unslash( $_GET[\'year\'] ) );
    if ( !empty( $_GET[\'month\'] ) )
        $date_query[\'month\'] = sanitize_text_field( wp_unslash( $_GET[\'month\'] ) );
    $args[\'date_query\'] = array( $date_query );
}

if ( !empty( $_GET[\'post__not_in\'] ) )
     $args[\'post__not_in\'] = sanitize_text_field( wp_unslash( $_GET[\'post__not_in\'] ) );

$the_query = new WP_Query( $args );
我觉得有点奇怪,你需要将反斜杠与消毒配合使用,但如果你觉得有必要,我会暂时保留它,否则,我可能只会运行消毒。

由于它与AJAX有关,我个人没有使用过no_found_rows, 所以我不能这么说。我编写的AJAX协议通常与一个输入配对,该输入具有显示的帖子“页面”的当前偏移量。

相关推荐

尝试在WordPress中实现AJAX注释,遇到WP错误

我试图在WordPress中为我的评论实现Ajax,使用this tutorial. 但我在将教程中的代码集成到自己的预构建主题时遇到了问题。问题是,我要么得到一个WP错误“检测到重复注释;看来你已经说过了!”或标准500错误。以下是我得到的:下面是我对ajax的评论。js文件如下所示: * Let\'s begin with validation functions */ jQuery.extend(jQuery.fn, { /* * check i