使用带有两个键的META_QUERY对帖子进行排序失败,但可以将其作为单个查询进行分离

时间:2014-08-14 作者:rkoller

我有一个我试图分类的课程列表。为了进行排序,我想使用两个高级自定义字段。首先选择字段class_day 包含日期:

1 : Mon
2 : Tue
3 : Wed
4 : Thu
5 : Fri
6 : Sat
7 : Sun
第一个值专门设置为一个数字,以使其易于排序,而第二个标签值将在前端显示。第二个字段是简单的文本字段class_start 使用数字,例如。19:00. 现在我想按class_day 字段,如果当天发生事件,则根据class_start 文本字段。问题是如果我只按class_day:

$args = array(
    \'post_type\' => \'courses\',
    \'posts_per_page\' => -1,
    \'meta_key\' => \'class_day\',
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'ASC\'
);
$the_query = new WP_Query( $args );
或由class_start:

$args = array(
    \'post_type\' => \'courses\',
    \'posts_per_page\' => -1,
    \'meta_key\' => \'class_start\',
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'ASC\'
);
$the_query = new WP_Query( $args );
每次帖子都被正确分类。一天一次,另一天一次。但如果我尝试将两者合并meta_query 这根本不起作用。

$args = array(
    \'post_type\' => \'courses\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(\'key\' => \'class_day\'),
        array(\'key\' => \'class_start\')
    ),
    \'meta_key\' => \'meta_value\',
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'ASC\'
);
$the_query = new WP_Query( $args );
使用\'relation\' => \'OR\' 帖子只按天排序,但在第二步中,当天的帖子没有按时间正确排序。如果我使用\'relation\' => \'AND\' 因为我遇到了else 回路的情况:

if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();
我的目标是得到一个排序列表,如:

Mon 13:00
Tue 12:30
Tue 16:00
Sat 12:00
但不是:

Mon 13:00
Tue 16:00
Tue 12:30
Sat 12:00
Update:以下自定义查询(未使用wp\\u query函数)实现了该技巧:

$querystr = "
  SELECT wposts.* 
  FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta1, $wpdb->postmeta wpostmeta2
  WHERE wposts.ID = wpostmeta1.post_id
  AND wposts.ID = wpostmeta2.post_id
  AND wpostmeta1.meta_key = \'class_day\'
  AND wpostmeta2.meta_key = \'class_start\'
  AND wposts.post_type = \'courses\'
  AND wposts.post_status = \'publish\'
  ORDER BY wpostmeta1.meta_value ASC,
           wpostmeta2.meta_value ASC
";
Update 2:对第一次更新的代码进行微小更新。我添加了AND wposts.post_status = \'publish\'. 防止显示草稿和其他状态。这样,只显示和排序已发布的帖子。

1 个回复
SO网友:Dan Bough

只能按1个元值排序。一些帖子(包括this SE answer) 建议添加筛选器以更改顺序。

为主题添加函数function.php 将替换排序顺序的文件:

function change_sort_order( $orderby ) {
    return str_replace(\'wp_posts.post_date\', \'mt2.meta_value, mt1.meta_value\',  $orderby);
}
然后在你想要的地方使用它。确保在使用过滤器后将其移除,以便在使用完毕后不会保持有效。

$args = array(
    \'post_type\' => \'courses\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(\'key\' => \'class_day\'),
        array(\'key\' => \'class_start\')
    )
);
$the_query = new WP_Query( $args );

add_filter(\'posts_orderby\',\'change_sort_order\');
$loop = new WP_Query( $args );
remove_filter(\'posts_orderby\',\'change_sort_order\');

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post

使用带有两个键的META_QUERY对帖子进行排序失败,但可以将其作为单个查询进行分离 - 小码农CODE - 行之有效找到问题解决它

使用带有两个键的META_QUERY对帖子进行排序失败,但可以将其作为单个查询进行分离

时间:2014-08-14 作者:rkoller

我有一个我试图分类的课程列表。为了进行排序,我想使用两个高级自定义字段。首先选择字段class_day 包含日期:

1 : Mon
2 : Tue
3 : Wed
4 : Thu
5 : Fri
6 : Sat
7 : Sun
第一个值专门设置为一个数字,以使其易于排序,而第二个标签值将在前端显示。第二个字段是简单的文本字段class_start 使用数字,例如。19:00. 现在我想按class_day 字段,如果当天发生事件,则根据class_start 文本字段。问题是如果我只按class_day:

$args = array(
    \'post_type\' => \'courses\',
    \'posts_per_page\' => -1,
    \'meta_key\' => \'class_day\',
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'ASC\'
);
$the_query = new WP_Query( $args );
或由class_start:

$args = array(
    \'post_type\' => \'courses\',
    \'posts_per_page\' => -1,
    \'meta_key\' => \'class_start\',
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'ASC\'
);
$the_query = new WP_Query( $args );
每次帖子都被正确分类。一天一次,另一天一次。但如果我尝试将两者合并meta_query 这根本不起作用。

$args = array(
    \'post_type\' => \'courses\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(\'key\' => \'class_day\'),
        array(\'key\' => \'class_start\')
    ),
    \'meta_key\' => \'meta_value\',
    \'orderby\' => \'meta_value_num\',
    \'order\' => \'ASC\'
);
$the_query = new WP_Query( $args );
使用\'relation\' => \'OR\' 帖子只按天排序,但在第二步中,当天的帖子没有按时间正确排序。如果我使用\'relation\' => \'AND\' 因为我遇到了else 回路的情况:

if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();
我的目标是得到一个排序列表,如:

Mon 13:00
Tue 12:30
Tue 16:00
Sat 12:00
但不是:

Mon 13:00
Tue 16:00
Tue 12:30
Sat 12:00
Update:以下自定义查询(未使用wp\\u query函数)实现了该技巧:

$querystr = "
  SELECT wposts.* 
  FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta1, $wpdb->postmeta wpostmeta2
  WHERE wposts.ID = wpostmeta1.post_id
  AND wposts.ID = wpostmeta2.post_id
  AND wpostmeta1.meta_key = \'class_day\'
  AND wpostmeta2.meta_key = \'class_start\'
  AND wposts.post_type = \'courses\'
  AND wposts.post_status = \'publish\'
  ORDER BY wpostmeta1.meta_value ASC,
           wpostmeta2.meta_value ASC
";
Update 2:对第一次更新的代码进行微小更新。我添加了AND wposts.post_status = \'publish\'. 防止显示草稿和其他状态。这样,只显示和排序已发布的帖子。

1 个回复
SO网友:Dan Bough

只能按1个元值排序。一些帖子(包括this SE answer) 建议添加筛选器以更改顺序。

为主题添加函数function.php 将替换排序顺序的文件:

function change_sort_order( $orderby ) {
    return str_replace(\'wp_posts.post_date\', \'mt2.meta_value, mt1.meta_value\',  $orderby);
}
然后在你想要的地方使用它。确保在使用过滤器后将其移除,以便在使用完毕后不会保持有效。

$args = array(
    \'post_type\' => \'courses\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(\'key\' => \'class_day\'),
        array(\'key\' => \'class_start\')
    )
);
$the_query = new WP_Query( $args );

add_filter(\'posts_orderby\',\'change_sort_order\');
$loop = new WP_Query( $args );
remove_filter(\'posts_orderby\',\'change_sort_order\');

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post