我读了很多关于如何通过meta_value
, 但我似乎无法让它为我工作。
我的meta_key
被称为date
, 它存储为yyyy-mm-dd
.
到目前为止,我已经做到了:
$args = array(
\'posts_per_page\' => -1,
\'meta_key\' => \'date\',
\'orderby\' => \'meta_value_num\',
\'order\' => \'DESC\',
\'post_type\' => \'post\',
\'post_status\' => \'publish\'
);
query_posts($args);
if (have_posts()) while (have_posts()) : the_post();
据我所知,这应该给我我想要的东西,但是在索引上这样做。php页面似乎没有更改查询。这些帖子似乎仍然由
post_date
而不是我的
date
元值,这是不同的。
我要做的是覆盖或更改帖子和归档页面上的查询,以便它按我的meta\\u键排序。它出现在每个帖子上,所以如果没有它,该怎么办没有问题。
我的论点正确吗?如果正确,我还需要做些什么才能让它发挥作用?
感谢您的帮助
Update:
我尝试将WP\\u Query()与这些参数一起使用,并打印出对象。这个
request
排序对象的方法
menu_order ASC
完全忽略了我的meta\\u value\\u num参数。这就是为什么排序不起作用,但查询的其余部分没有问题。你知道为什么WP会忽略我的订单参数吗?
Another Update
好吧,缩小范围。日期存储为
text
在Posteta表中,尝试按它排序,并期望MySQL将其视为日期,这有点愚蠢。为此,我编写了自己的查询,以获取所需内容:
SELECT wp_posts.post_title,
m.*,
STR_TO_DATE(m.meta_value, \'%Y-%m-%d\') AS m_date
FROM wp_posts
LEFT JOIN wp_postmeta m ON ( wp_posts.ID = m.post_id AND m.meta_key = \'date\')
WHERE post_status=\'publish\' AND post_type=\'post\'
ORDER BY m_date DESC
请注意
STR_TO_DATE()
呼叫这会将字符串强制转换为日期,从而允许MySQL按其正确排序。呸。现在编辑我的循环。。。。
或者,是否有人知道我可以使用一个钩子来就地编辑该查询,就像它被称为钩子一样?这比运行两个查询要高效得多。
最合适的回答,由SO网友:jammypeach 整理而成
所以我想出了如何得到我想要的,但它仍然不完美。问题围绕着我的自定义元值是如何存储的——基本上是作为字符串存储的。
我需要告诉MySQL这是一个日期,所以可以用它来订购帖子。为此,我使用了一个自定义查询:
$posts = $wpdb->get_results(
"SELECT wp_posts.*,
STR_TO_DATE(m.meta_value, \'%Y-%m-%d\') AS m_date
FROM wp_posts
LEFFT JOIN wp_postmeta AS m ON(wp_posts.ID=m.post_id AND m.meta_key=\'date\')
WHERE post_status=\'publish\' AND post_type=\'post\'
ORDER BY m_date DESC"
);
if ($posts):
global $post;
foreach ($posts as $post):
setup_postdata($post);
echo get_the_title(); //finally in the right order!
endforeach;
endif;
这使用MySQL函数
STR_TO_DATE()
将元值转换为日期,然后使用它在
ORDER BY
条款
所以这一切都很好,但如果我能在查询运行之前钩住它,并稍微修改一下SQL,那就更好了,我可以在查询方面节省很多钱。这个网站很小,所以它不是一个大问题,但积少成多。
如果有人知道怎么做,我很乐意接受这个答案,而不是我自己的答案。
参考文献:
http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_str-to-date