我在一个文件中介绍了几个选项,并通过AJAX加载帖子,所以我把data
属性查询变量:cat
, tag_id
, author
, year
和monthnum
.
根据存在与否(如果您在分类页面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
, 因为我没有使用分页?这应该会让我的查询比我读到的更快。
欢迎提供任何建议:)
最合适的回答,由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协议通常与一个输入配对,该输入具有显示的帖子“页面”的当前偏移量。