永远不要使用query\\u帖子!改用get\\u posts()或new WP\\u Query()。
但我认为这会奏效:
$today = date("Y/m/j");
$args = (array(
\'post_type\' => \'event\',
\'posts_per_page\' => 10,
\'orderby\' => array(
\'wpse_meta_query_name\' => \'ASC\',
\'post_title\' => \'DESC\' // optional second orderby paramater
),
\'meta_query\' => array(
\'wpse_meta_query_name\' => array( // give the meta query arguments a name, to pass into \'orderby\'
\'key\' => \'_start_eventtimestamp\',
// \'meta-value\' => $value, // this was in your code but should not be
\'value\' => $today,
\'compare\' => \'>=\',
\'type\' => \'CHAR\'
)
),
\'tax_query\' => array(
\'relation\' => \'AND\', // redundant default value \'AND\' but I still put it in..
array(
\'taxonomy\' => \'event_catgory\',
\'field\' => \'slug\',
\'terms\' => \'green\',
),
)
));
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while( $query->have_posts() ) {
$query->the_post(); // edit: added $query
// ...
}
}
----编辑----
除了回答您下面关于taxonomy-event\\u类别的评论之外,我还想说一些其他的事情。php
我决定忽略这个问题的一点细节,这就是您正在索引上运行此查询的事实。php
当您在该文件上时,可以相当肯定已经执行了查询。要访问该查询,可以执行以下操作
global $wp_query
if ( $wp_query->have_posts() ) { ... etc. etc.
这与我在上面所做的方式相同,只是全局$wp\\u查询没有内置分类查询,这是因为您在索引上。php
但是,您不需要使用全局$wp\\u查询。相反,当您简单地运行函数have\\u posts()和the\\u post()而不是$variable\\u that\\u is\\u wp\\u query->have\\u posts()时,它只会为您引用全局$wp\\u查询。因此,通常没有理由引用该全局变量。
如果要修改在索引上时已在后台运行的查询。php,您应该查看“pre\\u get\\u posts”挂钩。您可以完成与上面相同的事情,但方式略有不同。
然而,当您只想显示某个类别中的帖子时,通常不需要这样做。相反,请使用taxonomy-event\\u category。php正如您在下面提到的,准确的“tax\\u查询”将自动包含在全局$wp\\u查询中,但现在它将根据url(即yoursite.com/event-category/green或yoursite.com/event-category/blue)自动更改。
还有一件事,索引。php将列出您的帖子是的,但索引。php也适用于其他帖子类型。事实上,这是我可能有点错误的地方。我的理解是,自定义帖子类型将使用归档。php(与index.php非常相似),而index。php是一种奇怪的文件,因为在一些WordPress安装中,它是您的主页,而在其他WordPress安装中,您的主页可能是首页。php或模板主页。例如php和索引。php只是一个“归档”页面,用于列出所有属于“帖子”类型的帖子(即博客帖子)。(有关更多信息,请查看此混乱的图表:https://developer.wordpress.org/files/2014/10/wp-hierarchy.png)
所以有点困惑,为什么要在索引上显示事件。php。如果这个页面实际上是你的主页,你应该称它为首页。php。然后在设置->阅读中,选择一个选项,如。。“首页显示静态页面”。创建一个名为主页的页面,然后在下拉菜单下选择它。这样,全局$wp\\u查询就不会从数据库中获取大量博客文章,只是为了编写自己的新查询。相反,它只是查询与您的主页相对应的单个post\\u id。
那么从这里到哪里。我想我的建议是尝试创建一个名为归档事件的文件。php。然后,如果你想,你可以让索引。php和归档。php可以做任何他们想做的事情,并且您可以控制哪个post类型转到哪个归档文件{post type}。php页面。我通常就是这样做的。
如果您在taxonomy-event\\u类别之外使用它。php,那么您就差不多准备好了。剩下的唯一一件事就是添加“meta\\u查询”,以便更改帖子的顺序,而不是默认的先显示最近的帖子。
在此设置下,存档事件。php显示所有事件和taxonomy-event\\u类别。php显示所有事件,但已经应用了某个分类查询。这些页面的html可能或多或少相同。
因此,让我们尝试通过“pre\\u get\\u posts”来“修改主查询”,针对所有与“events”特别相关的前端主查询。试着将其应用到您的函数中。php:
/**
* @param $query - passed by reference
*/
function wpse_modify_events_main_query( $query ) {
// this function is run on every single wp_query which happens in a ton of places
// so we need to figure out the logic required so that we don\'t unintentionally modify the wrong queries
// sometimes there seems to be no clear way on exactly how to do this.. different things work for different purposes
if ( is_admin() ) {
return; // in /wp-admin, do not modify
}
// queries where we manually write \'new WP_Query()\' are not main queries
if ( ! $query->is_main_query() ) {
return; // not main query, do not modify
}
// there may be better ways to verify post type? but this will work.
if ( isset( $query->query[\'post_type\'] ) && ( $query->query[\'post_type\'] == \'event\' ) ) {
// is a meta_query is already set for one reason or another, we may accidentally overwrite it.
// this may or may not be intended, so kind of tough to decide what to do if one is already in place.
// if ( $query->get(\'meta_query\') ) {
// // return ?? probably not.
// }
$today = date("Y/m/j");
$query->set(\'meta_query\', array(
\'wpse_meta_query_name\' => array(
\'key\' => \'_start_eventtimestamp\',
\'value\' => $today,
\'compare\' => \'>=\',
\'type\' => \'CHAR\'
)
) );
$query->set(\'orderby\', array(
\'wpse_meta_query_name\' => \'ASC\',
\'post_title\' => \'DESC\' // optional second orderby paramater
) );
}
// the $query variable was passed by reference, meaning we don\'t need to return the $query.
// when we do things like $query->set() it will modify the main query.
}
// run each query through our own function before it hits the database
add_action( \'pre_get_posts\', \'wpse_modify_events_main_query\');
如果有人能让我知道我在pre\\u get\\u posts电话中是否遗漏了什么,那就太好了。WordPress有很多功能,如。。is\\u post\\u type\\u archive()、is\\u tax(),也可以使用,但有时它们似乎并没有完全按照它们所说的做。
若要检查您的查询是否正在修改,请使用全局$wp\\u query,然后在其上打印,查看是否附加了meta\\u query参数。