Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按meta键对Wordpress中的类别文章进行排序_Php_Wordpress - Fatal编程技术网

Php 按meta键对Wordpress中的类别文章进行排序

Php 按meta键对Wordpress中的类别文章进行排序,php,wordpress,Php,Wordpress,我会尽量使这段话简短明了 我的目标是什么? 我的目标是按meta键对分类页面中的帖子进行排序。我有一个名为“Rating”的类别,该类别中的每个帖子都有一个名为“Rating”的元键,其中是一个数值 例如,我在“评级”中有“A餐厅”和“B餐厅”。一个元键“评级”值为56,另一个为40。我想让他们从最高评级到最低评级(不是按字母顺序、时间顺序或任何其他方式) 我试过什么? 我已尝试将其直接添加到我的category.php文件中: <?php global $query_string; $p

我会尽量使这段话简短明了

我的目标是什么?

我的目标是按meta键对分类页面中的帖子进行排序。我有一个名为“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 global $query_string;
$posts = query_posts('posts_per_page=5&cat=rating&meta_key=rating&order=ASC'); 
?>

以这一部分结束代码:

<?php wp_reset_query(); ?>

我是怎么失败的?

它部分起作用。例如,它确实显示了5篇文章,如果我从“评级”类别中的一些文章中删除了meta键,则不会在此处显示它们(这是正确的,因为查询是显示评级类别中具有评级元字段的文章)。但它并不是按升序或降序排列的

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

其他文件:

myfunctions.php文件(下面的答案中提到了add_操作钩子)——

My category.php文件-

我的post布局文件(这是在category.php文件中调用的文件-可能相关,也可能不相关)——


您可以在此处查看页面的实时版本——帖子上显示的数字是“评级”元键字段中的数值(减去%符号)。

相反,您需要使用来修改主查询,并让它按照元字段的顺序返回帖子。这样,如果您想在以后将此功能扩展到其他类别(或分类法),您只需要在一个地方更改代码

例如:

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中使用正则表达式。

Hi@cabrerahector。感谢您的回答,并对其进行了修改,使其符合我的问题。因此,如果我是正确的-我把它放在functions.php文件中,而category.php中没有任何内容(好吧,没有自定义添加的内容,我只是保持文件原封不动,因为它与主题一起出现),当用户访问分类页面进行“评级”时,它应该工作吗?只是重复检查,这样我就不会把事情搞砸了。是的,基本上就是这样:)你的代码可以写得很完美,但它对我的主题不起作用。我将它添加到functions.php文件中(您可以在我添加到queston的文件中检查它),但是排序没有发生。感谢分享您的代码,这有助于找出问题所在:您使用了错误的元密钥。您正在使用的插件将分数保存在一个名为
的帖子元中,让您查看\u final\u分数
。在您的代码(我将其用作基础)中,您使用的是
review
。我相应地更新了我的答案,现在应该可以了。我已经在functions.php文件中添加了代码,但它仍然不会按字母顺序更新。我有一种预感,你的代码会在另一个网站上工作,但在我的网站上不会:(这可能与后期布局模板或类似的东西有关吗?