【问题标题】:Orderby function with unexpected result具有意外结果的 Orderby 函数
【发布时间】:2020-01-16 18:26:46
【问题描述】:

我设置了一个查询来列出按某个自定义字段排序的帖子(这是我博客中评论的各个书籍的发布日期)。

$the_query = new WP_Query(array(
    'post_type'         => 'book',
    'posts_per_page'    => 10,
    'meta_key'          => 'book_release_date',
    'meta_type'         => 'NUMERIC',
    'orderby'           => 'meta_value',
    'order'             => 'DESC'
));

然后我这样称呼它:

<?php if( $the_query->have_posts() ): ?>
<?php if (is_category()) { ?>
<div class="page-title" align="center">
<h2 class="page-title-border">
<?php _e(' Books:'); ?> 
<?php echo single_cat_title(); ?> (<?php echo $wp_query->found_posts; ?>) 
</h2>
</div>
<?php } ?><?php while( $the_query->have_posts() ) : $the_query->the_post(); ?>

有一个问题:主页显示帖子基于上次发布的书籍顺序,但是每个类别,研究等现在总是显示为最后发布的书籍的结果,而不考虑请求的类别或用于研究的关键字。

为什么会这样?

奇怪的是,如果我在上面的最新行之后添加&lt;?php wp_reset_query(); ?&gt;,它会正确显示正确的结果,但第一个结果显示 10 倍,始终相同。

【问题讨论】:

    标签: php arrays wordpress


    【解决方案1】:

    将您的自定义 WP_Query 替换为以下内容:

    set_query_var( 'orderby', 'meta_value' );
    set_query_var( 'orderby', 'DESC' );
    set_query_var( 'meta_key', 'book_release_date' );
    set_query_var( 'meta_type', 'NUMERIC' );
    

    听起来您有一个按 Category 等过滤的 Books 工作列表,现在您正尝试利用该列表添加 @987654326 @。如果是这样,那么我看到一个问题:您发布的代码将失去过滤,因为您创建了一个全新的post loopwp_reset_query 恢复过滤后的帖子循环这一事实让我相信我们可以通过 set_query_var 简单地修改这个现有查询,而不是创建一个新的 WP_Query

    奖励:如果您在 functions.php 中使用 pre_get_posts,请执行以下操作:

    function wpse139657_orderby($query){ 
        // Uncomment this if() statement once you confirm that the orderby works
        //if (is_admin() || $query->query_vars['post_type'] != 'book') return $query;
    
        $query->set( 'orderby', 'meta_value' ); 
        $query->set( 'order', 'DESC' ); 
        $query->set( 'meta_key', 'book_release_date' ); 
        $query->set( 'meta_type', 'NUMERIC' );
    
        return $query;
    } 
    add_filter('pre_get_posts','wpse139657_orderby');
    

    【讨论】:

    • 您理解正确。这正是我想要做的。顺便说一句,不幸的是,您的代码无法正常工作。首先是';'在 functions.php 文件中不被接受。我已经将它编辑成','但它仍然不起作用。
    • 嗯。我不知道您为什么必须将分号更改为逗号。当您说“它不起作用”时,您是说它会引发错误吗?还是你说它似乎没有任何效果?
    • 假设我仍然必须使用这个,仍然在 functions.php 文件中,就像我上面发布的那样,如果我用 $the_query = new WP_Query(array( 后跟你的设置查询替换我的代码vars,它不允许我保存,说那些 ';' 不是预期的。如果我用逗号替换 em,它允许我保存,但由于错误而无法加载网站。如果我介绍您的设置查询变量function set_query_var( $var, $value ) { 由于错误,它仍然不能让我保存。对不起,也许我对这个太新手了,你假设我有一些我实际上没有的基本知识:"D
    • 还尝试了以下,但没有工作(它似乎没有任何效果): function wpse139657_orderby(){ set_query_var( 'orderby', 'meta_value' ); set_query_var('orderby', 'DESC'); set_query_var('meta_key', 'book_release_date'); set_query_var('meta_type', 'NUMERIC');} add_filter('pre_get_posts','wpse139657_orderby');
    • 好的,我已根据您的上一条评论为我的答案添加了替代解决方案。
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    相关资源
    最近更新 更多