Obtendo os próximos e os posts anteriores na barra lateral?

4

Vamos supor que eu tenha as seguintes postagens com os seguintes títulos:

  • PostA (é atribuído à 'categoria 1')
  • PostX ( categoria 2 )
  • PostB (categoria 1)
  • PostC ( categoria 1 )
  • PostD (categoria 1)
  • PostY ( categoria 2 )
  • PostE (categoria 1)
    ...

Quando um visitante ler o PostC, como posso exibir na barra lateral:

Posts anteriores:
  'PostA' (esses são links aqui, é claro)
  'PostB'

Próximos Posts:
   'PostD'
de
   'PostE'

IOW o anterior e os próximos 2 posts da mesma categoria. (Se um post tiver mais categorias, escolheremos o primeiro ou o último - não importa muito).

Além disso, se for impossível exibir o & próximos dois posts é aceitável também apenas um post anterior e próximo. (Eu sei que existem algumas funções do WP para isso, mas nós preferimos que seja possível dois posts).

Além disso, é claro, queremos exibir os primeiros caracteres 'n' do título (digamos 22). Não queremos exibir um texto estático como "Próximo Post" ou similar.

TIA

    
por John Thomas 10.10.2010 / 12:08

1 resposta

3

As funções existentes do WordPress são apenas para exibir uma postagem anterior ou seguinte. Eu rapidamente escrevi funções para exibir qualquer número de posts.

Cole o seguinte no seu arquivo functions.php do tema:

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>';
    }
}

No seu arquivo da barra lateral, onde você deseja exibir as postagens, use custom_adjacent_posts_links( true ); para exibir as duas postagens anteriores na mesma categoria e custom_adjacent_posts_links( true, false ); para exibir as próximas duas postagens na mesma categoria.

    
por sorich87 10.10.2010 / 13:42