+ $post_name_html = '<span id="editable-post-name">' . $post_name_abridged . '</span>';
+ $display_link = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, urldecode( $permalink ) );
+
+ $return = '<strong>' . __( 'Permalink:' ) . "</strong>\n";
+ $return .= '<span id="sample-permalink"><a href="' . esc_url( $view_link ) . '"' . $preview_target . '>' . $display_link . "</a></span>\n";
+ $return .= '‎'; // Fix bi-directional text display defect in RTL languages.
+ $return .= '<span id="edit-slug-buttons"><button type="button" class="edit-slug button button-small hide-if-no-js" aria-label="' . __( 'Edit permalink' ) . '">' . __( 'Edit' ) . "</button></span>\n";
+ $return .= '<span id="editable-post-name-full">' . $post_name . "</span>\n";
+ }
+
+ /**
+ * Filter the sample permalink HTML markup.
+ *
+ * @since 2.9.0
+ * @since 4.4.0 Added `$post` parameter.
+ *
+ * @param string $return Sample permalink HTML markup.
+ * @param int $post_id Post ID.
+ * @param string $new_title New sample permalink title.
+ * @param string $new_slug New sample permalink slug.
+ * @param WP_Post $post Post object.
+ */
+ $return = apply_filters( 'get_sample_permalink_html', $return, $post->ID, $new_title, $new_slug, $post );
+
+ return $return;
+}
+
+/**
+ * Output HTML for the post thumbnail meta-box.
+ *
+ * @since 2.9.0
+ *
+ * @global int $content_width
+ * @global array $_wp_additional_image_sizes
+ *
+ * @param int $thumbnail_id ID of the attachment used for thumbnail
+ * @param mixed $post The post ID or object associated with the thumbnail, defaults to global $post.
+ * @return string html
+ */
+function _wp_post_thumbnail_html( $thumbnail_id = null, $post = null ) {
+ global $content_width, $_wp_additional_image_sizes;
+
+ $post = get_post( $post );
+ $post_type_object = get_post_type_object( $post->post_type );
+ $set_thumbnail_link = '<p class="hide-if-no-js"><a href="%s" id="set-post-thumbnail"%s class="thickbox">%s</a></p>';
+ $upload_iframe_src = get_upload_iframe_src( 'image', $post->ID );
+
+ $content = sprintf( $set_thumbnail_link,
+ esc_url( $upload_iframe_src ),
+ '', // Empty when there's no featured image set, `aria-describedby` attribute otherwise.
+ esc_html( $post_type_object->labels->set_featured_image )
+ );
+
+ if ( $thumbnail_id && get_post( $thumbnail_id ) ) {
+ $size = isset( $_wp_additional_image_sizes['post-thumbnail'] ) ? 'post-thumbnail' : array( 266, 266 );
+
+ /**
+ * Filter the size used to display the post thumbnail image in the 'Featured Image' meta box.
+ *
+ * Note: When a theme adds 'post-thumbnail' support, a special 'post-thumbnail'
+ * image size is registered, which differs from the 'thumbnail' image size
+ * managed via the Settings > Media screen. See the `$size` parameter description
+ * for more information on default values.
+ *
+ * @since 4.4.0
+ *
+ * @param string|array $size Post thumbnail image size to display in the meta box. Accepts any valid
+ * image size, or an array of width and height values in pixels (in that order).
+ * If the 'post-thumbnail' size is set, default is 'post-thumbnail'. Otherwise,
+ * default is an array with 266 as both the height and width values.
+ * @param int $thumbnail_id Post thumbnail attachment ID.
+ * @param WP_Post $post The post object associated with the thumbnail.
+ */
+ $size = apply_filters( 'admin_post_thumbnail_size', $size, $thumbnail_id, $post );
+
+ $thumbnail_html = wp_get_attachment_image( $thumbnail_id, $size );
+
+ if ( !empty( $thumbnail_html ) ) {
+ $ajax_nonce = wp_create_nonce( 'set_post_thumbnail-' . $post->ID );
+ $content = sprintf( $set_thumbnail_link,
+ esc_url( $upload_iframe_src ),
+ ' aria-describedby="set-post-thumbnail-desc"',
+ $thumbnail_html
+ );
+ $content .= '<p class="hide-if-no-js howto" id="set-post-thumbnail-desc">' . __( 'Click the image to edit or update' ) . '</p>';
+ $content .= '<p class="hide-if-no-js"><a href="#" id="remove-post-thumbnail" onclick="WPRemoveThumbnail(\'' . $ajax_nonce . '\');return false;">' . esc_html( $post_type_object->labels->remove_featured_image ) . '</a></p>';
+ }
+ }
+
+ /**
+ * Filter the admin post thumbnail HTML markup to return.
+ *
+ * @since 2.9.0
+ *
+ * @param string $content Admin post thumbnail HTML markup.
+ * @param int $post_id Post ID.
+ */
+ return apply_filters( 'admin_post_thumbnail_html', $content, $post->ID );
+}
+
+/**
+ * Check to see if the post is currently being edited by another user.
+ *
+ * @since 2.5.0
+ *
+ * @param int $post_id ID of the post to check for editing
+ * @return integer False: not locked or locked by current user. Int: user ID of user with lock.
+ */
+function wp_check_post_lock( $post_id ) {
+ if ( !$post = get_post( $post_id ) )
+ return false;
+
+ if ( !$lock = get_post_meta( $post->ID, '_edit_lock', true ) )
+ return false;
+
+ $lock = explode( ':', $lock );
+ $time = $lock[0];
+ $user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true );
+
+ /** This filter is documented in wp-admin/includes/ajax-actions.php */
+ $time_window = apply_filters( 'wp_check_post_lock_window', 150 );
+
+ if ( $time && $time > time() - $time_window && $user != get_current_user_id() )
+ return $user;
+ return false;
+}
+
+/**
+ * Mark the post as currently being edited by the current user
+ *
+ * @since 2.5.0
+ *
+ * @param int $post_id ID of the post to being edited
+ * @return bool|array Returns false if the post doesn't exist of there is no current user, or
+ * an array of the lock time and the user ID.
+ */
+function wp_set_post_lock( $post_id ) {
+ if ( !$post = get_post( $post_id ) )
+ return false;
+ if ( 0 == ($user_id = get_current_user_id()) )
+ return false;
+
+ $now = time();
+ $lock = "$now:$user_id";
+
+ update_post_meta( $post->ID, '_edit_lock', $lock );
+ return array( $now, $user_id );
+}
+
+/**
+ * Outputs the HTML for the notice to say that someone else is editing or has taken over editing of this post.
+ *
+ * @since 2.8.5
+ * @return none
+ */
+function _admin_notice_post_locked() {
+ if ( ! $post = get_post() )