我需要按2个自定义字段值对(自定义)帖子进行排序...
自定义字段名称1:is_sponsored
[值可以是1
或0
]
自定义字段名称2:sfp_date
[ timestamp
aka当前发布日期,以秒为单位]
“ is_sponsored
”值为1的帖子需要放在最上面,并按“ sfp_date
”的DESC
结尾顺序排序。is_sponsored
值“ ”为0的所有其他帖子也应在下方列出-降序排列(按“ sfp_date
”)。
我有类似的东西:
$sfp_query_args = array(
'tax_query' => array(
array(
'taxonomy' => 'sfp_posts',
'terms' => array( 1, 5, 8 )
)
),
'post_type' => 'sfpposts',
'post_status' => 'publish',
'showposts' => 15,
'paged' => $paged,
'meta_key' => 'sfp_date',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_query' => array(
'key' => 'is_sponsored',
'value' => 2,
'type' => 'NUMERIC',
'compare' => '<='
)
);
$wp_q = new WP_Query( $sfp_query_args );
...但不起作用。有任何想法吗?
编者注:这是一个小插件,应显示查询的外观,因为我们可能没有任何数据集可用于测试。
<?php
/** Plugin Name: (#67600) Dump Query parts */
function wpse67600_dump_query_parts( $pieces )
{
echo '<pre>'.var_export( $pieces, true ).'</pre>';
return $pieces;
}
add_filter( 'posts_clauses', 'wpse67600_dump_query_parts' );
请在此处添加插件的输出-使用“编辑”链接。
由Dameer编辑
好的,在跟踪请求和各种解决方法之后,我提出了以下解决方案...
如果我稍微简化一下“ $ sfp_query_args”,结果将接近所需的结果,但是仍然无法按顺序对帖子进行排序。这里是:
$sfp_query_args1 = array(
'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
'post_type' => 'sfpposts',
'post_status' => 'publish',
'showposts' => (int)$per_page,
'paged' => $paged,
'meta_key' => 'is_sponsored',
'orderby' => 'meta_value date'
);
- * orderby具有两个属性:meta_value和date *
因此$ wpdb-> request中带有上述参数的查询看起来像这样:
SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID
FROM $wpdb->posts
INNER JOIN $wpdb->term_relationships
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->postmeta
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE 1=1
AND $wpdb->posts.post_type = 'sfpposts'
AND ($wpdb->posts.post_status = 'publish')
AND ($wpdb->postmeta.meta_key = 'is_sponsored' )
GROUP BY $wpdb->posts.ID
ORDER BY $wpdb->postmeta.meta_value, $wpdb->posts.post_date DESC
LIMIT 0, $per_page
最后,为了也可以按meta_value进行排序,应将查询设置为只有一点点不同:
SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID
FROM $wpdb->posts
INNER JOIN $wpdb->term_relationships
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->postmeta
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE 1=1
AND $wpdb->posts.post_type = 'sfpposts'
AND ($wpdb->posts.post_status = 'publish')
AND ($wpdb->postmeta.meta_key = 'is_sponsored' )
GROUP BY $wpdb->posts.ID
ORDER BY $wpdb->postmeta.meta_value [!ORDER MISSING!], $wpdb->posts.post_date DESC
LIMIT 0, $per_page
请找出[!ORDER MISSING!]占位符。我想以上应该可以解释问题出在哪里。
我不相信您可以使用默认的WP_Query类来做到这一点。即使在文档中,它也显示“如果meta_value是数组,您是否知道如何对查询进行排序?在此处编写”。为此,您可能必须编写自己的SQL查询。
—
米哈·雷卡尔
是的,我知道这个问题还没有解决,但是我认为这是个正确的解决方法:)
—
Dameer 2012年
我为您的问题添加了一个小插件,因此您可以向我们展示最终的SQL查询部分。请使用该信息编辑您的问题。谢谢。
—
kaiser 2012年