【问题标题】:Sort category posts in Wordpress by meta key按元键对 Wordpress 中的类别帖子进行排序
【发布时间】:2018-05-11 21:13:57
【问题描述】:

我会尽量做到简短明了。

我的目标是什么?

我的目标是按元键对我的类别页面中的帖子进行排序。我有一个名为“Rating”的类别,该类别中的每个帖子都有一个名为“Rating”的元键 - 其中是一个数值。

例如,我在“评分”类别中有“餐厅 A”和“餐厅 B”。一个的元键“评分”值为 56,另一个为 40。我想将它们从最高评分显示到最低评分(不是按字母顺序、时间顺序或任何其他方式。)

我尝试了什么?

我已尝试将其直接添加到我的 category.php 文件中:

<?php global $query_string;
$posts = query_posts('posts_per_page=5&cat=rating&meta_key=rating&order=ASC'); 
?>

在这部分之前,它已经在 category.php 文件中:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php fotomag_post_layout(); ?>
<?php endwhile; ?>
<?php endif; ?>

并以此部分结束代码:

<?php wp_reset_query(); ?>

我是怎么失败的?

它部分有效。例如,它确实显示了 5 个帖子,如果我从“评级”类别中的某些帖子中删除元键,它不会在此处显示它们(这是正确的 - 因为查询是显示评级类别中的帖子评级元字段)。但它不按升序或降序排列。

我做错了什么?我应该在我的函数文件中放置任何类型的过滤器或操作挂钩或其他东西吗?我的主题有什么问题吗? (顺便说一下,我没有安装其他插件)

其他文件:

我的 functions.php 文件(下面的答案中提到了 add_action 挂钩)-https://pastebin.com/WYyRknD6

我的 category.php 文件 - https://pastebin.com/nWFgL1bV

我的帖子布局文件(这是在 category.php 文件中调用的文件 - 它可能相关或不相关) - https://pastebin.com/3M6mrQVY

您可以在此处查看页面的实时版本 - https://preprod.pojej.me/category/rating/ - 帖子上显示的数字是“评分”元键字段中的数值(减去 % 符号)。

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    取而代之的是,您需要使用pre_get_posts filter 来修改主查询并让它返回按您的元字段排序的帖子。这样,如果您以后想将此功能扩展到其他类别(或分类法),您只需在一处更改代码。

    例如:

    function wp87615486_custom_sort_rating_category( $query ) {
    
        /**
         * Modify the 'rating' category main query
         * to have it sort posts by meta rating value.
         */
        if (
            is_category( 'rating' ) // we're currently viewing the 'rating' category
            && !is_admin() // and we're not in the admin
            && $query->is_main_query() // and this is WP's main query
        ) {
    
            $posts_per_page = get_option( 'posts_per_page' );
    
            $query->set( 'posts_per_page', $posts_per_page );
            $query->set( 'orderby', 'meta_value' );
            $query->set( 'meta_key', '_lets_review_final_score' );
            $query->set( 'order', 'DESC' ); // ASC will return entries with the lowest rating, DESC the ones with the higher rating
    
        }
    
    }
    add_action( 'pre_get_posts', 'wp87615486_custom_sort_rating_category' );
    

    然后你可以在 category.php 中使用常规的loop

    【讨论】:

    • 嗨@cabrerahector。感谢您的回答并修改它以符合我的问题。所以,如果我是正确的 - 我把它放到 functions.php 文件中,而在 category.php 中什么都没有(好吧,没有添加任何自定义,我只是让文件保持原样,因为它与主题一起出现)以及当用户访问类别页面时对于“评级”,它应该有效吗?只是仔细检查,以免我搞砸了。
    • 是的,基本上就是这样:)
    • 您的代码可以完美编写,但不适用于我的主题。我将它添加到functions.php文件中(你可以在我添加到我的queston的文件中检查它)但没有发生排序。
    • 嘿@HarisMustajbasic。感谢您分享您的代码,这有助于找出问题所在:您使用了错误的元密钥。您正在使用的插件将分数保存在名为_lets_review_final_score 的帖子元中。在您的代码(我用作基础)中,您使用的是review。我相应地更新了我的答案,它现在应该可以工作了。
    • 我已经在我的functions.php 文件中添加了代码,但它仍然不会按字母顺序更新。我有一种预感,您的代码可以在另一个网站上运行,但它不适用于我的 :( 这可能与帖子布局模板或类似的东西有关吗?
    猜你喜欢
    • 2014-08-15
    • 2018-05-18
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多