When you install the Yoast plugin for WordPress, you will find that it will automatically generate the canonical tag for you on all web pages. For the majority of installs, you will never need to worry about this. The canonical URL is pretty much always going to be the same URL as the page. This exception will often occur with AMP HTML pages, but any good plugin should handle this for you automatically.
Recently I found an issue where a site was including some unique, custom content and proper listings on the archive pages on WordPress. The default behaviour of Yoast was to set the canonical URL of all archive pages for categories, post types and tags to the base page. This means that any page after page 1 will not get indexed by Google and you will find you get an error in Google Search Console to tell you the canonical URL does not match a URL that you have provided in the sitemap. Strange behaviour considering Yoast also generated the sitemap for this website. None the less, I needed a solution.
Using PHP Code to Change Canonical Tag
The code snippet below can be added to a custom plugin or into a theme. It will use a hook built into the Yoast plugin that will check to see if the “pg” query value exists and if it does, it will make sure that it adds it to the canonical URL before the tag is written to the page. The call to htmlspecialchars is just for safety to make sure that anyone adding dangerous values in the URL for PG will not be able to hijack your site and do some bad stuff.
add_filter('wpseo_canonical' , 'custom_change_canonical', 10,1); function custom_change_canonical($url) { global $post; if(isset($_GET['pg'])) { return $url . "?pg=" . htmlspecialchars($_GET['pg']); } return $url; }