phpwordpresswoocommercecanonical-linkyoast

WordPress: Overwrite the canonical URL in YoastSEO


I'm using a snippet to overwrite the canonical URL in YoastSEO for WordPress/WooCommerce. The snippet is based on the official docs example: https://developer.yoast.com/features/seo-tags/canonical-urls/api/

Here's my code:

function prefix_filter_canonical_example( $canonical ) {
 
    if (is_shop() && is_paged() ) :
 
        $canonical = get_permalink(woocommerce_get_page_id( 'shop' )).'page/'.get_query_var('paged').'/';
    
    elseif(WCV_Vendors::is_vendor_page()):
    
        $vendor_shop = urldecode( get_query_var( 'vendor_shop' ) );
        $vendor_id   = WCV_Vendors::get_vendor_id( $vendor_shop );
        $canonical  = WCV_Vendors::get_vendor_shop_page( $vendor_id );
    
    endif;
    
    return $canonical;
    
}   
add_filter( 'wpseo_canonical', 'prefix_filter_canonical_example' );

The code doesn't do anything to the canonical URL regardless of the content I return. But the if/else works fine and if I echo the content of $canonical I see the correct URLs.

I tried it already with the basic storefront theme and I deactivated nearly all plugins. But the snippet won't work. Is there anything I miss?


Solution

  • If you don't pass any priority to the action wordpress will take it as 10. Yoast SEO also call this filter to add canonical url so wordpress executed function in the order in which they were added to the action.

    So change this line

    add_filter( 'wpseo_canonical', 'prefix_filter_canonical_example' );
    

    With this

    add_filter( 'wpseo_canonical', 'prefix_filter_canonical_example', 20 );