WP Query 的排序结果不适用于 orderby 和 order 参数
Ordering results of WP Query not working for orderby and order parameters
我的目标是按存储为 ($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
}
我们开始吧。
我的目标是按存储为 ($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
}
我们开始吧。