按天(而不是时间)和元价值排序帖子

时间:2014-08-28 作者:jetlej

我想有一个帖子列表,首先按天排序,然后在这一天内排序用户投票(存储为元字段)。

将每个时间戳转换为查询时的日期,还是创建另一个存储日期的元字段更好?还是有更好的解决方案?

2 个回复
最合适的回答,由SO网友:Tomás Cot 整理而成

这就是我发现的。我在WP\\U查询生成的SQL查询上使用过滤器过滤ORDER BY。过滤器是这样的posts_orderby. 使用它,您可以为查询编写自定义ORDER BY。我给你举个例子。

add_filter(\'posts_orderby\', \'posts_orderby\');

function posts_orderby($orderby_for_query) {
    $orderby_for_query = "LEFT(wp_posts.post_date, 10) DESC, wp_posts.post_title ASC";
    return $orderby_for_query;
}   
这里的关键是LEFT 函数,它是一个MYSQL函数。有了这个,您可以“修改”日期,所以MYSQL只使用前10个字符,所以它使用年、月和日,而不是时间,我想这是您想要的。

编辑:正如阿德瓦尔所指出的DATE 函数可以用来代替LEFT.

您可能需要删除筛选器以避免影响其他查询,可以这样做:

remove_filter( \'posts_orderby\', \'posts_orderby\' );
在呼叫后添加到new WP_Query(). 我希望这有帮助,如果您有任何疑问,请询问。

编辑:正如建议的那样,避免对DB前缀进行硬编码是一个好主意,您可以使用此代码获得它。

global $wpdb;    
$prefix = $wpdb->prefix;
然后,只需在表名前面加上它。用于tablename。柱

$prefix . \'tablename.column\'
默认情况下,前缀为“wp\\”。

要检查生成的SQL查询,可以var_dump($name_of_query->request)

SO网友:Alevalentini

我正在使用一个混合了元字段和数据作为顺序参数的解决方案。

$query = new WP_Query( array(
            \'post_type\' => \'post\',
            \'meta_key\' => \'[your vote field]\',
            \'orderby\' => \'date meta_value_num\',
            \'order\' => \'DESC\',
            \'meta_query\' => array(
                                    array(
                                            \'key\' => \'[your vote field]\',
                                            \'value\' => [what values],
                                            \'compare\' => \'[IN - NOT IN, you decide]\',
                                    )
                            ),
            \'date_query\' => array(
                                    \'after\' => \'1 day ago\',
                            )
            ));
然后还必须将其添加到函数中。php:

function wpse159469_posts_orderby( $orderby, $query ) {
    return implode( \' DESC,\', explode( \',\', str_replace( array(\' ASC\', \' DESC\' ), \'\', $orderby ) ) ) . \' DESC\';
}
并记住在查询前后添加筛选器:

add_filter( \'posts_orderby\', \'wpse159469_posts_orderby\', 10, 2 );
//query and stuff
remove_filter( \'posts_orderby\', \'wpse159469_posts_orderby\', 10, 2 );
这个解决方案适合我。

结束

相关推荐

MySQL_REAL_ESPRY_STRING的替代方案

我有一个WordPress插件,我需要查看数据库中是否存在某个标题。两年来,该代码运行良好:$myposttitle= $wpdb->get_results( \"select post_title from $wpdb->posts where post_title like \'%\". mysql_real_escape_string($myTitle) . \"%\'\" ); 但是,使用php 5.5。和WP 3.9.1,这会导致错误,因为m