Site logo

Archived topic

Category link issue on GP element

21 replies · Started by William on April 9, 2021

Viewing posts 1–15 of 22

Hi there,

On this article, I noticed the category button in the GP header is not working. I understand this as the fact there are two categories for this post, and the snippet code is outputting both links for the link:

function dynamic_category_link_function( $atts ) {
    ob_start();

        $page_id = get_queried_object_id();
        $categories = get_the_category( $page_id );
        foreach($categories as $cat){ 
            $cat_ID = $cat->term_id;
            echo get_category_link($cat_ID); 
        }
    
    return ob_get_clean();  
}
add_shortcode( 'dynamic_category_link', 'dynamic_category_link_function' );

Is there a way to only show the first category as a link?

Hi there,

can you share the Hero markup for the Category link ?

Sure thing, the shortcode for the category link is:

function dynamic_category_link_function( $atts ) {
    ob_start();

        $page_id = get_queried_object_id();
        $categories = get_the_category( $page_id );
        foreach($categories as $cat){ 
            $cat_ID = $cat->term_id;
            echo get_category_link($cat_ID); 
        }
    
    return ob_get_clean();  
}
add_shortcode( 'dynamic_category_link', 'dynamic_category_link_function' );

And the Hero element code is:

<div class="meta-category">
<a class="category-style" href=[dynamic_category_link]>
<span style="background: #039ae5; color: #fff;" class="cat-first-letter">[cat-first-letter]</span>
	<span class="label">[display_category]</span></a>
</div>

<h1 class='post-title'>
	{{post_title}}
</h1>

<div class="post-excerpt">
	[post-excerpt]
</div>

<style>
	
	.page-hero .post-title {
	padding-top: 0px;
}
	
	.meta-category {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
	margin-bottom: 1.5rem;
	font-family: Brawler;
}

.meta-category a {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-ms-flex-align: center;
	align-items: center;
}

.meta-category a.category-style:before {
	-webkit-box-ordinal-group: 3;
	-ms-flex-order: 2;
	order: 2;
	color: #333;
	padding: 0 0.5rem;
	content: '—';
}

.meta-category a:first-child {
	margin-left: 0;
}

.meta-category a .label {
	position: relative;
	-webkit-box-ordinal-group: 4;
	-ms-flex-order: 3;
	order: 3;
	color: #333;
	-webkit-transition: color .15s;
	transition: color .15s;
}
	
.meta-category a .label:after {
	background-color: #222;
	width: 100%;
	height: 1px;
	left: 0;
	opacity: 0;
	pointer-events: none;
	position: absolute;
	top: 100%;
	-webkit-transform: translateY(1px);
	transform: translateY(1px);
	-webkit-transition: all 0.15s cubic-bezier(0.39, 0.575, 0.565, 1);
	transition: all 0.15s cubic-bezier(0.39, 0.575, 0.565, 1);
	-webkit-transition-property: opacity,-webkit-transform;
	transition-property: opacity,-webkit-transform;
	transition-property: opacity,transform;
	transition-property: opacity,transform,-webkit-transform;
	content: "";
}

.meta-category a:hover .label:after {
	opacity: 1;
	-webkit-transform: translateY(-3px) translateZ(0);
	transform: translateY(-3px) translateZ(0);
}
	
	span.cat-first-letter {
		font-size: 3rem;
    width: 4rem;
    height: 4rem;
    line-height: 4rem;
    display: flex;
    justify-content: center;
		align-items: center;
}
	
	@media(max-width:768px){
span.cat-first-letter {
    width: 3.5rem;
    height: 3.5rem;
    line-height: 3.5rem;
		font-size: 2.5rem;
}
}

	.post-excerpt {
		font-size: 1.25rem;
		color: #111;
	}
	
		.meta-category a:hover .label {
    color: #222;
}
	
	.page-hero .inside-page-hero.grid-container {
	background-color: #f7fafc;
	padding-left: 20px;
	padding-right: 20px;
	padding-top: 20px;
	padding-bottom: 1px;
	border-radius: 5px;
	box-shadow: 0px 0px 6px rgba(0, 0, 0, .25);
	margin-left: -10px;
	margin-right: -10px;
} 

@media screen and (min-width:768px) {
	.page-hero {
		padding-left: 15px;
		padding-right: 15px;
	}
	
	.entry-content {
   	padding-left: 10px;
		padding-right: 10px;
	}
}

@media screen and (max-width:320px) {
	.page-hero .post-title {
		font-size: 40px;
	}
}
	
</style>

Try replacing your shortcode snippet with:

function dynamic_category_link_function( $atts ) {
  ob_start();
      $page_id = get_queried_object_id();
      $categories = get_the_category( $page_id );
      echo get_category_link( $categories[0]->term_id );
  
  return ob_get_clean();  
}
add_shortcode( 'dynamic_category_link', 'dynamic_category_link_function' );

That seems to make the link clickable - although this post has two categories, one primary over the other. The text is different to the link - can this be made to match?

The shortcode being used to display category as text is:

add_shortcode( 'display_category', function() {
	
	// SHOW YOAST PRIMARY CATEGORY, OR FIRST CATEGORY
$category = get_the_category();
	
// If post has a category assigned.
if ($category){
	$category_display = '';
	if ( class_exists('WPSEO_Primary_Term') )
	{
		// Show the post's 'Primary' category, if this Yoast feature is available, & one is set
		$wpseo_primary_term = new WPSEO_Primary_Term( 'category', get_the_id() );
		$wpseo_primary_term = $wpseo_primary_term->get_primary_term();
		$term = get_term( $wpseo_primary_term );
		if (is_wp_error($term)) { 
			// Default to first category (not Yoast) if an error is returned
			$category_display = $category[0]->name;
		} else { 
			// Yoast Primary category
			$category_display = $term->name;
		}
	} 
	else {
		// Default, display the first category in WP's list of assigned categories
		$category_display = $category[0]->name;
	}

	// Display category
		return $category_display;

}
	
} );

Do all posts have a primary category ? And if so do i assume you always want the Primary displayed?

I am not sure - but I would like for the link to appear the same as the text appearing - the above code does the text for the category and having the link to always align to the same category.

Pretty complicated, but perhaps this would do it:

function dynamic_category_link_function( $atts ) {
    ob_start();

    $page_id = get_queried_object_id();
    $categories = get_the_category( $page_id );
    $category_link = '';

    if ( class_exists('WPSEO_Primary_Term') ) {
        // Show the post's 'Primary' category, if this Yoast feature is available, & one is set
        $wpseo_primary_term = new WPSEO_Primary_Term( 'category', get_the_id() );
        $wpseo_primary_term = $wpseo_primary_term->get_primary_term();
        $term = get_term( $wpseo_primary_term );

        if ( is_wp_error( $term ) ) { 
            // Default to first category (not Yoast) if an error is returned
            $category_link = get_category_link( $categories[0]->term_id );
        } else { 
            // Yoast Primary category
            $category_link = get_category_link( $term->id );
        }
    } else {
        // Default, display the first category in WP's list of assigned categories
        $category_link = get_category_link( $categories[0]->term_id );
    }

    echo $category_link; 
}
add_shortcode( 'dynamic_category_link', 'dynamic_category_link_function' );

Thanks for that - I've implemented it but it seems to still be pulling the wrong category link here still?

Did it make any difference elsewhere? Or is it the same issue on other multi-category posts?

Same issue on multi-category posts it seems - everything else is fine.

Strange, it's following the exact same logic as the function outputting the name.

What if you replace this:

$page_id = get_queried_object_id();
$categories = get_the_category( $page_id );

With this?:

$categories = get_the_category();

That doesn't seem to make a difference to the link it seems.

Hmm, afraid I'm running out of ideas here.

Can you post the entire code you're using for this in one place so I can see if anything stands out?

Sure thing - I appreciate the help. I think I might have realized why its not working - your code is not in the header element.

The applicable code for the header element is:

<div class="meta-category">
<a class="category-style" href=[dynamic_category_link]>
<span style="background: #039ae5; color: #fff;" class="cat-first-letter">[cat-first-letter]</span>
	<span class="label">[display_category]</span></a>
</div>

Where the snippet for [display_category] is:

add_shortcode( 'display_category', function() {
	
	// SHOW YOAST PRIMARY CATEGORY, OR FIRST CATEGORY
$category = get_the_category();
	
// If post has a category assigned.
if ($category){
	$category_display = '';
	if ( class_exists('WPSEO_Primary_Term') )
	{
		// Show the post's 'Primary' category, if this Yoast feature is available, & one is set
		$wpseo_primary_term = new WPSEO_Primary_Term( 'category', get_the_id() );
		$wpseo_primary_term = $wpseo_primary_term->get_primary_term();
		$term = get_term( $wpseo_primary_term );
		if (is_wp_error($term)) { 
			// Default to first category (not Yoast) if an error is returned
			$category_display = $category[0]->name;
		} else { 
			// Yoast Primary category
			$category_display = $term->name;
		}
	} 
	else {
		// Default, display the first category in WP's list of assigned categories
		$category_display = $category[0]->name;
	}

	// Display category
		return $category_display;

}
	
} );

The code you recommended:

function dynamic_category_link_function( $atts ) {
  ob_start();
      $categories = get_the_category();
      echo get_category_link( $categories[0]->term_id );
  
  return ob_get_clean();  
}
add_shortcode( 'dynamic_category_link', 'dynamic_category_link_function' );

is not included in the header element yet - what would be the best way to include in?

This archived topic is closed to new replies.