web-dev-qa-db-fra.com

Comment puis-je faire en sorte que les liens des articles suivants/précédents soient classés par filtre (par le dernier mot du titre)?

J'essaie d'utiliser les fonctions de lien de message suivant/précédent de Wordpress pour passer d'un message d'un type personnalisé à un autre en fonction du nom de famille d'une personne.

Le type personnalisé représente une personne dont le titre de l'article est au format "Nom de famille".

J'ai commandé les publications sur une page d'archives par nom de famille, mais je ne parviens pas à trouver comment je pourrais obtenir les liens suivants/précédents pour suivre également ce filtre. J'ai vu une autre question similaire et j'ai réussi à commander les liens suivant/précédent par titre mais uniquement par ordre alphabétique du prénom.

Si quelqu'un a une idée de la façon dont cela pourrait être fait, l'aide serait grandement appréciée.

4
Clayton Jones

En examinant les fonctions de chaîne MySQL , il semblerait que vous puissiez utiliser la fonction SUBSTRING_INDEX() :

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

commander par le dernier mot du titre de l'article.

Vous pouvez tester cette méthode dans vos filtres orderby.

Exemple: CPT précédent/suivant - classé par dernier mot dans le titre de l'article

Voici un exemple de la manière dont on pourrait essayer de modifier le lien réponse par @WillLanni:

a) Partie suivante pour le type de publication personnalisé 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) Partie précédente pour le type d'article personnalisé 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 );

où vous modifiez le type de message personnalisé 'cpt' en fonction de vos besoins.

5
birgire