web-dev-qa-db-fra.com

Obtenir les titres suivants et précédents dans la barre latérale?

Supposons que j'ai les posts suivants avec les titres suivants:

  • PostA (est attribué à la 'catégorie 1')
  • PostX ( catégorie 2 )
  • PostB (catégorie 1)
  • PostC (catégorie 1)
  • PostD (catégorie 1)
  • PostY ( catégorie 2 )
  • PostE (catégorie 1)
    ...

Lorsqu'un visiteur lira la PostC, comment puis-je afficher dans la barre latérale:


Messages précédents:
'PostA' (ce sont des liens ici, bien sûr)
'PostB'

Messages suivants:
'PostD'
'PostE'


IOW le précédent et les 2 prochains messages de la même catégorie. (Si un article a plus de catégories, nous choisirons la première ou la dernière - cela n'a pas beaucoup d'importance).

De plus, s’il est impossible d’afficher les posts précédents et suivants, il est acceptable de ne publier qu’un post précédent et suivant. (Je sais qu'il existe quelques WP fonctions pour cela, mais nous préférons s'il est possible deux publications).

Aussi, bien sûr, nous voulons afficher les premiers caractères'n'/ du titre (disons 22). Nous ne voulons pas afficher un texte statique comme "Next Post" ou similaire.

TIA

4
John Thomas

Les fonctions WordPress existantes servent uniquement à afficher un message précédent ou suivant. J'ai rapidement écrit des fonctions pour afficher un nombre quelconque de messages.

Collez les éléments suivants dans votre fichier functions.php de thème:

function custom_get_adjacent_posts( $in_same_cat = false, $previous = true, $limit = 2 ) {
    global $post, $wpdb;

    $op = $previous ? '<' : '>';

    if ( $in_same_cat ) {
        $cat_array = wp_get_object_terms($post->ID, 'category', array('fields' => 'ids'));

        $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'category' AND tt.term_id IN (" . implode(',', $cat_array) . ")";
    }

    $posts = $wpdb->get_results( $wpdb->prepare( "SELECT p.* FROM wp_posts AS p $join WHERE p.post_date $op '%s' AND p.post_type = 'post' AND p.post_status = 'publish' ORDER BY p.post_date DESC LIMIT $limit", $post->post_date, $post->post_type ) );

    return $posts;
}

function custom_adjacent_posts_links( $in_same_cat = false, $previous = true, $limit = 2 ) {
    $prev_posts = custom_get_adjacent_posts( $in_same_cat, $previous, $limit );
    if( !empty($prev_posts) ) {
        echo ($previous) ? '<h3>Previous Posts:</h3>' : '<h3>Next Posts:</h3>';
        echo '<ul>';
        foreach( $prev_posts as $prev_post ) {
            $title = apply_filters('the_title', $prev_post->post_title, $prev_post->ID);
            echo '<li><a href="' . get_permalink( $prev_post ) . '">' .$title . '</a></li>';
        }
        echo '</ul>';
    }
}

Dans votre fichier de barre latérale, où vous souhaitez afficher les publications, utilisez custom_adjacent_posts_links( true ); pour afficher les deux publications précédentes de la même catégorie et custom_adjacent_posts_links( true, false ); pour afficher les deux publications suivantes de la même catégorie.

3
sorich87