The get_canonical_url WordPress PHP filter allows you to modify the canonical URL for a specific post.
Usage
add_filter('get_canonical_url', 'your_function_name', 10, 2);
function your_function_name($canonical_url, $post) {
// your custom code here
return $canonical_url;
}
Parameters
$canonical_url(string) – The post’s canonical URL.$post(WP_Post) – Post object.
More information
See WordPress Developer Resources: get_canonical_url
Examples
Add a query string to the canonical URL
This code adds a custom query string to the canonical URL.
add_filter('get_canonical_url', 'add_query_string_to_canonical', 10, 2);
function add_query_string_to_canonical($canonical_url, $post) {
$canonical_url = add_query_arg('ref', 'example', $canonical_url);
return $canonical_url;
}
Change the canonical URL domain
This code changes the domain of the canonical URL to a new domain.
add_filter('get_canonical_url', 'change_canonical_domain', 10, 2);
function change_canonical_domain($canonical_url, $post) {
$new_domain = 'https://www.new-domain.com';
$parsed_url = wp_parse_url($canonical_url);
$canonical_url = str_replace($parsed_url['host'], $new_domain, $canonical_url);
return $canonical_url;
}
Remove the category from the canonical URL
This code removes the category from the canonical URL.
add_filter('get_canonical_url', 'remove_category_from_canonical', 10, 2);
function remove_category_from_canonical($canonical_url, $post) {
$canonical_url = preg_replace('|/category/(.+?)/|', '/', $canonical_url);
return $canonical_url;
}
Set the canonical URL to the home page for a specific post
This code sets the canonical URL to the home page for a specific post.
add_filter('get_canonical_url', 'set_canonical_to_home_page', 10, 2);
function set_canonical_to_home_page($canonical_url, $post) {
if ($post->ID == 123) {
$canonical_url = home_url();
}
return $canonical_url;
}
Disable the canonical URL for certain post types
This code disables the canonical URL for a specific post type.
add_filter('get_canonical_url', 'disable_canonical_for_post_type', 10, 2);
function disable_canonical_for_post_type($canonical_url, $post) {
if ($post->post_type == 'custom_post_type') {
$canonical_url = '';
}
return $canonical_url;
}