- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我读到应该避免使用 query_posts()
,而使用 wp_query()
和 pre_get_posts()
。我对弄乱循环没有信心,也不完全理解法典。
下面的代码是否使用了 query_posts()
?如果是,并且由于应避免使用 query_posts()
,您能否建议一种不使用 query_posts()
但仍能完成相同事情的方法?
functions.php
中的这段代码用于按随机或按价格对帖子进行排序。
function my_custom_query($query){
if ( $query->is_home() && $query->is_main_query() ) {
$sort= $_GET['sort'];
if($sort == "pricelow"){
$query->set( 'meta_key', 'price' );
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'order', 'ASC' );
}
if($sort == "random"){
$query->set( 'orderby', 'rand' );
}
}
}
add_action( 'pre_get_posts', 'my_custom_query' );
.
使用此代码将链接 A(随机)和链接 B(价格)发布在我的菜单中。因此,网站访问者只需单击链接即可对帖子进行排序。
<a href="http://website.com/?sort=A">Random</a>
<a href="http://website.com/?sort=B">Price</a>
最佳答案
我已经在 WPSE 上对这个主题做了非常详细的解释,为了它可能对 SO 用户具有的值(value)和好处,这里是从 WPSE 上的那个问题复制的完整帖子。为了感兴趣,这里是 WPSE 上完整帖子的链接:Some doubts about how the main query and the custom query works in this custom theme?
您的实际问题基本上是何时运行自定义查询以及何时使用主查询。让我们把它分成三个部分
第一部分
何时运行自定义查询(这不是最终列表)
创建自定义内容 slider
在页面中创建特色内容区域
如果您需要显示帖子,请在 page.php 模板上
如果您需要在静态首页上显示自定义内容
显示相关的、热门的或信息性的帖子
主查询范围之外的任何其他次要或补充内容
何时使用主查询。
显示主要内容
在您的主页和后台设置为博客页面的页面
所有存档页面,包括 archive.php、category.php、author.php、taxonomy.php、tag.php 和 date.php 等模板
第二部分
To select all the featured posts I use this line that create a new WP_Query object that define a query having the specific tag featured:
So, from what I have understand, this is not the WordPres main query but it is a new query created by me. From what I have understand it is better create a new query (as done) and not use the main query when I want perform this kind of operations
正确。这超出了主查询的范围。这是无法使用主查询创建的次要或补充内容。您应该始终使用 WP_Query
或 get_posts
创建您的自定义查询。
切勿使用 query_posts
创建自定义查询,甚至任何其他查询。我的重点。
Note: This function isn't meant to be used by plugins or themes. As explained later, there are better, more performant options to alter the main query. query_posts() is overly simplistic and problematic way to modify main query of a page by replacing it with new instance of the query. It is inefficient (re-runs SQL queries) and will outright fail in some circumstances (especially often when dealing with posts pagination).
继续前进
Ok, going on I show all the posts that have not the featured tag, to do this I use this code snippet that on the contrary modify the main query:
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
So I think that this is pretty horrible. Is it true?
那都是错误的,不幸的是你的说法是正确的。如前所述,从不使用query_posts
。它运行一个全新的查询,这对性能不利,并且在大多数情况下它会破坏分页,而分页是使分页正常工作的主要查询的组成部分。
这是您的主要内容,因此您应该使用带有默认循环的主查询,它应该如下所示,这就是您所需要的
<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
get_template_part('content', get_post_format());
endwhile;
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
你完全可以去掉这部分,删掉,烧掉,忘掉
<?
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>
好的,完成后,您会看到来自功能标签的帖子使用主查询和默认循环出现在您的主页中。
从主页删除此标签的正确方法是使用 pre_get_posts
.这是更改主查询的正确方法,也是您应该始终用来更改主要内容循环的 Hook 。
因此,带有 pre_get_posts
的代码是正确的,这就是您应该使用的功能。只有一件事,请始终检查您是否在管理页面上,因为 pre_get_posts
也会更改后端。所以这是在 functions.php 中使用的正确代码,用于从主页中删除标记为 featured 的帖子
function exclude_featured_tag( $query ) {
if ( !is_admin() && $query->is_home() && $query->is_main_query() ) {
$query->set( 'tag__not_in', 'array(ID OF THE FEATURED TAG)' );
}
}
add_action( 'pre_get_posts', 'exclude_featured_tag' );
第三部分
额外的阅读 Material ,对以后有帮助
关于php - query_posts() 应该避免吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25587009/
我正在尝试在Elasticsearch中返回的值中考虑地理位置的接近性。我希望近距离比某些字段(例如legal_name)重要,但比其他字段重要。 从文档看来,当前的方法是使用distance_fea
我是Elasticsearch的初学者,今天在进行“多与或”查询时遇到问题。 我有一个SQL查询,需要在Elastic中进行转换: WHERE host_id = 999 AND psh_pid =
智能指针应该/可以在函数中通过引用传递吗? 即: void foo(const std::weak_ptr& x) 最佳答案 当然你可以通过const&传递一个智能指针。 这样做也是有原因的: 如果接
我想执行与以下MYSQL查询等效的查询 SELECT http_user, http_req_method, dst dst_port count(*) as total FROM my_table
我用这两个查询进行测试 用must查询 { "size": 200, "from": 0, "query": { "bool": { "must": [ { "mat
我仍在研究 Pro Android 2 的简短服务示例(第 304 页)同样,服务示例由两个类组成:如下所示的 BackgroundService.java 和如下所示的 MainActivity.j
给定标记 like this : header really_wide_table..........................................
根据 shouldJS 上的文档网站我应该能够做到这一点: ''.should.be.empty(); ChaiJS网站没有使用 should 语法的示例,但它列出了 expect 并且上面的示例似乎
我在 Stack Overflow 上读到一些 C 函数是“过时的”或“应该避免”。你能给我一些这种功能的例子以及原因吗? 这些功能有哪些替代方案? 我们可以安全地使用它们 - 有什么好的做法吗? 最
在 C++11 中,可变参数模板允许使用任意数量的参数和省略号运算符 ... 调用函数。允许该可变参数函数对每个参数做一些事情,即使每个参数的事情不是一样的: template void dummy(
我在我从事的项目之一上将Shoulda与Test::Unit结合使用。我遇到的问题是我最近更改了此设置: class MyModel :update end 以前,我的(通过)测试看起来像这样: c
我该如何做 or使用 chai.should 进行测试? 例如就像是 total.should.equal(4).or.equal(5) 或者 total.should.equal.any(4,5)
如果您要将存储库 B 中的更改 merge 到存储库 A 中,是否应该 merge .hgtags 中的更改? 存储库 B 可能具有 A 中没有的标签 1.01、1.02、1.03。为什么要将这些 m
我正在尝试执行X AND(y OR z)的查询 我需要获得该代理为上市代理或卖方的所有已售属性(property)。 我只用 bool(boolean) 值就可以得到9324个结果。当我添加 bool
我要离开 this教程,尝试使用 Mocha、Supertest 和 Should.js 进行测试。 我有以下基本测试来通过 PUT 创建用户接受 header 中数据的端点。 describe('U
我正在尝试为 Web 应用程序编写一些 UI 测试,但有一些复杂的问题希望您能帮助我解决。 首先,该应用程序有两种模式。其中一种模式是“训练”,另一种是“现场”。在实时模式下,数据直接从我们的数据库中
我有一个规范: require 'spec_helper' # hmm... I need to include it here because if I include it inside desc
我正在尝试用这个测试我在 Rails 中的更新操作: context "on PUT to :update" do setup do @countdown = Factory(:count
我还没有找到合适的答案: onclick="..." 中是否应该转义 &(& 符号)? (或者就此而言,在每个 HTML 属性中?) 我已经尝试在 jsFiddle 和 W3C 的验证器上运行转义和非
import java.applet.*; import java.awt.*; import java.awt.event.*; public class Main extends Applet i
我是一名优秀的程序员,十分优秀!