这是一个常见的问题,我还没有找到一个简单的答案
我想生成自定义帖子类型标题的列表。im使用\'orderby\' => \'title\'
按字母顺序显示。标题是姓名和姓氏,我想按姓氏排序。我知道我可以创建名和姓分开的元字段,并按姓字段排序。但我真的很想看看是否有好的方法explode
这个\'title\'
并将第二个单词传入“orderby”。
这是基本代码:
<?php
// Get the \'Actors\' post type
$args = array(
\'post_type\' => \'actors\',
\'orderby\' => \'title\',
\'order\' => \'ASC\',
\'nopaging\' => true,
\'cache_results\' => false,
\'update_post_meta_cache\' => false
);
$loop = new WP_Query($args);
while($loop->have_posts()): $loop->the_post();
echo \'<li><img src="\' . get_post_meta(get_the_ID(),\'_dtm_small_image\', [0]) . \'"><span>\' . get_the_title() . \'</span></li>\';
endwhile;
wp_reset_query();
?>
Iv\'e试图:
$gettitle = get_the_title();
$lastname = explode(" ", $gettitle);
然后更改为
\'orderby\' => $lastname[1],
. 但它不起作用
是否没有好的方法可以使用标题中的第二个单词对帖子进行排序?
最合适的回答,由SO网友:Milo 整理而成
最简单的方法可能是将标题保存为姓/名,然后它们将自然排序。然后,在模板中输出标题时,可以反转标题。
您试图修改orderby查询变量的做法存在根本缺陷。Order是由MySQL创建的,MySQL不懂PHP,在查询完成后无法修改。
如果要对结果进行分页,则必须通过查询执行顺序,这将需要修改通过过滤器发送到数据库的原始SQL。
如果结果没有分页,您可以使用PHP的usort
:
$loop = new WP_Query( array(
\'posts_per_page\' => -1,
\'post_type\' => \'actors\'
) );
// sort function
function wpd_last_name_sort( $a, $b ) {
$a_last = end(explode(\' \', $a->post_title));
$b_last = end(explode(\' \', $b->post_title));
return strcasecmp( $a_last, $b_last );
}
// sort posts
usort( $loop->posts, \'wpd_last_name_sort\' );
// set post object to first post in sorted list
$loop->post = $loop->posts[0];
// run the loop...
您可能还想考虑这样一种情况,即名称不仅仅是两个单词。我会亲自制作标题
last name, first name
让MySQL来完成这项工作。