EDIT (有关代码的完整解释,请参阅原始答案)
我的原始答案中的代码按预期工作,但会触发一个已知的bugusort
(检查此处的错误报告#50688)
警告错误:[2]usort():用户比较函数修改了数组
只有当fields
参数在中的参数中设置get_posts
, 因此,我能找到的唯一可行的解决方法是删除fields
参数,并使用正在检索的完整帖子。
这是无bug的工作版本
<?php
$args = array (
\'post_type\' => \'member_data\',
\'post_status\' => \'active\',
\'posts_per_page\' => -1,
\'meta_query\' => array(
array(
\'key\' => \'first_name\',
),
array(
\'key\' => \'last_name\',
),
array(
\'key\' => \'publicly_listed\',
\'value\' => \'true\',
),
),
);
$posts = get_posts( $args );
usort( $posts, function( $a, $b ){
// sort first by last name
$compare = strnatcmp(get_post_meta($a->ID, \'last_name\', true), get_post_meta($b->ID, \'last_name\', true));
// if last names are identical, sort by first name
if(!$compare) {
return strnatcmp(get_post_meta($a->ID, \'first_name\', true), get_post_meta($b->ID, \'first_name\', true));
}else{
return $compare;
}
});
if( $posts ) {
echo "Total Members Found: " . count($posts) . "<br>";
foreach ( $posts as $post ) {
$q = get_post_meta($post->ID);
echo "<b>" . $q[\'first_name\'][0] . " " . $q[\'last_name\'][0] . "</b><br>";
echo $q[\'city\'][0] . ", " . $q[\'state\'][0] . " " . $q[\'zip\'][0] . "<br>";
echo "<a href=\'mailto:" . $q[\'email\'][0] . "\'>" . $q[\'email\'][0] . "</a><br>";
echo "<br>";
}
unset( $post );
}else{
echo "<b>Sorry, we found no active members. Please be sure to check back soon.</b>";
}
}
ORIGINAL ANSWER
不幸的是,没有办法以本机方式进行这种类型的排序,因此您需要在这里采用不同的方法。
使用WP_Query
, 甚至更好get_posts
正常检索您的帖子。在此阶段无需应用任何排序。在我个人看来,这是无用的,因为您只能按一个进行排序meta_value
而不是两个。我宁愿只使用php排序来根据需要排序帖子。(如果要使用分页,请使用WP_Query
).
您将使用usort
要对帖子进行排序,请首先按last_name
, 如果两个或两个以上的人共享同一个last_name
, 我们将根据first_name
.
这是一个概念:在我开始之前,我想指出几件事
您的meta_query
不幸的是,这里一团糟。所有内容都在一个数组中的一个数组中的一个数组中,其中一个数组中应该有3个单独的数组
我宁愿使用get_posts
此处并仅检索post ID,因为您不会使用任何postdata或返回的任何其他数据WP_Query
这是一项相当繁重的操作,因为每个帖子都会访问db两次。你必须注意利用这里的瞬变。
Now for the solution
如上所述使用
get_posts
使用构造查询。我们将检索与这三个匹配的帖子
meta_key
\'s
$args = array (
\'post_type\' => \'member_data\',
\'fields\' => \'ids\',
\'post_status\' => \'active\',
\'posts_per_page\' => -1,
\'meta_query\' => array(
array(
\'key\' => \'first_name\',
),
array(
\'key\' => \'last_name\',
),
array(
\'key\' => \'publicly_listed\',
\'value\' => \'true\',
),
),
);
$posts = get_posts( $args );
我们现在要排序
$posts
通过
last_name
然后
first_name
使用
usort
usort( $posts, function( $a, $b ){
// sort first by last name
$compare = strnatcmp(get_post_meta($a, \'last_name\', true), get_post_meta($b, \'last_name\', true));
// if last names are identical, sort by first name
if(!$compare) {
return strnatcmp(get_post_meta($a, \'first_name\', true), get_post_meta($b, \'first_name\', true));
}else{
return $compare;
}
});
$posts
现在应按字母顺序排序
last_name
, 如果
last_name
对于两个或两个以上的人是相同的,他们将按字母顺序排序
first_name
.
您的循环将如下所示
if( $posts ) {
echo "Total Members Found: " . count($posts) . "<br>";
foreach ( $posts as $post ) {
$q = get_post_meta($post);
echo "<b>" . $q[\'first_name\'][0] . " " . $q[\'last_name\'][0] . "</b><br>";
echo $q[\'city\'][0] . ", " . $q[\'state\'][0] . " " . $q[\'zip\'][0] . "<br>";
echo "<a href=\'mailto:" . $q[\'email\'][0] . "\'>" . $q[\'email\'][0] . "</a><br>";
echo "<br>";
}
unset( $post );
}else{
echo "<b>Sorry, we found no active members. Please be sure to check back soon.</b>";
}
}