WordPress WP_Query() 教程
WordPress 开发文档
收录了这篇文章

WP_Query 是 WordPress 中一个非常强大的类,用于自定义查询和获取来自数据库的内容,如文章、页面、附件等。通过使用 WP_Query 类,你可以灵活地控制查询参数,以展示特定条件下的内容,比如特定分类、标签、日期范围内的文章等。下面是一个基础的 WP_Query 教程,帮助你入门并掌握其基本用法。

1. 基本使用

在开始之前,请确保你已经对 PHP 和 WordPress 主题开发有一定的了解。

创建一个新的查询

<?php
$args = array(
    'post_type' => 'post', // 查询的文章类型,默认为 'post',也可以是 'page' 或自定义文章类型
    'category_name' => 'news', // 按分类名称查询,这里查询分类为 'news' 的文章
    'posts_per_page' => 5, // 每页显示的文章数量
);

$the_query = new WP_Query( $args );

if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <?php the_excerpt(); ?>
    <?php endwhile;
    wp_reset_postdata(); // 重置查询,恢复全局 `$wp_query` 对象
else :
    echo '没有找到相关文章。';
endif;
?>

2. 参数详解

  • post_type:指定查询的帖子类型,可以是 'post', 'page', 或自定义文章类型。
  • category_name 或 cat:按分类查询,category_name 使用分类的别名,cat 使用分类ID。
  • tag:按标签查询,使用标签的slug。
  • posts_per_page:每页显示的文章数量。
  • paged:用于分页查询,例如 $paged = get_query_var('paged') ? get_query_var('paged') : 1; 然后在 $args 中加入 'paged' => $paged。
  • order:排序顺序,可选值为 'ASC'(升序)或 'DESC'(降序),默认为 'DESC'。
  • orderby:排序依据,常见的有 'date', 'title', 'modified', 'ID' 等。

3. 分页

当你的查询结果需要分页时,需要在查询参数中加入 'paged',并在模板中使用WordPress的分页函数,如 paginate_links()。

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args['paged'] = $paged;

// ...执行查询...

// 分页链接
echo paginate_links(array(
    'prev_text' => __('上一页'),
    'next_text' => __('下一页'),
    'total' => $the_query->max_num_pages
));

 

4. 重置查询

使用 WP_Query 后,记得使用 wp_reset_postdata() 来重置全局 $wp_query 对象和相关的循环变量,特别是当你在主循环之外使用 WP_Query 时,这一步非常重要。

 

5. 高级用法

WP_Query 支持更多高级查询参数,如自定义字段查询(meta_query)、日期查询(date_query)、作者查询等。深入学习可以通过查阅WordPress官方文档的Class Reference/WP_Query部分。

通过掌握 WP_Query 的基本和高级用法,你可以更灵活地管理和展示WordPress中的内容,提升网站的定制性和用户体验。

WP_Query 的高级用法允许你进行更复杂和精细的内容查询,包括但不限于基于自定义字段的查询、多条件组合查询、日期范围查询等。下面是一些进阶特性的示例:

 

5.1. 自定义字段查询(Meta Query)

如果你的内容使用了自定义字段(Custom Fields),可以通过 meta_query 参数来过滤查询结果。meta_query 接受一个数组,数组中的每个元素代表一个查询条件。

$args = array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'key' => 'color', // 自定义字段键名
            'value' => 'red', // 要匹配的值
            'compare' => '=', // 比较运算符,默认 '=',也可用 '!='、'>'、'<=' 等
            'type' => 'CHAR' // 字段类型,默认为 'NUMERIC',对于文本使用 'CHAR' 或 'BINARY'
        ),
        // 可以添加更多条件,通过 'relation' 参数设置这些条件之间的关系,如 'AND' 或 'OR'
    ),
);
$the_query = new WP_Query( $args );

5.2. 多条件组合查询

当需要根据多个条件组合查询时,可以使用 tax_query、date_query 等,并且可以在顶级参数中设置 'relation' 来决定这些查询条件间的关系(默认为 'AND')。

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        'relation' => 'OR', // 设置内部条件间的关系为 'OR'
        array(
            'taxonomy' => 'category', // 税onomy名称
            'field' => 'slug', // 使用分类别名
            'terms' => array('news', 'reviews'), // 匹配的分类别名列表
        ),
        array(
            'taxonomy' => 'post_tag',
            'field' => 'id',
            'terms' => 123, // 根据标签ID查询
        ),
    ),
    'date_query' => array(
        array(
            'year' => 2023, // 只查询2023年的文章
        ),
    ),
);
$the_query = new WP_Query( $args );

5.3. 排序与限制

除了基本的 'orderby' 和 'order' 参数外,你还可以利用 'meta_value', 'meta_value_num' 等进行更复杂的排序。

$args = array(
    'meta_key' => 'rating', // 指定用于排序的自定义字段
    'orderby' => 'meta_value_num', // 根据数值型自定义字段排序
    'order' => 'DESC', // 降序排列
);

5.4. 分页与偏移

在高级查询中处理分页和结果偏移(offset)同样重要,尤其是在创建自定义列表或无限滚动功能时。

$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$offset = 10; // 偏移量,跳过前10篇文章
$posts_per_page = 5; // 每页文章数

$args = array(
    'post_type' => 'post',
    'posts_per_page' => $posts_per_page,
    'paged' => $paged,
    'offset' => $offset,
);
$the_query = new WP_Query( $args );

5.5. 预加载(Preloading)

对于性能敏感的应用,考虑使用 WP_Query 的 no_found_rows 参数设为 true,以减少数据库查询的开销,但这会禁用分页功能。

$args = array(
    'no_found_rows' => true, // 减少查询开销,不计算总记录数,因此不能用于分页
    // 其他查询参数...
);

这些高级用法只是 WP_Query 功能的冰山一角。为了更全面地掌握其功能,建议深入阅读WordPress开发者文档,并结合实际项目需求进行实践。

修改时间 2024-06-04

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
Light 主题
JavaScript 原生拖放
阿里云内容安全 API 签名机制
JavaScript history对象
JavaScript 使用 qrcode 生成二维码
Node.js MySQL 连接池和事务
JavaScript 操作 cookie
WordPress 引入自定义 JavaScript 文件