{"id":244,"date":"2025-06-11T18:36:46","date_gmt":"2025-06-11T18:36:46","guid":{"rendered":"https:\/\/www.kwwd.co.uk\/blog\/?p=244"},"modified":"2025-06-11T21:50:59","modified_gmt":"2025-06-11T21:50:59","slug":"add-canonical-and-open-graph-tags-to-wordpress","status":"publish","type":"post","link":"https:\/\/www.kwwd.co.uk\/blog\/add-canonical-and-open-graph-tags-to-wordpress\/","title":{"rendered":"Add Canonical And Open Graph Tags To WordPress"},"content":{"rendered":"<p>Add the following function into your theme&#8217;s functions.php file or as a standalone plugin.<\/p>\n<p>This code will remove any existing WordPress canonical tags and replace them with tags acceptable to Google Search Console.<\/p>\n<p>The existing Canonical Tags are pretty basic and will only display on an article page, whereas the following code takes into account the homepage, archive, category\/tags, search results and article pages as well as outputting the correct previous\/next canonical tags.<\/p>\n<p>The code will also output valid OG tags (Open Graph) for Facebook and Twitter cards &#8211; replace your the values for the variables in the &#8220;Edit&#8221; section to match your Facebook AP ID and Twitter details.<\/p>\n<pre><code class=\"language-php line-numbers\">\r\n\/******************************************************\r\n ** ADD OG TAGS TO HEADER\r\n ** AND CANONICAL\r\n ** Added 11-06-2025\r\n *****************************************************\/\r\n\r\nfunction kwwd_customer_header_code()\r\n{\r\nglobal $wp_query;\r\nif($wp_query-&gt;have_posts())\r\n{\r\n\t \/** Remove WordPress Canonical URL **\/\r\n\tremove_action('embed_head', 'rel_canonical');\r\n\tadd_filter('wpseo_canonical', '__return_false');\r\n\t\/\/ Grab Current Post\/Categry ID\r\n\t$PostID = $wp_query-&gt;post-&gt;ID; \r\n\t\/***************************************\r\n\t** EDIT HERE\r\n\t** SET YOUR DEFAULTS BELOW\r\n\t***************************************\/\r\n\t$FBAppID = '[Numberic_Facebook_App_ID]';\r\n\t$DefaultImage = '[Full_URL_To_Social_Image]';\r\n\t$TwitterCreator = '@[Twitter_Handle]';\r\n\t$TwitterAuthor = '@[Twitter_Handle]';\r\n\t$TweetText = '[Default_Tweet_Text]';\r\n\t$TweetTitle = '[Default_Tweet_Title]';\r\n\t$TwitterAlt = '[Default_Twitter_Card_Alt_text]';\r\n\t\/****************************************\r\n\t** DONE EDITING\r\n\t****************************************\/\r\n\t$AuthorID = '';\r\n\t$AuthorName = '';\r\n\t$thumbnail_id = '';\r\n\t$SocialImage = '';\r\n    echo nl2br ('&lt;!-- KWWD Custom Header --&gt;'). PHP_EOL;\r\n\techo nl2br ('&lt;meta property=\"fb:app_id\" content=\"'.$FBAppID.'\" \/&gt;'). PHP_EOL;\r\n\techo nl2br ('&lt;meta property=\"og:url\" content=\"'.get_permalink($PostID).'\" \/&gt;'). PHP_EOL;\r\n\t\r\n\t\/*********************************************\r\n\t ** HOMEPAGE OR CATEGORY\/ARCHIVE\/ARTICLE PAGE\r\n\t*********************************************\/\r\n\tif(!is_single())\r\n\t{\r\n\t\t\techo nl2br ('&lt;meta property=\"og:type\" content=\"website\" \/&gt;'). PHP_EOL;\r\n\t\t\t\/\/ Add default data\r\n\t\t\t$SocialImage = $DefaultImage;\r\n\t}\r\n\telse\r\n\t{\r\n\t\t\techo nl2br ('&lt;meta property=\"og:type\" content=\"article\" \/&gt;'). PHP_EOL;\r\n\t\t\t\r\n\t\t\t\/********************************\r\n\t\t\t ** CATEGOERY DETAILS\r\n\t\t\t********************************\/\r\n\r\n\t\t\t$CategoryArray = get_the_category($PostID);\r\n\t\t\tif (is_array($CategoryArray) &amp;&amp; !empty($CategoryArray))\r\n\t\t\t{\r\n\t\t\t\t\/\/ We have a valid category so add a section meta tag\r\n\t\t\t\t$CategoryName = $CategoryArray[0]-&gt;name;\r\n\t\t\t\techo nl2br ('&lt;meta property=\"article:section\" content=\"'.$CategoryName.'\"\/&gt;').PHP_EOL;\r\n\t\t\t}\r\n\t\t\techo nl2br ('&lt;meta property=\"article:published_time\" content=\"'.get_the_date('c', $PostID).'\"\/&gt;').PHP_EOL;\r\n\t\t\techo nl2br ('&lt;meta property=\"article:modified_time\" content=\"'.get_the_modified_date('c', $PostID).'\"\/&gt;').PHP_EOL;\r\n\t\t\t\r\n\t\t\t\/********************************\r\n\t\t\t ** AUTHOR DETAILS\r\n\t\t\t********************************\/\r\n\r\n\t\t\t\/\/ GET AUTHOR NAME\r\n\t\t\t$AuthorID = get_post_field ('post_author', $PostID);\r\n\t\t\t$AuthorName = get_the_author_meta('display_name', $AuthorID );\r\n\t\t\techo nl2br ('&lt;meta property=\"article:author\" content=\"'.$AuthorName.'\"\/&gt;').PHP_EOL;\r\n\t\t\t\/\/ GET TWTIITER HANDLE FOR AUTHOR (If available is user meta)\r\n\t\t\tglobal $wpdb;\r\n\t\t\t$user_id = $AuthorID;\r\n\t\t\t$meta_key = 'twitter';\r\n\t\t\t$sql = \"SELECT meta_value FROM {$wpdb-&gt;usermeta} WHERE user_id = %d AND meta_key = %s\";\r\n\t\t\t$prepared_sql = $wpdb-&gt;prepare( $sql, $user_id, $meta_key );\r\n\t\t\t$results = $wpdb-&gt;get_results( $prepared_sql );\r\n\t\t\tif ( !empty( $results ) ) \r\n\t\t\t{\r\n\t\t\t\t$TwitterAuthor = '@'.$results[0]-&gt;meta_value;\r\n\t\t\t\t\r\n\t\t\t}\t\r\n\r\n\t\t\t\/********************************\r\n\t\t\t ** TAGS\r\n\t\t\t********************************\/\r\n\t\t\t$tagString = '';\r\n\t\t\t\t$posttags = get_the_tags($PostID);\r\n\t\t\t\tif ($posttags) {\r\n\t\t\t\t  foreach($posttags as $tag) {\r\n\t\t\t\t\t$tagString .= $tag-&gt;name . ','; \r\n\t\t\t\t  }\r\n\t\t\t\t}\r\n\t\t\tif($tagString!='')\r\n\t\t\t{\t\t\t\t\r\n\t\t\t\t$tagString = rtrim($tagString,',');\r\n\t\t\t\techo nl2br ('&lt;meta property=\"article:tag\" content=\"'.$tagString .'\"\/&gt;').PHP_EOL;\r\n\t\t\t}\r\n\r\n\t\t\t\/********************************\r\n\t\t\t ** TWITTER CARD TEXT\r\n\t\t\t********************************\/\t\t\t\r\n\t\t\t\r\n\t\t\t\/\/ Set Tweet Text\r\n\t\t\r\n\t\t\t$TweetText = esc_html( get_the_excerpt($PostID));\r\n\t\t\t$TweetTitle = get_the_title($PostID);\r\n\t\t\tif($TweetText=='')\r\n\t\t\t\t{\r\n\t\t\t\t\t$TweetText = $TweetTitle;\r\n\t\t\t\t}\r\n\r\n\t\t\t$SocialImage = get_the_post_thumbnail_url($PostID);\t\r\n\t\t\tif($SocialImage=='')\r\n\t\t\t{\t\r\n\t\t\t\t$SocialImage = $DefaultImage;\r\n\t\t\t}\t\r\n\r\n\t\t\t$thumbnail_id = get_post_thumbnail_id($PostID);\r\n\t\t\t$TwitterAlt = get_post_meta($thumbnail_id, '_wp_attachment_image_alt', true); \t\r\n\t\t\tif($TwitterAlt=='')\r\n\t\t\t{\r\n\t\t\t\t$TwitterAlt = $TweetTitle;\r\n\t\t\t}\r\n\t\r\n\t\t}\t\r\n\r\n\r\n\t\t\/********************************\r\n\t\t ** ECHO OUT OG TAGS\r\n\t\t********************************\/\r\n\r\n\t\techo nl2br ('&lt;meta name=\"twitter:card\" content=\"summary_large_image\"&gt;').PHP_EOL;\r\n\t\techo nl2br ('&lt;meta name=\"twitter:creator\" content=\"'.$TwitterAuthor.'\"&gt;').PHP_EOL;\r\n\t\techo nl2br ('&lt;meta name=\"twitter:site\" content=\"'.$TwitterCreator.'\"&gt;').PHP_EOL;\r\n\t\techo nl2br ('&lt;meta name=\"twitter:image\" content=\"'.$SocialImage.'\"&gt;').PHP_EOL;\r\n\t\techo nl2br ('&lt;meta name=\"twitter:image:alt\" content=\"'.$TwitterAlt.'\"&gt;').PHP_EOL;\r\n\t\techo nl2br ('&lt;meta name=\"twitter:title\" content=\"'.$TweetTitle.'\"&gt;').PHP_EOL;\r\n\t\techo nl2br ('&lt;meta name=\"twitter:description\" content=\"'.$TweetText.'\"&gt;').PHP_EOL;\r\n\t\techo nl2br ('&lt;meta property=\"og:title\" content=\"'.$TweetTitle.'\"&gt;').PHP_EOL;\r\n\t\techo nl2br ('&lt;meta property=\"og:description\" content=\"'.$TweetText.'\"&gt;').PHP_EOL;\r\n\t\techo nl2br ('&lt;meta property=\"og:image\" content=\"'.$SocialImage.'\"&gt;\t').PHP_EOL;\r\n\t\r\n\t\t\/***********************\r\n\t\t ** CANONICAL LINKS\r\n\t\t **********************\/\r\n\t\t$current_page = get_query_var('paged') ? get_query_var('paged') : 1;\r\n\t\t$max_num_pages = isset($wp_query-&lt;max_num_pages) ? $wp_query-&lt;max_num_pages : 1;\r\n\t\t$canonical_url = '';\r\n\t\t$prev_rel_url = '';\r\n\t\t$next_rel_url = '';\r\n\t\t$next_page_num = '';\r\n\t\t$prev_page_num = '';\r\n\r\n\t\t\/\/ 1. Singular post or page (only canonical)\r\n\t\tif (is_singular()) {\r\n\t\t\t$canonical_url = esc_url(get_permalink());\r\n\t\t\t$archive_url = esc_url(home_url('\/'));\r\n\t\t}\r\n\r\n\t\t\/\/ 2. Main blog index (first page - only canonical and next)\r\n\t\tif (is_home() && !is_paged() && $max_num_pages &lt; 1) {\r\n\t\t\t$canonical_url = esc_url(home_url('\/'));\r\n\t\t\t$archive_url = esc_url(home_url('\/'));\r\n\t\t\t$next_page_url = home_url('\/page\/2\/');\r\n\t\t\t$next_rel_url = esc_url($next_page_url);\r\n\t\t} elseif (is_home() && !is_paged()) {\r\n\t\t\t$canonical_url = esc_url(home_url('\/'));\r\n\t\t\t$archive_url = esc_url(home_url('\/'));\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t$canonical_url = esc_url(home_url('\/'));\r\n\t\t\t$archive_url = esc_url(home_url('\/'));\r\n\t\t}\r\n\r\n\t\t\/\/ 3. Archive pages (first page - only canonical and next)\r\n\t\t\/\/ If using custom post types we might need to us\r\n\t\t\/\/ get_post_type_archive_link(get_post_type())\r\n\t\t\/\/ and get_term_link(get_queried_object()) for custom categories & tags\r\n\t\tif ( is_archive() && is_day() ) \r\n\t\t{\r\n\t\t\t\t$archive_url = get_day_link(\r\n\t\t\t\t\tget_query_var( 'year' ),\r\n\t\t\t\t\tget_query_var( 'monthnum' ),\r\n\t\t\t\t\tget_query_var( 'day' )\r\n\t\t\t\t);\r\n\t\t\t\t\/\/echo '&gt;!-- DAY ARCHIVE --&lt;';\r\n\t\t\t\t$canonical_url = esc_url( $archive_url );\r\n\r\n\t\t\t} elseif ( is_archive() && is_month() ) {\r\n\t\t\t\t$archive_url = get_month_link(\r\n\t\t\t\t\tget_query_var( 'year' ),\r\n\t\t\t\t\tget_query_var( 'monthnum' )\r\n\t\t\t\t);\r\n\t\t\t\t$canonical_url = esc_url( $archive_url );\r\n\t\t\t\t\/\/echo '&gt;!-- MONTH ARCHIVE --&lt;';\r\n\t\t\t} elseif ( is_archive() && is_year() ) {\r\n\t\t\t\t$archive_url = get_year_link( get_query_var( 'year' ) );\r\n\t\t\t\t\/\/echo '&gt;!-- YEAR ARCHIVE --&lt;'.PHP_EOL;\r\n\t\t\t\t$canonical_url = esc_url( $archive_url );\r\n\t\t\t\t\r\n\r\n\t\t\t} elseif ( is_archive() && is_paged() && $max_num_pages &lt; 1 ) {\r\n\t\t\t\t$archive_url = '';\r\n\t\t\t\tif ( is_category() || is_tag() || is_tax() ) {\r\n\t\t\t\t\t$archive_url = get_term_link( get_queried_object() );\r\n\t\t\t\t} elseif ( is_post_type_archive() ) {\r\n\t\t\t\t\t$archive_url = get_post_type_archive_link( get_post_type() );\r\n\t\t\t\t}\r\n\t\t\t\tif ( $archive_url ) {\r\n\t\t\t\t\t$canonical_url = esc_url( $archive_url );\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\/\/echo '&gt;!-- Category\/Tag\/Taxonomy with paging ARCHIVE --&lt;'.PHP_EOL;\r\n\r\n\t\t\t} elseif ( is_archive() && !is_paged() ) {\r\n\t\t\t\t$archive_url = '';\r\n\t\t\t\tif ( is_category() || is_tag() || is_tax() ) {\r\n\t\t\t\t\t$archive_url = get_term_link( get_queried_object() );\r\n\t\t\t\t} elseif ( is_post_type_archive() ) {\r\n\t\t\t\t\t$archive_url = get_post_type_archive_link( get_post_type() );\r\n\t\t\t\t}\r\n\t\t\t\tif ( $archive_url ) {\r\n\t\t\t\t\t$canonical_url = esc_url( $archive_url );\r\n\t\t\t\t}\r\n\t\t\t\t\/\/echo '&gt;!-- Category\/Tag\/Taxonomy without paging ARCHIVE --&lt;'.PHP_EOL;\r\n\r\n\t\t}\r\n\r\n\t\t\/\/ 4. Pagination for main blog index and archives\r\n\t\tif($max_num_pages &lt; 1)\r\n\t\t{\r\n\t\t\t\/\/ We have paging\r\n\t\t\t$base_url = '';\r\n\t\t\tif (is_home()) {\r\n\t\t\t\t$base_url = home_url('\/');\r\n\t\t\t} elseif (is_category() || is_tag() || is_tax() || is_date()) {\r\n\t\t\t\t$base_url = get_term_link(get_queried_object());\r\n\t\t\t} elseif (is_post_type_archive()) {\r\n\t\t\t\t$base_url = get_post_type_archive_link(get_post_type());\r\n\t\t\t}\r\n\r\n\t\t\tif ($base_url) {\r\n\t\t\t\tif ($current_page &lt; 1) {\r\n\t\t\t\t\t$prev_page = $current_page - 1;\r\n\t\t\t\t\t$prev_page_url = ($prev_page === 1) ? $archive_url : trailingslashit($archive_url) . 'page\/' . $prev_page . '\/';\r\n\t\t\t\t\t$prev_rel_url = esc_url($prev_page_url);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ($current_page &gt; $max_num_pages) {\r\n\t\t\t\t\t$next_page = $current_page + 1;\r\n\t\t\t\t\t$next_page_url = trailingslashit($archive_url) . 'page\/' . $next_page . '\/';\r\n\t\t\t\t\t$next_rel_url = esc_url($next_page_url);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\/\/ 4. Pagination for main blog index and archives\r\n\t\tif ((is_home() || (is_archive()) && is_paged() || is_date()) && is_paged()) {\r\n\t\t\t$base_url = '';\r\n\t\t\tif (is_home()) {\r\n\t\t\t\t$base_url = home_url('\/');\r\n\t\t\t} elseif (is_category() || is_tag() || is_tax()) {\r\n\t\t\t\t$base_url = get_term_link(get_queried_object());\r\n\t\t\t} elseif (is_post_type_archive()) {\r\n\t\t\t\t$base_url = get_post_type_archive_link(get_post_type());\r\n\t\t\t}\r\n\r\n\t\t\tif ($base_url) {\r\n\t\t\t\t$temp_canonical_url = trailingslashit($base_url) . 'page\/' . $current_page . '\/';\r\n\t\t\t\t$canonical_url = esc_url($temp_canonical_url);\r\n\r\n\t\t\t\tif ($current_page &lt; 1) {\r\n\t\t\t\t\t$prev_page = $current_page - 1;\r\n\t\t\t\t\t$prev_page_url = ($prev_page === 1) ? $base_url : trailingslashit($base_url) . 'page\/' . $prev_page . '\/';\r\n\t\t\t\t\t$prev_rel_url = esc_url($prev_page_url);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ($current_page &gt; $max_num_pages) {\r\n\t\t\t\t\t$next_page = $current_page + 1;\r\n\t\t\t\t\t$next_page_url = trailingslashit($base_url) . 'page\/' . $next_page . '\/';\r\n\t\t\t\t\t$next_rel_url = esc_url($next_page_url);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\/\/ 5. Author archives (canonical - you can add prev\/next if author archives are paginated)\r\n\t\tif (is_author()) {\r\n\t\t\t$base_url = esc_url(get_author_posts_url(get_the_author_meta('ID')));\r\n\t\t\t$canonical_url = esc_url($base_url);\r\n\t\t\t\/\/ Add pagination handling for author archives here if needed\r\n\t\t\t\tif ($current_page &lt; 1) {\r\n\t\t\t\t\t$prev_page = $current_page - 1;\r\n\t\t\t\t\t$prev_page_url = ($prev_page === 1) ? $base_url : trailingslashit($base_url) . 'page\/' . $prev_page . '\/';\r\n\t\t\t\t\t$prev_rel_url = esc_url($prev_page_url);\r\n\t\t\t\t\t$canonical_url = trailingslashit($base_url) . 'page\/' . $current_page . '\/';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ($current_page &gt; $max_num_pages) {\r\n\t\t\t\t\t$next_page = $current_page + 1;\r\n\t\t\t\t\t$next_page_url = trailingslashit($base_url) . 'page\/' . $next_page . '\/';\r\n\t\t\t\t\t$next_rel_url = esc_url($next_page_url);\r\n\t\t\t\t}\r\n\t\t}\/\/ END Author\r\n\t\t\r\n\t\t\/\/ 6. Search Result Pages\r\n\t\tif (is_search()) {\r\n\t\t\t$search_query = get_query_var('s');\r\n\t\t\t$base_search_url = get_search_link($search_query);\r\n\t\t\t$current_search_page = get_query_var('paged');\r\n\r\n\t\t\t\/\/ Canonical URL for the current search page\r\n\t\t\t$canonical_url = $base_search_url;\r\n\t\t\tif ($current_search_page &lt; 1) {\r\n\t\t\t\t$canonical_url = add_query_arg('paged', $current_search_page, $base_search_url);\r\n\t\t\t}\r\n\t\t\t$canonical_url = esc_url($canonical_url);\r\n\t\t\t\r\n\r\n\t\t\tif ($current_page &lt; 1) {\r\n\t\t\t\t$prev_page = $current_page - 1;\r\n\t\t\t\t$prev_page_url = ($prev_page === 1) ? $base_search_url. '\/?s='.$search_query : $base_search_url .'page\/' . $prev_page . '\/?s='.$search_query ;\r\n\t\t\t\t$prev_rel_url = esc_url($prev_page_url); \r\n\t\t\t\t$canonical_url = trailingslashit($base_search_url) . 'page\/' . $current_page . '\/?s='.$search_query; \/\/ Search Query Appended\r\n\t\t\t}\r\n\r\n\t\t\tif ($current_page &gt; $max_num_pages) {\r\n\t\t\t\t$next_page = $current_page + 1;\r\n\t\t\t\t$next_page_url = trailingslashit($base_search_url\t\t) . 'page\/' . $next_page . '\/?s='.$search_query; \/\/ Search Query Appended\r\n\t\t\t\t$next_rel_url = esc_url($next_page_url);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\/********************************\r\n\t\t ** ECHO CANONICAL LINKS\r\n\t\t********************************\/\r\n\t\tif($prev_rel_url)\r\n\t\t{\r\n\t\t\techo nl2br('&lt;link rel=\"prev\" href=\"' .$prev_rel_url.'\"&gt;'). PHP_EOL;\r\n\t\t}\t\t\r\n\t\tif($canonical_url)\r\n\t\t{\r\n\t\t\techo nl2br('&lt;link rel=\"cannonical\" href=\"' .$canonical_url.'\"&gt;'). PHP_EOL;\r\n\t\t}\r\n\t\tif($next_rel_url)\r\n\t\t{\r\n\t\t\techo nl2br('&lt;link rel=\"next\" href=\"' .$next_rel_url.'\"&gt;'). PHP_EOL;\r\n\t\t}\r\n\t\t\/** END Canonical Tag **\/\r\n\t\techo nl2br ('&lt;!-- END KWWD Custom Header --&gt;'). PHP_EOL;\r\n } \/\/ END Has Posts Check\t\r\n}\r\n\r\n\/********************************\r\n ** CALL CUSTOM HEADER FUNCTION\r\n ********************************\/\r\nadd_action('wp_head', 'kwwd_customer_header_code', 3);\r\n\/******************************************************\r\n ** END OG\/CANNONICAL TAGS TO HEADER\r\n *****************************************************\/\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Add the following function into your theme&#8217;s functions.php file or as a standalone plugin. This code will remove any existing WordPress canonical tags and replace [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3],"tags":[],"class_list":["post-244","post","type-post","status-publish","format-standard","hentry","category-php","category-wordpress"],"_links":{"self":[{"href":"https:\/\/www.kwwd.co.uk\/blog\/wp-json\/wp\/v2\/posts\/244","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kwwd.co.uk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kwwd.co.uk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kwwd.co.uk\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kwwd.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=244"}],"version-history":[{"count":0,"href":"https:\/\/www.kwwd.co.uk\/blog\/wp-json\/wp\/v2\/posts\/244\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.kwwd.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kwwd.co.uk\/blog\/wp-json\/wp\/v2\/categories?post=244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kwwd.co.uk\/blog\/wp-json\/wp\/v2\/tags?post=244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}