Support » Theme: Hemingway » Next and Previous within the same category

  • Resolved lokiofsassgaard

    (@lokiofsassgaard)


    I’ve found resources for this for other themes, but none of them seem to work for Hemingway. I want next and previous posts to only point to posts within the same category, or child category and can’t figure it out.

    I’m comfortable with child themes and a bit of coding, but not exactly fluent in any of it.

    The page I need help with: [log in to see the link]

Viewing 7 replies - 1 through 7 (of 7 total)
  • @lokiofsassgaard, I found this discussion on StackExchange that got me pointed in the right direction for this idea:

    https://wordpress.stackexchange.com/questions/149826/display-posts-from-the-same-category-using-next-previous-post-link?rq=1

    You will find the navigation code in the content.php file of the theme. Copy the file into your child theme folder and modify it there. Here is my modified version. Look for “Begin Custom Code by Ken Brayton” where the mods are.

    <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    
    	<div class="post-header">
    
    		<?php 
    
    		$post_format = get_post_format();
    
    		// On archive, only output the featured image and title on posts without a post format.
    		if ( ( is_singular() || ! $post_format ) ) :
    		
    			hemingway_the_featured_media( $post );
    
    			if ( get_the_title() ) : 
    
    				$title_elem = is_singular() ? 'h1' : 'h2';
    			
    				?>
    			
    				<<?php echo $title_elem; ?> class="post-title entry-title">
    					<?php if ( ! is_singular() ) : ?>
    						<a href="<?php the_permalink(); ?>" rel="bookmark"><?php the_title(); ?></a>
    					<?php else : ?>
    						<?php the_title(); ?>
    					<?php endif; ?>
    				</<?php echo $title_elem; ?>>
    
    				<?php 
    
    			endif;
    
    		endif;
    
    		do_action( 'hemingway_before_post_meta', $post->ID );
    
    		$post_type = get_post_type();
    		$post_type_outputs_post_meta = hemingway_post_type_has_post_meta_output( $post_type );
    		
    		if ( $post_type_outputs_post_meta ) : ?>
    			
    			<div class="post-meta">
    			
    				<span class="post-date"><a href="<?php the_permalink(); ?>"><?php the_time( get_option( 'date_format' ) ); ?></a></span>
    				
    				<span class="date-sep"> / </span>
    					
    				<span class="post-author"><?php the_author_posts_link(); ?></span>
    
    				<?php if ( comments_open() ) : ?>
    
    					<span class="date-sep"> / </span>
    				
    					<?php comments_popup_link( '<span class="comment">' . __( '0 Comments', 'hemingway' ) . '</span>', __( '1 Comment', 'hemingway' ), __( '% Comments', 'hemingway' ) ); ?>
    
    				<?php endif; ?>
    				
    				<?php if ( current_user_can( 'manage_options' ) ) : ?>
    				
    					<span class="date-sep"> / </span>
    								
    					<?php edit_post_link( __( 'Edit', 'hemingway' ) ); ?>
    				
    				<?php endif; ?>
    										
    			</div><!-- .post-meta -->
    
    			<?php 
    		endif; 
    		
    		do_action( 'hemingway_after_post_meta', $post->ID );
    		
    		?>
    		
    	</div><!-- .post-header -->
    																					
    	<div class="post-content entry-content">
    	
    		<?php
    
    		if ( is_search() ) {
    			the_excerpt();
    		} else {
    			the_content(); 
    		}
    
    		wp_link_pages( array(
    			'before'           => '<nav class="post-nav-links"><span class="label">' . __( 'Pages:', 'hemingway' ) . '</span>',
    			'after'            => '</nav>',
    		) );
    
    		edit_post_link( __( 'Edit', 'hemingway' ), '<p>', '</p>' ); 
    
    		?>
    							
    	</div><!-- .post-content -->
    				
    	<?php if ( is_singular() && $post_type_outputs_post_meta ) : ?>
    	
    		<div class="post-meta-bottom">
    
    			<?php if ( get_the_category() ) : ?>
    															
    				<p class="post-categories"><span class="category-icon"><span class="front-flap"></span></span> <?php the_category( ', ' ); ?></p>
    	
    			<?php endif; ?>
    			
    			<?php if ( has_tag() ) : ?>
    				<p class="post-tags"><?php the_tags( '', '' ); ?></p>
    			<?php endif; ?>
    			
    			
    
    <?php
    
    // ***** Begin Custom Code by Ken Brayton 8/20/2021
    // ***** Credit for this idea goes to Nico Gawenda on the WordPress Development Forum
    // ***** https://wordpress.stackexchange.com/questions/149826/display-posts-from-the-same-category-using-next-previous-post-link?rq=1
    
    $post_id = $post->ID; // Current post ID
    $cat = get_the_category(); // Get the category from the post
    $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 );
    $next_post = isset( $ids[ $thisindex - 1 ] ) ? $ids[ $thisindex - 1 ] : false;
    $prev_post = isset( $ids[ $thisindex + 1 ] ) ? $ids[ $thisindex + 1 ] : false;
    
    ?>
    
    			<?php
    
    //			$prev_post = get_previous_post();
    //			$next_post = get_next_post();
    
    // ***** End Custom Code by Ken Brayton 8/20/2021
    
    			if ( $prev_post || $next_post ) : ?>
    				<nav class="post-nav group">
    											
    					<?php if ( $prev_post ) : ?>
    						<a class="post-nav-older" href="<?php the_permalink( $prev_post ); ?>">
    							<h5><?php _e( 'Previous post', 'hemingway' ); ?></h5>
    							<?php echo get_the_title( $prev_post ); ?>
    						</a>
    					<?php endif; ?>
    					
    					<?php if ( $next_post ) : ?>
    						<a class="post-nav-newer" href="<?php the_permalink( $next_post ); ?>">
    							<h5><?php _e( 'Next post', 'hemingway' ); ?></h5>
    							<?php echo get_the_title( $next_post ); ?>
    						</a>
    					<?php endif; ?>
    
    				</nav><!-- .post-nav -->
    
    			<?php endif; ?>
    								
    		</div><!-- .post-meta-bottom -->
    
    		<?php
    	endif;
    
    	if ( is_singular() ) {
    		comments_template( '', true );
    	}
    
    	?>
    
    </article><!-- .post -->
    
    • This reply was modified 9 months, 1 week ago by kwbrayton.
    Thread Starter lokiofsassgaard

    (@lokiofsassgaard)

    @kwbrayton This is one of the ones I tried. When I use it the “next” button disappears completely, and the “previous” points to the post I’m on. when I used some of the other “fixes” on the SE page, the buttons just disappeared entirely.

    The default navigation for the Hemingway theme is to show the Next/Previous button if there is a next or previous post. When it gets to the end of the list, the Next/Previous will disappear as a clue that there are no more posts in that set. This code limits the set to just a category. The sample code from StackExchange has a couple of tweaks you have to do to get it to work smoothly with Hemingway. I set up a test site to try things out and it seemed to work as expected for me. The sample config.php file I included shows the tweaks I did to the original code. I’d love to let you see it in action on my test site but I’m having issues with my site at the moment. My web host is “working on it”. You can try and see if it will work for you. If you get a database error, keep refreshing and it usually will work.

    https://thekwb.com/wp/blog/

    Pick a category, then big a test blog, then navigate back and forth. Category test1 has 5 test blogs (1-5) and Category test2 has 4 test blogs (6-10).

    As my WordPress skills are also limited, this is about the best I can offer. Hope you can sort it all out.

    Oh yea, there is also a certificate issue with this site. You can safely ignore the warning to continue. One of the things I hope to resolve once my host resolves my hosting issue.

    • This reply was modified 9 months, 1 week ago by kwbrayton.

    @lokiofsassgaard, In light of a good night’s rest, I think I’ve uncovered the cause for the behavior you describe but I don’t have a cure. I’ve learned that if I assign more than one category to a post, it screws up the routine as you described. For this way to work, each post can have only one category assigned to it. I’m not smart enough nor motivated enough to figure out how to overcome that. Good luck sorting this out further.

    Thread Starter lokiofsassgaard

    (@lokiofsassgaard)

    @kwbrayton That’s what I thought too, but it does the same thing even on posts with a single category.

    I also thought maybe it went off of what the first category was, so I structured them so the “relevant” one had a special character in front to make it the first one, and the same result.

    I am utterly stumped on this. I know there are plugins that will do what I want, but they’re all fiddly as heck, and I already feel like I rely on too many plugins as it is, and dread the day one of them stops updating.

    @lokiofsassgaard, Not sure if this will resolve your problem but after reading the code reference for get_previous_post and get_next_post, I noticed a parameter $in_same_term which by default is set to false. I tried changing that to true in content.php and it seems to be working for my test.

    https://developer.wordpress.org/reference/functions/get_previous_post/

    Seems too easy but it’s working.

    $prev_post = get_previous_post(true);
    $next_post = get_next_post(true);

    Change the code around line 113-ish in config.php I’ll be curious to know your results.

    Thread Starter lokiofsassgaard

    (@lokiofsassgaard)

    @kwbrayton Oh my god I have been ripping my hair out all week over this. And it was that.

    Sometimes you just need a second pair of eyes to tell you you’re blind. Thank you. I’d have probably driven myself to madness before I noticed it.

Viewing 7 replies - 1 through 7 (of 7 total)
  • The topic ‘Next and Previous within the same category’ is closed to new replies.