web-dev-qa-db-ja.com

次の/前の投稿へのリンクをフィルタで(タイトルの最後のWordで)並べ替えるにはどうすればよいですか。

Wordpressの次/前の投稿リンク機能を使用して、人の姓に基づいてカスタムタイプの投稿間を移動しようとしています。

カスタムタイプは、 "Forename Surname"という形式の役職を持つ人を表します。

アーカイブページの投稿を姓で並べましたが、次の/前のリンクを使ってこのフィルタをたどることができないかどうかを調べるのに苦労しています。私は別の 似たような質問 を見ました。そして次の/前のリンクをタイトル順に並べることができました。

どのようにこれを行うことができるかについて誰かが何か考えを持っていれば、助けは大いに感謝されるでしょう。

4
Clayton Jones

MySQLの文字列関数 を見ると、 SUBSTRING_INDEX() が使えるように見えます。関数:

ORDER BY SUBSTRING_INDEX( p.post_title, ' ', -1 ) {ASC|DESC} LIMIT 1

投稿タイトルの最後のWordで並べる。

このメソッドはあなたのorderbyフィルタの中でテストできます。

例:前/次のCPT - 役職の最後の単語順

これは@WillLanniによってリンクされた 答え を変更する方法の例です。

a)カスタム投稿タイプcptの次の部分:

// Next CPT
add_filter( 'get_next_post_where', function( $where, $in_same_term, $excluded_terms )
{
    global $post, $wpdb;

    // Edit this custom post type to your needs
    $cpt = 'post';

    // Current post type
    $post_type = get_post_type( $post );

    // Nothing to do    
    if( $in_same_term || ! empty( $excluded_terms ) || $cpt !== $post_type )
        return $where;

    // Next CPT order by last Word in title
    add_filter( 'get_next_post_sort', function( $orderby ) 
    {
        return " ORDER BY SUBSTRING_INDEX( p.post_title, ' ', -1 ) ASC LIMIT 1 ";
    } );

    // Modify Next WHERE part
    return $wpdb->prepare( 
        " WHERE 
            SUBSTRING_INDEX( p.post_title, ' ', -1 ) > SUBSTRING_INDEX( '%s', ' ', -1 ) 
            AND p.post_type = '%s' 
            AND p.post_status = 'publish'
        ", 
        $post->post_title, 
        $post_type 
    );    

}, 10, 3 );

b)カスタム投稿タイプcptの前の部分:

// Previous CPT
add_filter( 'get_previous_post_where', function( $where, $in_same_term, $excluded_terms)
{
    global $post, $wpdb;

    // Edit this custom post type to your needs
    $cpt = 'post';

    // Current post type
    $post_type = get_post_type( $post );

    // Nothing to do    
    if( $in_same_term || ! empty( $excluded_terms ) || $cpt !== $post_type )
        return $where;

    // Previous CPT, order by last Word in post title
    add_filter( 'get_previous_post_sort', function( $orderby )
    {
        return " ORDER BY SUBSTRING_INDEX( p.post_title, ' ', -1 ) DESC LIMIT 1 ";
    } );

    // Modify Prev WHERE part
    return $wpdb->prepare( 
        " WHERE 
            SUBSTRING_INDEX( p.post_title, ' ', -1 ) < SUBSTRING_INDEX( '%s', ' ', -1 ) 
            AND p.post_type = '%s' 
            AND p.post_status = 'publish'
        ", 
        $post->post_title, 
        $post_type 
    );

}, 10, 3 );

必要に応じてカスタム投稿タイプ'cpt'を変更します。

5
birgire