WordPress函数:WP_Query的基础用法简介

07月/04日/WordPress/浏览 273

WordPress开发,文章自定义查询可以说是必备技能。WordPress提供了WP_Query类足以满足各种自定义查询需求。


其基础用法如下:


// The Query
$the_query = new WP_Query( $args );
 
// The Loop
if ( $the_query->have_posts() ) {
    echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';
} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();


注意:在循环中使用了 the_post, the_post使用了全局变量$post,所以循环结束,必须使用 wp_reset_postdata 重置$post,否则会发生数据混乱。


如果,我们只需要查询出数据,而不是直接在主题开发的循环中使用,该怎么办呢?


那就需要使用 WP_Query 的 query 方法。


$query = new WP_Query();
$post_list = $query->query($args);


$post_list 就是 WP_Post 对象数组。


另外,也可以使用 get_posts 函数。get_posts 函数源码如下:


function get_posts( $args = null ) {
    $defaults = array(
        'numberposts'      => 5,
        'category'         => 0,
        'orderby'          => 'date',
        'order'            => 'DESC',
        'include'          => array(),
        'exclude'          => array(),
        'meta_key'         => '',
        'meta_value'       => '',
        'post_type'        => 'post',
        'suppress_filters' => true,
    );
 
    $parsed_args = wp_parse_args( $args, $defaults );
    if ( empty( $parsed_args['post_status'] ) ) {
        $parsed_args['post_status'] = ( 'attachment' === $parsed_args['post_type'] ) ? 'inherit' : 'publish';
    }
    if ( ! empty( $parsed_args['numberposts'] ) && empty( $parsed_args['posts_per_page'] ) ) {
        $parsed_args['posts_per_page'] = $parsed_args['numberposts'];
    }
    if ( ! empty( $parsed_args['category'] ) ) {
        $parsed_args['cat'] = $parsed_args['category'];
    }
    if ( ! empty( $parsed_args['include'] ) ) {
        $incposts                      = wp_parse_id_list( $parsed_args['include'] );
        $parsed_args['posts_per_page'] = count( $incposts );  // Only the number of posts included.
        $parsed_args['post__in']       = $incposts;
    } elseif ( ! empty( $parsed_args['exclude'] ) ) {
        $parsed_args['post__not_in'] = wp_parse_id_list( $parsed_args['exclude'] );
    }
 
    $parsed_args['ignore_sticky_posts'] = true;
    $parsed_args['no_found_rows']       = true;
 
    $get_posts = new WP_Query;
    return $get_posts->query( $parsed_args );
}


可以看出 get_posts 就是对 WP_Query 的封装调用。

发表评论

暂无评论,抢个沙发...

客服 工单