按照父级分类排序WordPress文章

5
更新:我已经尝试使用以下代码:
<?php if (is_category(events)) { 
$posts = query_posts($query_string . '&orderby=event_date&order=desc'); 
} else {
    $posts = query_posts($query_string . '&orderby=title&order=asc'); 
    }
?>

有没有任何理由导致这不起作用?在按字母顺序组织帖子方面似乎可以正常工作,但在“事件”内部的日期顺序上仍然没有运气。

--

在搜索各种现有问题后,我无法找到解决我所尝试做的事情的解决方案。

当前,我站点上的所有帖子都按字母顺序排序,这很好,除了我添加的一个新类别。对于此类别,我想按我输入到自定义字段中的值来对所有帖子进行排序。该字段称为“event_date”,因此,我要按日期对帖子进行排序,但不是创建帖子的日期,而是用户手动输入到该字段中的日期。

我设法通过使用以下内容使其正常工作:

<?php if (is_category($events)) { $posts = query_posts($query_string . '&orderby=$event_date&order=asc'); } ?>

然而,这将覆盖所有其他页面的字母顺序。

按字母顺序排序时,我使用以下内容:

<?php if (is_category()) { $posts = query_posts( $query_string . '&orderby=title&order=asc' ); } ?>

基本上我想要一个语句告诉页面按字母顺序排序所有帖子,除非类别是“事件”,在这种情况下,我希望按自定义事件日期对它们进行排序。
正如您可能已经注意到的那样,我非常关注前端,而不是后端,因此很多东西对我来说都是比较新的,所以任何帮助或建议都将不胜感激。
4个回答

1
为了按照自定义字段值排序文章,您需要将自定义元字段添加到查询本身中。除了meta_key=metafieldid之外,orderby=meta_value可以允许以这种方式排序。
如果get_query_var("cat")(或类似的查询变量)返回所需的文章类别,则可以使用pre_get_posts hook并修改查询对象。
add_action( "pre_get_posts", "custom_event_post_order" );

function custom_event_post_order( $query )
{
    $queried_category = $query -> get_query_var( "cat" );

    /*
     * If the query in question is the template's main query and
     * the category ID matches. You can remove the "is_main_query()"
     * check if you need to have every single query overridden on
     * a page (e.g. secondary queries, internal queries, etc.).
     */
    if ( $query -> is_main_query() && $queried_category == 123 )
    {
        $query -> set( "meta_key", "event_date" ); // Your custom field ID.
        $query -> set( "orderby", "meta_value" ); // Or "meta_value_num".
        $query -> set( "order", "ASC" ); // Or "DESC".
    }
} 

请记住,这种方法会覆盖使用相关类别的所有查询。您可以构建自定义WP_Query对象,使用自己的参数构建循环。
您还应该规范化将自定义字段数据保存到数据库的方式。对于日期,我更喜欢使用UNIX时间戳格式化的时间,这样易于移动和操作。这样查询时就不会发生意外,因为某些数据被格式化为另一种方式。
免责声明:我没有时间测试上述代码的实际效果,但是一般思路应该可以正常工作。
编辑:当然,上述代码应插入到functions.php或类似的通用函数文件中。

0
希望我理解了你的问题,使用WP_Query,在orderby中在排序列之间添加一个空格:
$args = array(
    'posts_per_page' => 100,
    'orderby' => 'title',
    'order' => 'ASC',
);

if(is_category($events)){
    $args['orderby'] .= " meta_value_num";
    $args['meta_key'] = 'event_date';
}

$posts = (array) new WP_Query( $args );

我需要在那里使用if语句来告诉事件类别将页面与其他类别显示不同吗? - Dwight Schrute
是的,你会。更新答案。 - Mike Mackintosh
明白了,但是关于物理数据库模式,这些数据是插入到元列中呢,还是修改了帖子表模式?根据情况来解释为什么它无法工作。 - Mike Mackintosh
只是确认一下,我只需要把您提供的代码放在<?php ?>标签中吗?我已经尝试过了,但是出现了以下错误:致命错误:无法在/home/eventssh/public_html/wp-includes/query.php的第2800行中使用WP_Query类型的对象作为数组。 - Dwight Schrute
是的,那个错误是因为$posts是一个对象,通过$posts->item访问,但我在上面的代码中将其强制转换为数组(array) new ... - Mike Mackintosh
显示剩余7条评论

0

这个怎么样:

<?php $posts = query_posts($query_string . (is_category($events)?'&orderby='.$event_date:'&orderby=title') . '&order=asc');  ?>

我尝试使用这个,但是它们都没有像应该显示的那样。不过感谢您的回复。 - Dwight Schrute

0
<?php
$recent = new WP_Query(“cat=ID&showposts=x”);
while($recent->have_posts()) : $recent->the_post();
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接