如何只获取一类自定义帖子类型?

时间:2018-02-24 作者:FRQ6692

我成功获得了所有按meta\\u键值日期排序的CPT帖子。代码如下

$today = date("Y/m/j");
query_posts(array(
\'post_type\' => \'event\',
\'posts_per_page\' => 10,
\'meta_key\' => \'_start_eventtimestamp\',
\'orderby\' => \'meta_value\',
\'order\' => \'ASC\',
\'meta_query\' => array(
    array(
       \'key\' => \'_start_eventtimestamp\',
       \'meta-value\' => $value,
       \'value\' => $today,
       \'compare\' => \'>=\',
       \'type\' => \'CHAR\'
   )
)
));
if (have_posts()) :
while (have_posts()) : the_post();
现在尝试使用order by meta box值一次显示一个类别。

post_type=>event, taxonomy=>event_catgory, slug=>green

How can i show these post on index.php and also order by meta_key value which is Date?

1 个回复
最合适的回答,由SO网友:Joel M 整理而成

永远不要使用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参数。

结束