これはよくある質問ですが、私は簡単な答えを見つけることができませんでした。
カスタム投稿タイプのタイトルのリストを生成したいです。 'orderby' => 'title'
を使用してそれらをアルファベット順に表示させます。タイトルは名前と姓であり、私は姓でソートしたいです。私は、姓と名、および姓フィールドの順序で区切られたメタフィールドを作成できることを知っています。しかし'title'
をexplode
し、2番目のWordを `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();
?>
私はしようとしました:
$gettitle = get_the_title();
$lastname = explode(" ", $gettitle);
次に'orderby' => $lastname[1],
に変更します。しかし、うまくいきません。
タイトルの2番目の単語を使って投稿をソートするための良い方法はありませんか。
最も簡単な方法は、タイトルを姓/名として保存するだけで、自然にソートされます。テンプレートに出力するときにタイトルを反転できます。
Orderbyクエリvarを変更しようとすると、基本的に欠陥があります。順序はMySQLによって作成されます。これはPHPを理解しないため、クエリが発生した後で変更することはできません。
結果がページ分割されることになる場合は、の順序でクエリを実行する必要があります。フィルタ.
結果がページ分割されていない場合は、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...
あなたはおそらくまた名前がちょうど2つの単語より多くである場合を考慮したいと思うでしょう。私は個人的にタイトルをlast name, first name
にしてMySQLに仕事をさせます。