WP查询的订购结果不适用于orderby和订购参数

问题描述

我的目标是按帖子的名称(存储为($ category [0]-> cat_name))而不是按日期排序。我了解认情况下,wp_query按日期对它们进行排序,这就是为什么当前按日期对它们进行排序的原因,例如:Order Parameters

我的代码如下:

$args = array(
            'post_type' => 'pastpapers','posts_per_page' => 20000,// the value of orderby doesn't change anything
            'orderby' => 'date',// the value of order doesn't change anything
            'order'   => 'DESC','post_status' => 'publish','tax_query' => array(
                 array(
                     'taxonomy' => 'category','field' => 'term_id','terms'    => $category->term_id
                 ),),);

我不认为问题出在我的循环上,但是无论如何这是代码

$dataQuery = new WP_Query($args);
        if ($dataQuery->have_posts()) : 
            while ($dataQuery->have_posts()) : $dataQuery->the_post();
        
                $category = get_the_category($post->ID);
                
                echo '<strong class="d-block text-secondary2 text-uppercase">'. $category[0]->cat_name .'</strong>';

            endwhile; 
        endif; 
        

        // Restore original Post Data
        wp_reset_postdata();

    } // End foreach
    ?>

我尝试更改orderby和order的值,并完全删除它们,但是网站上帖子的顺序没有改变。我认为这是因为它使用的是认顺序,而不是我在orderby和order的参数中输入的任何值。但是我不知道为什么它使用认值而不是我的自定义值。

我已经读过类似的问题:orderby not working

但是仍然不知道如何解决我的问题。 我还在堆栈溢出上读了一个类似的问题,其中似乎是插件覆盖了查询的问题,但我认为情况并非如此,因为我没有使用该插件

任何帮助将不胜感激。

解决方法

我发现了一个可能稍微复杂一点的解决方案,但至少可以解决我的问题。

因此,我试图按标题对WP_query进行排序,并且按默认值(即日期而不是我想要的值)对我的帖子进行排序。

因此,相反,我得到了所有与查询匹配的帖子,将它们放入数组中,如下所示:

$index = 0;
        
        $dataQuery = new WP_Query($args);
        if ($dataQuery->have_posts()) :
            while ($dataQuery->have_posts()) : $dataQuery->the_post();
                $category = get_the_category($post->ID);
                
                $tempLink = get_permalink();
                $tempDate = date('Y',strtotime($post->post_date));
                $tempTitle = get_the_title();
                $tempName = $category[0]->cat_name;
        
                $testArray2 = array(
                    'link' => $tempLink,'date' => $tempDate,'title' => $tempTitle,'name' => $tempName
                );
                
                $testArray[$index++] = $testArray2;
                
            
            endwhile;
        endif;
        wp_reset_postdata();

一旦我将所有想要的帖子都放在我想要的数组中,然后便按照想要的顺序对其进行排序,这很复杂,因为有些标题以1到20之间的数字开头,而其他帖子刚开始没有数字的标题。起初,我只是使用了strcmp()函数,但是它不起作用,因为数字会在字母之前,而我希望它们在字母之后,例如: 代数,函数,4。微分,10。​​因式分解

而不是这样排序: 4.微分,10.因式分解,代数,函数

因此,如果有使用 preg_match_all()函数的数字,我必须首先获得标题中的任何数字,然后将数组转换为使用 implode()函数

然后我检查是否不等于0,这意味着字符串中有一个数字,而不仅仅是没有数字的字符串。

我通过一次只比较一个i和i + 1来对它们进行排序。我知道这不是对它进行排序的最有效方法,但是它可以工作。

我创建了一个变量 $ sorts 并将其设置为数组的大小,并每次都对其递减以确保整个数组都已排序。不太好的编码,但是有效。

这是执行此操作的代码:

$sorts = sizeof($testArray);
        while($sorts > 0) {
            for($i = 0; $i + 1 < sizeof($testArray); $i++) {
                preg_match_all('!\d+!',$testArray[$i]['name'],$matches);
                preg_match_all('!\d+!',$testArray[$i+1]['name'],$matches2);
                $var1 = implode(' ',$matches[0]);
                $var2 = implode(' ',$matches2[0]);

                if($var1 != 0 && $var2 != 0) {
                    if($var1 > $var2) {
                        $temp = $testArray[$i];
                        $testArray[$i] = $testArray[$i+1];
                        $testArray[$i+1] = $temp;
                    }
                }
                else if(($var1 != 0 && $var2 == 0)) {
                    $temp = $testArray[$i];
                    $testArray[$i] = $testArray[$i+1];
                    $testArray[$i+1] = $temp;
                }
                else if(($var1 == 0 && $var2 != 0)) {
                    //do nothing
                }
                else if(strcmp($testArray[$i]['name'],$testArray[$i+1]['name']) > 0) {
                    $temp = $testArray[$i];
                    $testArray[$i] = $testArray[$i+1];
                    $testArray[$i+1] = $temp;
                }
            }
            $sorts--;
        }

一旦我有想要的排序帖子,我需要做的就是一个简单的for循环,并回显我想要的帖子:

for($i = 0; $i < sizeof($testArray); $i++) {
  //echo code
}

然后我们就可以了。