web-dev-qa-db-ja.com

タイトル順に並べる

これはよくある質問ですが、私は簡単な答えを見つけることができませんでした。
カスタム投稿タイプのタイトルのリストを生成したいです。 '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番目の単語を使って投稿をソートするための良い方法はありませんか。

2
duduwish

最も簡単な方法は、タイトルを姓/名として保存するだけで、自然にソートされます。テンプレートに出力するときにタイトルを反転できます。

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に仕事をさせます。

2
Milo