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'); } ?>

但是,这会覆盖所有其他页面的 aphabetical 顺序。

对于我使用的字母顺序:

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

本质上,我想要一个声明,告诉页面以 aphabetical 顺序对所有帖子进行排序,除非类别是“事件”,我想按自定义事件日期对它们进行排序。

正如您可能会说的那样,我非常喜欢前端,而不是后端,所以很多这对我来说是相当新的,所以任何帮助或建议都值得赞赏。

4

4 回答 4

1

要按自定义字段值排序帖子,您需要将自定义元字段添加到查询本身。orderby=meta_value除了meta_key=metafieldid将允许以这种方式订购。

如果(或类似的查询变量)返回所需的帖子类别,我将使用pre_get_posts钩子并修改查询对象。get_query_var( "cat" )

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或类似的通用函数文件中。

于 2013-07-29T12:38:31.677 回答
0

希望我理解你的问题,使用WP_Queryand 在orderby你的 order by 列之间添加一个空格:

$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 );
于 2012-09-07T16:04:02.570 回答
0

关于什么:

<?php $posts = query_posts($query_string . (is_category($events)?'&orderby='.$event_date:'&orderby=title') . '&order=asc');  ?>
于 2012-09-07T16:06:31.300 回答
0
<?php
$recent = new WP_Query(“cat=ID&showposts=x”);
while($recent->have_posts()) : $recent->the_post();
?>
于 2012-09-07T16:26:36.243 回答