为什么这个Wordpress查询没有正确排序

时间:2016-01-12 20:36:59

标签: wordpress

我有一个名为post_type的自定义special_listing,其中包含一个名为listing_index的自定义字段。 special_listinglisting_index的{​​{1}}应出现在索引为15,然后为10的索引之前,依此类推。然而,这似乎不起作用,列表以他们选择的任何顺序出现。

我不是PHP或Wordpress的人,我主要处理ASP.Net和C#所以这对我来说有点混乱。我正在做一些简单的错误吗?

功能:

// Get the first $count listings with the highest indices for a given $region_slug:
function get_listings($region_slug, $count) {
    $args = array(
        'post_type' => 'special_listing',
        'meta_key' => 'listing_region_slug',
        'meta_value' => $region_slug
    );
    $posts = get_posts($args);

    sort_array_on_field($posts, 'listing_index', 'DESC');
    truncate_array($posts, $count);
    return $posts;
}

查看:

<?php
    $listings = get_listings(get_microsite_slug() . '-microsite-home-featured', 4);
    $i = 0;
    if (sizeof($listings) > 0) : while ($i < sizeof($listings)) : $listing = $listings[$i]; // Loop and set current listing
    ?>
    <section>
        <a href="<?php echo $listing->destination; ?>">
            <h3><?php echo $listing->post_title; ?></h3>
            <p><?php echo $listing->post_content; ?></p>
        </a>
    </section>
    <?php $i++; ?>
<?php endwhile; ?>
<?php endif; ?>

我的尝试:

我不知道如何返回listing_index

function get_sorted_listings($region_slug, $count){
    $args = array(
        'post_type' => 'kodakalaris_listing',
        'meta_query' => array(
            'relation' => 'AND',
            array (
                'key' => 'listing_region_slug',
                'value' => $region_slug
            ),
            array (
                'key' => 'listing_index',
                'value' => ''
            ),
            orderby: 'listing_index',
            order: 'DESC'
        )
    );
    $posts = get_posts($args);
    truncate_array($posts, $count);
    return $posts;
}

更新

尝试新方法,现在按发布日期提取内容。仍然没有按listing_index排序,但至少它也不是完全随机的。我开始寻找meta_query。这不会仅返回单个值的结果吗?我也尝试了this other SO answer,但我发现它的实现令人困惑。

<?php
$args = array(
    'post_type' => 'kodakalaris_listing',
    'meta_key' => 'listing_region_slug',
    'meta_value' => get_microsite_slug() . '-microsite-home-featured',
    'posts_per_page' => 4,
    'order' => 'DESC',
    'orderby' => 'listing_index'
);
$listings = new WP_Query($args);
if ($listings->have_posts()) : while ($listings->have_posts()) : $listings->the_post();
    ?>
    ...
    ...
<?php
endwhile;
endif;
?>

3 个答案:

答案 0 :(得分:0)

查询后不需要排序。 WP_Queryorderby parameters

function get_listings($region_slug, $count) {
    $args = array(
        'post_type' => 'special_listing',
        'meta_key' => 'listing_region_slug',
        'meta_value' => $region_slug,
        'orderby' => 'meta_value_num'
    );
    $posts = new WP_Query($args);

    return $posts;
}

然后,您希望在视图中使用The Loop而不是foreach循环。

答案 1 :(得分:0)

所以我在阅读this article后能够解决这个问题,但基本上为每个meta_query数组指定一个名称可以让您在使用orderby时优先考虑哪个名称。< / p>

$args = array(
    'post_type' => 'special_listing',
    'posts_per_page' => 4,
    'orderby' => 'index_clause',
    'meta_query' => array (
        'site_clause' => array (
            'key' => 'listing_region_slug',
            'value' => get_microsite_slug() . '-microsite-home-featured'
        ),
        'index_clause' => array (
            'key' => 'listing_index',
        )
    )
);

答案 2 :(得分:-1)

将功能更改为:

<?php  
// Get the first $count listings with the highest indices for a given $region_slug:
function get_listings($region_slug, $count) {
    $args = array(
        'post_type' => 'special_listing',
        'orderby'          => 'listing_index',
    'order'            => 'DESC',
        'meta_key' => 'listing_region_slug',
        'meta_value' => $region_slug
    );
    $posts = get_posts($args);
    return $posts;
}