Index: wp-includes/link-template.php
===================================================================
--- wp-includes/link-template.php	(revision 36850)
+++ wp-includes/link-template.php	(working copy)
@@ -106,6 +106,52 @@
 }
 
 /**
+ * Retrieves the canonical URL for current post or post ID.
+ *
+ * @param int|WP_Post $post      Optional. Post ID or post object. Default is the global `$post`.
+ *
+ * @return false|string  The canonical URL or false if the post does not exist or has not been published yet.
+ */
+function get_canonical_url( $post = 0 ) {
+	if ( ! is_object( $post ) ) {
+		$post = get_post( $post );
+	}
+
+	if ( 'publish' !== $post->post_status ) {
+		return false;
+	}
+
+	$canonical_url = get_permalink( $post, false );
+
+	// If we're generating a canonical for the current page, make sure it has pagination if needed.
+	if ( $post->ID === get_queried_object_id() ) {
+		$page = get_query_var( 'page' );
+		if ( $page >= 2 ) {
+			if ( '' == get_option( 'permalink_structure' ) ) {
+				$canonical_url = add_query_arg( 'page', $page, $canonical_url );
+			} else {
+				$canonical_url = trailingslashit( $canonical_url ) . user_trailingslashit( $page, 'single_paged' );
+			}
+		}
+
+		$cpage = get_query_var( 'cpage' );
+		if ( $cpage ) {
+			$canonical_url = get_comments_pagenum_link( $cpage );
+		}
+	}
+
+	/**
+	 * Filter the canonical URL.
+	 *
+	 * @since
+	 *
+	 * @param string $string  Canonical URL.
+	 * @param WP_Post $post   Post object. Default is the global `$post`.
+	 */
+	return add_filter( 'get_canonical_url', $canonical_url, $post );
+}
+
+/**
  * Retrieve full permalink for current post or post ID.
  *
  * @since 1.0.0
@@ -3515,21 +3561,8 @@
 		return;
 	}
 
-	$url = get_permalink( $id );
+	$url = get_canonical_url( $id );
 
-	$page = get_query_var( 'page' );
-	if ( $page >= 2 ) {
-		if ( '' == get_option( 'permalink_structure' ) ) {
-			$url = add_query_arg( 'page', $page, $url );
-		} else {
-			$url = trailingslashit( $url ) . user_trailingslashit( $page, 'single_paged' );
-		}
-	}
-
-	$cpage = get_query_var( 'cpage' );
-	if ( $cpage ) {
-		$url = get_comments_pagenum_link( $cpage );
-	}
 	echo '<link rel="canonical" href="' . esc_url( $url ) . "\" />\n";
 }
 
