Exibir postagens da mesma categoria usando o link de publicação seguinte / anterior

Estou usando este código, mas uma vez que eu clique no próximo link de publicação / publicação anterior, eu estou redirecionado para a próxima publicação / publicação anterior de uma categoria diferente.

previous_post_link( '%link', 'Prev post in category', $in_same_term = true ); next_post_link( '%link', 'Next post in category', $in_same_term = true ); 

Estou tentando resolver meu problema usando este artigo .

Aqui está o código que estou usando para posts e categorias, e não estou usando tipos e categorias de postagem personalizados:

 $post_id = $post->ID; $cat = get_the_category(); $current_cat_id = $cat[0]->cat_ID; $args = array( 'category' => $current_cat_id, 'orderby' => 'post_date', 'order' => 'DESC' ); $posts = get_posts( $args ); foreach( $posts as $post ) { echo $post->post_content; } previous_post_link( '%link', 'Prev post in category', $in_same_term = true ); next_post_link( '%link', 'Next post in category', $in_same_term = true ); 

Trata-se basicamente de buscar todas as postagens com base na categoria, e agora quero que o próximo link de publicação / publicação anterior funcione somente para esta categoria específica.

Solutions Collecting From Web of "Exibir postagens da mesma categoria usando o link de publicação seguinte / anterior"

Aqui está o código para obter os links anteriores e próximos da categoria nas postagens:

 < ?php $post_id = $post->ID; // current post ID $cat = get_the_category(); $current_cat_id = $cat[0]->cat_ID; // current category ID $args = array( 'category' => $current_cat_id, 'orderby' => 'post_date', 'order' => 'DESC' ); $posts = get_posts( $args ); // get IDs of posts retrieved from get_posts $ids = array(); foreach ( $posts as $thepost ) { $ids[] = $thepost->ID; } // get and echo previous and next post in the same category $thisindex = array_search( $post_id, $ids ); $previd = isset( $ids[ $thisindex - 1 ] ) ? $ids[ $thisindex - 1 ] : 0; $nextid = isset( $ids[ $thisindex + 1 ] ) ? $ids[ $thisindex + 1 ] : 0; if ( $previd ) { ?>< ?php } if ( $nextid ) { ?>< ?php } 

As funções previous_post_link e next_post_link têm cinco parâmetros: $format : Format string para o link, usado para controlar o que vem antes e depois do link
$link : link texto para exibição
$in_same_term : Se a postagem seguinte / anterior deve estar no mesmo termo de taxonomia que a postagem atual
$excluded_terms : Termos para excluir posts $taxonomy : a taxonomia a ser usada quando $in_same_term é verdadeiro Como você pode ver, o parâmetro $in_same_term faz exatamente o que você precisa. No entanto, você não está usando corretamente no seu código de exemplo. Você realmente está passando o resultado de atribuir true a uma variável $in_same_term . Isso não funcionará: passar um argumento é tão simples como passar um valor:

 previous_post_link( '%link', 'Prev post in category', true ); next_post_link( '%link', 'Next post in category', true ); 

Editar: (editado após OP atualizou sua pergunta) O problema é que o previous_post_link e next_post_link usam o object de postagem global, que você está sobrescrevendo. Para evitar isso, use outro nome de variável em seus $posts -loop, como $singlepost :

 foreach ( $posts as $singlepost ) { echo $singlepost->post_content } 

Desta forma, o object global $post é preservado. Alternativamente, você pode armazenar o object de postagem global em uma variável temporária e redefinir $post novamente mais tarde, mas isso só é realmente necessário se você estiver chamando setup_postdata (o que você não é).

Seu código não faz sentido para mim, além de ter um erro de syntax. À medida que seu código é válido, quando você clica em uma postagem de uma página de publicação / blog, você é levado para a visualização única da postagem como deveria. Somente essa publicação é exibida em single.php.

O problema começa quando você clica nos links de postagem, não importa se for o link de publicação anterior ou seguinte. O que é retornado é todas as postagens dessa categoria específica quando a página seguinte / anterior é carregada. É assim que você codificou seu single.php e por que seus links de publicação não funcionam como você espera.

Eu não usaria get_posts() para configurar meu loop na página single.php. Eu simplesmente usaria o loop normal normal. Confira esta página no códigox sobre Desenvolvimento de Tema

Aqui está um exemplo de um single.php que funcionará como esperado

 < ?php get_header(); ?> 
< ?php // Start the Loop. while ( have_posts() ) : the_post(); ?> < ?php get_template_part( 'content', get_post_format() ); // Previous/next post navigation. previous_post_link( '%link', 'Prev post in category', true ); next_post_link( '%link', 'Next post in category', true ); // If comments are open or we have at least one comment, load up the comment template. if ( comments_open() || get_comments_number() ) { comments_template(); } endwhile; ?>
< ?php get_sidebar( 'content' ); ?>
< ?php get_footer();

Como apontado na outra resposta, vá e tenha uma leitura sobre como usar o next_post_link e o previous_post_link

Eu tive o mesmo problema, MAIS eu precisava de tudo isso para o tipo de postagem personalizado e a taxonomia personalizada. user54318 me apontou para a direção certa, que não é capaz de executar cpt’s, então também vou compartilhar meus resultados aqui:

 //get custom taxonomies. $terms = wp_get_post_terms( get_the_ID(), 'product_cat' ); //last argument is the custom taxonomy. change to desired tax //run through all terms and filter out the one, that i need. $stay_in = array(); foreach( $terms as $term ) : /*this loop looks for a category, that is a children of category id 37. change to your needs. only importance is to build an array of term ids, to be included in the previous/next behaviour, so if you already know your ids, you could also use something like $stay_in = array( 43 ); and skip this whole loop..*/ if ( $term->parent == 37 ) : $stay_in[] = $term->term_id; break; //break out the foreach, if found. endif; endforeach; //get all post ids, that are in my defined category $args = array( 'post_type' => 'product', //custom post type 'posts_per_page' => -1, 'tax_query' => array( array( 'taxonomy' => 'product_cat', // custom taxonomy 'field' => 'term_id', 'terms' => $stay_in, 'operator' => 'IN', //change to your needs.. IN, NOT IN, AND, EXISTS, NOT EXISTS ) ), 'orderby' => 'post_date', 'order' => 'ASC', 'fields' => 'ids', //only return the post ids, not the whole post-objects ); $all_posts = new WP_Query( $args ); //search for the current post by its id and look for the previous / next ids $this_index = array_search( $post->ID, $all_posts->posts ); $prev_id = $all_posts->posts[ $this_index - 1 ]; $next_id = $all_posts->posts[ $this_index + 1 ]; //echo links, if prevoius/next exists if ( ! empty( $prev_id ) ) : echo ''; endif; if ( ! empty( $next_id ) ) : echo ''; endif; wp_reset_postdata();