首页 > CMS教程 > WordPress > 正文

WordPress的WP_Query是什么?如何使用?

幻夢星雲
发布: 2025-08-17 10:48:02
原创
854人浏览过
<p>wp_query是<a style="color:#f60; text-decoration:underline;" title="wordpress" href="https://www.php.cn/zt/15989.html" target="_blank">wordpress</a>中用于自定义数据库查询的核心类,它允许开发者通过设置参数如post_type、posts_per_page、meta_query等精确检索文章、页面或自定义文章类型的内容;其典型使用模式包括定义查询参数、执行循环输出内容,并在结束后调用wp_reset_postdata()以恢复主循环数据;相比主循环(the loop)仅处理当前页面默认内容,wp_query适用于额外内容展示场景,如相关文章、侧边栏模块、短代码、ajax加载等;为提升性能,应避免n+1查询、减少数据冗余(使用fields参数)、禁用不必要的总数计算(no_found_rows)、优化meta_query和tax_query复杂度,并结合transients api缓存查询结果,从而确保高效稳定的内容检索。</p> <p><img src="https://img.php.cn/upload/article/001/221/864/175539888820721.jpeg" alt="WordPress的WP_Query是什么?如何使用?"></p> <p>WordPress的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>是一个核心类,它允许你以非常灵活的方式从数据库中检索文章、页面、自定义文章类型等内容。简单来说,它就是WordPress用来“问”数据库:“给我这些东西”的<a style="color:#f60; text-decoration:underline;" title="工具" href="https://www.php.cn/zt/16887.html" target="_blank">工具</a>,并且能让你精确地定义“这些东西”具体是什么。</p> <h3>解决方案</h3> <p>使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>通常遵循一个相对固定的模式,这就像是和WordPress数据库进行一次有礼貌的对话。</p> <p>首先,你需要创建一个<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>的新实例,并在其中传入你想要的查询参数。这些参数决定了你希望获取哪些内容。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><?php $args = array( 'post_type' => 'post', // 查询文章 'posts_per_page' => 5, // 每页显示5篇文章 'category_name' => '技术分享', // 仅显示“技术分享”分类下的文章 'orderby' => 'date', // 按日期排序 '' => 'DESC' // 降序(最新在前) ); $custom_query = new WP_Query( $args ); // 接着,进入循环,检查是否有文章符合条件 if ( $custom_query->have_posts() ) : while ( $custom_query->have_posts() ) : $custom_query->the_post(); // 在这里,你可以使用WordPress的模板标签来显示文章内容 ?> <div class="post-item"> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <div class="entry-content"> <?php the_excerpt(); ?> </div> <p class="post-meta">发布于:<?php the_time('Y年n月j日'); ?></p> </div> <?php endwhile; // 如果有分页,这里可以添加分页导航 // the_posts_pagination( array( 'total' => $custom_query->max_num_pages ) ); else : // 没有找到文章时的提示 echo '<p>抱歉,没有找到相关内容。</p>'; endif; // 最重要的一步:重置文章数据。这能确保主查询(The Loop)不会被你的自定义查询所影响。 wp_reset_postdata(); ?></pre>
登录后复制
</div><p>这个流程就像搭积木,你定义好规则(<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">$args</pre>
登录后复制
</div>),然后让<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>去“找”符合规则的积木,最后把它们展示出来。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">wp_reset_postdata()</pre>
登录后复制
</div>是那个收尾动作,它把一切都还原到查询前的状态,避免后续代码出现意料之外的行为。</p> <h3>WP_Query的常用参数有哪些?如何精细化定制查询结果?</h3> <p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>的强大之处在于它拥有极其丰富的参数,让你能够像外科医生一样精准地筛选内容。这不仅仅是指定文章类型或分类那么简单,它能深入到很多细节。</p> <p>比如说,你可能不只是想找文章,而是想找特定作者在某个日期范围内的文章,并且这些文章必须包含某个自定义字段的值。</p> <p>一些我个人觉得特别有用且常用的参数:</p> <ul> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">post_type</pre>
登录后复制
</div></strong>: 决定你想查询什么类型的内容。可以是 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'post'</pre>
登录后复制
</div> (文章), <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'page'</pre>
登录后复制
</div> (页面), 你的自定义文章类型名称(比如 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'product'</pre>
登录后复制
</div>),甚至是数组 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">array('post', 'page', 'my_cpt')</pre>
登录后复制
</div> 来同时查询多种类型。</li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">posts_per_page</pre>
登录后复制
</div></strong>: 控制每页显示多少条结果。设为 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-1</pre>
登录后复制
</div> 则显示所有符合条件的。</li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">category_name</pre>
登录后复制
</div> / <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">cat</pre>
登录后复制
</div> / <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">tag</pre>
登录后复制
</div> / <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">tag_id</pre>
登录后复制
</div></strong>: 按分类或标签查询。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">category_name</pre>
登录后复制
</div>用分类的slug,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">cat</pre>
登录后复制
</div>用分类ID。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">tag</pre>
登录后复制
</div>用标签的slug,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">tag_id</pre>
登录后复制
</div>用标签ID。</li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">orderby</pre>
登录后复制
</div> / <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">order</pre>
登录后复制
</div></strong>: 排序方式和升降序。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">orderby</pre>
登录后复制
</div>可以是<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'date'</pre>
登录后复制
</div> (日期), <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'title'</pre>
登录后复制
</div> (标题), <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'rand'</pre>
登录后复制
</div> (随机), <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'comment_count'</pre>
登录后复制
</div> (评论数), <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'meta_value'</pre>
登录后复制
</div> (自定义字段值) 等。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">order</pre>
登录后复制
</div>通常是<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'ASC'</pre>
登录后复制
</div> (升序) 或 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'DESC'</pre>
登录后复制
</div> (降序)。</li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">p</pre>
登录后复制
</div> / <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">name</pre>
登录后复制
</div> / <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">page_id</pre>
登录后复制
</div></strong>: 直接通过ID或slug查询特定文章或页面。</li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">author</pre>
登录后复制
</div> / <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">author_name</pre>
登录后复制
</div></strong>: 根据作者ID或用户名查询。</li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">year</pre>
登录后复制
</div> / <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">monthnum</pre>
登录后复制
</div> / <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">day</pre>
登录后复制
</div></strong>: 按年份、月份、日期查询。</li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">s</pre>
登录后复制
</div></strong>: 搜索关键词。</li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">meta_query</pre>
登录后复制
</div></strong>: 这个非常强大,用于根据自定义字段(post meta)查询。你可以指定字段名、值、比较操作符(<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">=</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">!=</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">></pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"><</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">LIKE</pre>
登录后复制
</div>等),甚至可以组合多个条件(<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">AND</pre>
登录后复制
</div>或<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">OR</pre>
登录后复制
</div>)。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>'meta_query' => array( 'relation' => 'AND', // 或者 'OR' array( 'key' => 'price', 'value' => 100, 'type' => 'NUMERIC', 'compare' => '>' ), array( 'key' => 'color', 'value' => 'blue', 'compare' => '=' ) )</pre>
登录后复制
</div></li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">tax_query</pre>
登录后复制
</div></strong>: 类似于<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">meta_query</pre>
登录后复制
</div>,用于根据自定义分类法(custom taxonomy)查询。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'product_category', 'field' => 'slug', 'terms' => 'electronics' ), array( 'taxonomy' => 'product_tag', 'field' => 'id', 'terms' => array(12, 34), 'operator' => 'IN' ) )</pre>
登录后复制
</div></li> <li> <strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">date_query</pre>
登录后复制
</div></strong>: 针对日期和时间进行更复杂的查询。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>'date_query' => array( array( 'after' => 'January 1st, 2023', 'before' => array( 'year' => 2024, 'month' => 6, 'day' => 15, ), 'inclusive' => true, // 包含指定日期 'compare' => 'BETWEEN', 'column' => 'post_date', ), )</pre>
登录后复制
</div><p>这些参数的组合几乎能满足所有内容筛选的需求。在使用时,我通常会先在WordPress官方文档中查找特定参数的用法,因为它们的灵活性有时会超出想象。</p> </li> </ul> <h3>使用WP_Query时常见的性能问题与优化策略是什么?</h3> <p>虽然<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>功能强大,但不恰当的使用确实可能导致性能瓶颈,尤其是在数据量较大或者查询条件复杂时。我遇到过几次因为查询效率不高导致页面加载缓慢的情况,这让人很头疼。</p> <p>最常见的性能问题往往围绕着“过度查询”和“低效查询”展开:</p> <div class="aritcle_card"> <a class="aritcle_card_img" href="/ai/2092"> <img src="https://img.php.cn/upload/ai_manual/000/000/000/175679993727189.png" alt="PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用"> </a> <div class="aritcle_card_info"> <a href="/ai/2092">PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用</a> <p>一键操作,智能生成专业级PPT</p> <div class=""> <img src="/static/images/card_xiazai.png" alt="PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用"> <span>268</span> </div> </div> <a href="/ai/2092" class="aritcle_card_btn"> <span>查看详情</span> <img src="/static/images/cardxiayige-3.png" alt="PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用"> </a> </div> <ol> <li> <p><strong>N+1 查询问题(间接相关)</strong>: 虽然<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>本身不是直接造成N+1的元凶,但如果你在<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>循环内部,对每篇文章都执行额外的数据库查询(比如获取某个自定义字段,但没有通过<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">meta_query</pre>
登录后复制
</div>预加载),那就会产生N+1问题。</p> <ul><li> <strong>优化策略</strong>: 尽可能在<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>参数中包含所有需要的数据。例如,使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">meta_query</pre>
登录后复制
</div>来筛选,而不是在循环中判断;或者使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">update_post_meta_cache</pre>
登录后复制
</div>和<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">update_post_term_cache</pre>
登录后复制
</div>等函数来预加载相关数据。</li></ul> </li> <li> <p><strong>查询过多数据</strong>: 有时我们只是需要文章ID列表,却查询了所有文章的所有字段,这无疑增加了数据库负担。</p> <ul><li> <strong>优化策略</strong>: 使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">fields</pre>
登录后复制
</div>参数。如果你只需要文章ID,可以设置<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'fields' => 'ids'</pre>
登录后复制
</div>。这样<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>只会返回文章ID数组,而不是完整的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Post</pre>
登录后复制
</div>对象,大大减少<a style="color:#f60; text-decoration:underline;" title="内存占用" href="https://www.php.cn/zt/38616.html" target="_blank">内存占用</a>和查询时间。例如:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$args = array( 'post_type' => 'post', 'posts_per_page' => -1, 'fields' => 'ids', // 只获取文章ID ); $post_ids = new WP_Query( $args ); // $post_ids->posts 现在是一个ID数组</pre>
登录后复制
</div></li></ul> </li> <li> <p><strong>不必要的计数查询</strong>: 当你不需要分页时,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>默认会执行一个<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">SQL_CALC_FOUND_ROWS</pre>
登录后复制
</div>查询来获取总的文章数量,这在大型数据库中可能会很慢。</p> <ul><li> <strong>优化策略</strong>: 设置<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">'no_found_rows' => true</pre>
登录后复制
</div>。如果你确定不需要<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">$custom_query->max_num_pages</pre>
登录后复制
</div>或<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">$custom_query->found_posts</pre>
登录后复制
</div>来做分页,这个参数能显著提升查询速度。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$args = array( 'post_type' => 'post', 'posts_per_page' => 10, 'no_found_rows' => true, // 禁用总数查询 );</pre>
登录后复制
</div></li></ul> </li> <li> <p><strong>复杂的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">meta_query</pre>
登录后复制
</div>或<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">tax_query</pre>
登录后复制
</div></strong>: 当这些查询条件非常复杂,或者涉及的自定义字段/分类法没有正确索引时,数据库会花费更多时间来查找匹配项。</p> <ul><li> <strong>优化策略</strong>: 确保你的自定义字段和分类法在数据库层面有合适的索引。虽然这通常需要直接操作数据库或使用插件,但对于性能至关重要的字段,这是值得考虑的。另外,尽量简化查询逻辑,避免过度复杂的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">relation</pre>
登录后复制
</div>组合。</li></ul> </li> <li> <p><strong>缓存利用不足</strong>: WordPress本身有对象缓存和页面缓存机制,但自定义<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>的结果可能没有被充分缓存。</p> <ul><li> <strong>优化策略</strong>: 对于那些不经常变动但查询量大的<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>结果,可以考虑使用WordPress的Transients API来手动缓存。例如,将查询结果存储在缓存中,设置一个过期时间,下次请求时先检查缓存,如果存在且未过期则直接使用,否则重新查询并更新缓存。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$cached_posts = get_transient( 'my_custom_query_results' ); if ( false === $cached_posts ) { $args = array( /* 你的查询参数 */ ); $custom_query = new WP_Query( $args ); $cached_posts = $custom_query->posts; // 存储WP_Post对象数组 set_transient( 'my_custom_query_results', $cached_posts, DAY_IN_SECONDS ); } // 现在你可以遍历 $cached_posts 来显示内容</pre>
登录后复制
</div><p>这就像是把查询结果临时存放在一个抽屉里,下次要用的时候,先看看抽屉里有没有,有的话就直接拿,不用再去仓库(数据库)里找了。</p> </li></ul> </li> </ol> <h3>WP_Query与主循环(The Loop)有什么<a style="color:#f60; text-decoration:underline;" title="区别" href="https://www.php.cn/zt/27988.html" target="_blank">区别</a>?什么时候应该使用WP_Query?</h3> <p>这确实是WordPress开发中一个经常让人混淆的点。简单来说,主循环(The Loop)是WordPress在加载页面时默认执行的查询,而<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>是你自己手动发起的额外查询。</p> <p><strong>主循环 (The Loop)</strong>: 当你访问一个WordPress页面(比如博客首页、分类归档页、单篇文章页),WordPress在后台已经执行了一次主要的数据库查询,这个查询的结果就是你在模板文件中通过<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">if ( have_posts() ) : while ( have_posts() ) : the_post(); ... endif;</pre>
登录后复制
</div>这段代码所获取到的内容。这就是所谓的“主循环”。它代表了当前页面“应该”显示的内容,比如在博客首页显示最新的文章,在分类页显示该分类下的文章。</p> <p><strong><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div></strong>: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>则是一个独立的、自定义的查询。它不影响WordPress正在处理的“主循环”内容。你可以把它想象成你在一个页面上,除了显示页面本身的内容外,还想额外展示一些“相关”或“特定”的内容。</p> <p><strong>什么时候应该使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>?</strong></p> <p>当你需要在一个页面上显示<strong>除了主内容之外的、特定的、自定义的内容列表</strong>时,就应该使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>。以下是一些典型的场景:</p> <ol> <li> <strong>显示相关文章</strong>: 在单篇文章页面的底部,你可能想显示几篇与当前文章分类或标签相关的文章。这显然不是主循环的任务,你需要用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>来获取这些“相关”的文章。</li> <li> <strong>自定义内容列表/区块</strong>: 比如在首页侧边栏显示“热门文章”、“最新产品”或“推荐服务”。这些内容通常不是当前页面本身的焦点,而是附加信息。</li> <li> <strong>构建自定义存档页面</strong>: 如果你想要一个非常规的文章列表页面,比如一个按字母顺序<a style="color:#f60; text-decoration:underline;" title="排列" href="https://www.php.cn/zt/56129.html" target="_blank">排列</a>的作者列表,或者一个根据特定自定义字段筛选的文章列表,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>就能派上用场。</li> <li> <strong>短代码(Shortcode)或小工具(Widget)</strong>: 当你开发一个短代码或小工具,需要根据用户定义的参数来显示内容时,<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>是其核心。用户可能输入“显示5篇来自‘新闻’分类的文章”,你就用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>去实现。</li> <li> <strong>AJAX加载内容</strong>: 在通过AJAX<a style="color:#f60; text-decoration:underline;" title="异步加载" href="https://www.php.cn/zt/34044.html" target="_blank">异步加载</a>更多文章或特定内容时,后端处理请求的PHP代码通常会使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>来获取数据。</li> </ol> <p>一个非常重要的注意事项是,当你使用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">WP_Query</pre>
登录后复制
</div>后,一定要记得调用<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">wp_reset_postdata()</pre>
登录后复制
</div>。这个函数的作用是把WordPress的全局文章数据(比如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">$post</pre>
登录后复制
</div>对象)重置回主循环的状态。如果你忘记调用它,那么在你的自定义查询之后,任何依赖于<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">$post</pre>
登录后复制
</div>全局变量的函数(例如<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">the_title()</pre>
登录后复制
</div>、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">the_permalink()</pre>
登录后复制
</div>等)都可能会错误地显示你自定义查询的最后一篇文章的数据,而不是主循环应有的数据,这会导致页面显示混乱。这是一个常见的“坑”,我个人就踩过好几次。</p>

以上就是WordPress的WP_Query是什么?如何使用?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号