在wp_query中,如何通过复杂的计算字段或条件字段进行排序?

时间:2015-10-19 08:29:23

标签: php mysql wordpress wp-query

在wp_query中,是否可以构建一个复杂的查询,以便我可以通过条件或计算字段进行排序? 我试图做的就像MySql中的下一个查询:

SELECT *, field1, field2
  case when field1+field2 > some_value then 1 else 2 end as my_alias
FROM my_table
ORDER BY my_alias ASC

我想使用wp_query构建这样的查询,这可能吗?如果是的话,我该怎么做呢?

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

我没有看到任何方法使用单个WP_Query执行此操作,因为meta_query不允许您具有此类灵活性,但您可以执行三个不同的查询然后合并它们(未经测试的代码):

// Get ongoing events
$ongoing = new WP_Query(array(
    'post_type' => 'event',
    'meta_key' => 'date_from',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'date_from',
            'value' => date('Y-m-d'),
            'compare' => '<=',
            'type' => 'DATE'
        ),
        array(
            'key' => 'date_to',
            'value' => date('Y-m-d'),
            'compare' => '>=',
            'type' => 'DATE'
        )
    )
));
foreach($ongoing as $key => $ongoing_post) {
    $ongoing_post->event_status = 'ongoing';
    $ongoing[$key] = $ongoing_post;
}

// Get upcoming events
$upcoming = new WP_Query(array(
    'post_type' => 'event',
    'meta_key' => 'date_from',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'meta_query' => array(
        array(
            'key' => 'date_from',
            'value' => date('Y-m-d'),
            'compare' => '>',
            'type' => 'DATE'
        )
    )
));
foreach($upcoming as $key => $upcoming_post) {
    $upcoming_post->event_status = 'upcoming';
    $upcoming[$key] = $upcoming_post;
}

// Get past events
$past = new WP_Query(array(
    'post_type' => 'event',
    'meta_key' => 'date_from',
    'orderby' => 'meta_value',
    'order' => 'DESC',
    'meta_query' => array(
        array(
            'key' => 'date_to',
            'value' => date('Y-m-d'),
            'compare' => '<',
            'type' => 'DATE'
        )
    )
));
foreach($past as $key => $past_post) {
    $past_post->past_status = 'past';
    $past[$key] = $past_post;
}

// Merge'em all
$events = array_merge($ongoing, $upcoming, $past);

使用meta_query将元值与实际日期进行比较(您可能希望根据它们在date_fromdate_to字段中的存储方式来更改日期格式),并在向所有帖子对象添加属性后立即执行一个小循环,右侧event_status可以在显示帖子时使用。

也许有一种聪明的方法可以通过WP_Query filters实现这一目标,但需要在WP_Query源代码中进行更深入的调查,因为它并没有真正记录在代码内。

答案 2 :(得分:0)

我使用的东西,试试这个,

<% function foo (timeout, callback) { %>
<%     setTimeout(function () { %>
<%          callback(null, [1, 2, 3, 4]; %>
<%     }, timeout); %>
<% } %>

<% var Deasync = require("deasync") %>
<% var fooSync = Deasync(foo) %>

<ul>
<% supplies = fooSync(1000); %>
<% for(var i=0; i<supplies.length; i++) {%>
<li><%= supplies[i] %></li>
<% } %>
<% }, 1000) %>
</ul>

看看这个Click Here