X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/7f1521bf193b382565eb753043c161f4cb3fcda7..53f4633144ed68c8b8fb5861f992b5489894a940:/wp-admin/includes/class-wp-press-this.php diff --git a/wp-admin/includes/class-wp-press-this.php b/wp-admin/includes/class-wp-press-this.php index 257c76dc..58ed2866 100644 --- a/wp-admin/includes/class-wp-press-this.php +++ b/wp-admin/includes/class-wp-press-this.php @@ -146,8 +146,13 @@ class WP_Press_This { } } + $forceRedirect = false; + if ( 'publish' === get_post_status( $post_id ) ) { $redirect = get_post_permalink( $post_id ); + } elseif ( isset( $_POST['pt-force-redirect'] ) && $_POST['pt-force-redirect'] === 'true' ) { + $forceRedirect = true; + $redirect = get_edit_post_link( $post_id, 'js' ); } else { $redirect = false; } @@ -165,7 +170,7 @@ class WP_Press_This { $redirect = apply_filters( 'press_this_save_redirect', $redirect, $post_id, $post['post_status'] ); if ( $redirect ) { - wp_send_json_success( array( 'redirect' => $redirect ) ); + wp_send_json_success( array( 'redirect' => $redirect, 'force' => $forceRedirect ) ); } else { wp_send_json_success( array( 'postSaved' => true ) ); } @@ -201,11 +206,17 @@ class WP_Press_This { continue; } - // @todo Find a more performant to check existence, maybe get_term() with a separate parent check. - if ( ! $cat_id = term_exists( $cat_name, $taxonomy->name, $parent ) ) { - $cat_id = wp_insert_term( $cat_name, $taxonomy->name, array( 'parent' => $parent ) ); + // @todo Find a more performant way to check existence, maybe get_term() with a separate parent check. + if ( term_exists( $cat_name, $taxonomy->name, $parent ) ) { + if ( count( $names ) === 1 ) { + wp_send_json_error( array( 'errorMessage' => __( 'This category already exists.' ) ) ); + } else { + continue; + } } + $cat_id = wp_insert_term( $cat_name, $taxonomy->name, array( 'parent' => $parent ) ); + if ( is_wp_error( $cat_id ) ) { continue; } elseif ( is_array( $cat_id ) ) { @@ -245,46 +256,46 @@ class WP_Press_This { * @return string Source's HTML sanitized markup */ public function fetch_source_html( $url ) { - // Download source page to tmp file. - $source_tmp_file = ( ! empty( $url ) ) ? download_url( $url, 30 ) : ''; - $source_content = ''; - - if ( ! is_wp_error( $source_tmp_file ) && file_exists( $source_tmp_file ) ) { - - // Get the content of the source page from the tmp file.. - $source_content = wp_kses( - @file_get_contents( $source_tmp_file ), - array( - 'img' => array( - 'src' => array(), - 'width' => array(), - 'height' => array(), - ), - 'iframe' => array( - 'src' => array(), - ), - 'link' => array( - 'rel' => array(), - 'itemprop' => array(), - 'href' => array(), - ), - 'meta' => array( - 'property' => array(), - 'name' => array(), - 'content' => array(), - ) - ) - ); + global $wp_version; + + if ( empty( $url ) ) { + return new WP_Error( 'invalid-url', __( 'A valid URL was not provided.' ) ); + } - // All done with backward compatibility. Let's do some cleanup, for good measure :) - unlink( $source_tmp_file ); + $remote_url = wp_safe_remote_get( $url, array( + 'timeout' => 30, + // Use an explicit user-agent for Press This + 'user-agent' => 'Press This (WordPress/' . $wp_version . '); ' . get_bloginfo( 'url' ) + ) ); - } else if ( is_wp_error( $source_tmp_file ) ) { - $source_content = new WP_Error( 'upload-error', sprintf( __( 'Error: %s' ), sprintf( __( 'Could not download the source URL (native error: %s).' ), $source_tmp_file->get_error_message() ) ) ); - } else if ( ! file_exists( $source_tmp_file ) ) { - $source_content = new WP_Error( 'no-local-file', sprintf( __( 'Error: %s' ), __( 'Could not save or locate the temporary download file for the source URL.' ) ) ); + if ( is_wp_error( $remote_url ) ) { + return $remote_url; } + $useful_html_elements = array( + 'img' => array( + 'src' => true, + 'width' => true, + 'height' => true, + ), + 'iframe' => array( + 'src' => true, + ), + 'link' => array( + 'rel' => true, + 'itemprop' => true, + 'href' => true, + ), + 'meta' => array( + 'property' => true, + 'name' => true, + 'content' => true, + ) + ); + + $source_content = wp_remote_retrieve_body( $remote_url ); + $source_content = wp_kses( $source_content, $useful_html_elements ); + return $source_content; } @@ -438,6 +449,9 @@ class WP_Press_This { private function _limit_embed( $src ) { $src = $this->_limit_url( $src ); + if ( empty( $src ) ) + return ''; + if ( preg_match( '/\/\/(m|www)\.youtube\.com\/(embed|v)\/([^\?]+)\?.+$/', $src, $src_matches ) ) { // Embedded Youtube videos (www or mobile) $src = 'https://www.youtube.com/watch?v=' . $src_matches[3]; @@ -453,14 +467,13 @@ class WP_Press_This { } else if ( preg_match( '/\/\/(www\.)?dailymotion\.com\/embed\/video\/([^\/\?]+)([\/\?]{1}.+)?/', $src, $src_matches ) ) { // Embedded Daily Motion videos $src = 'https://www.dailymotion.com/video/' . $src_matches[2]; - } else if ( ! preg_match( '/\/\/(m|www)\.youtube\.com\/watch\?/', $src ) // Youtube video page (www or mobile) - && ! preg_match( '/\/youtu\.be\/.+$/', $src ) // Youtu.be video page - && ! preg_match( '/\/\/vimeo\.com\/[\d]+$/', $src ) // Vimeo video page - && ! preg_match( '/\/\/(www\.)?dailymotion\.com\/video\/.+$/', $src ) // Daily Motion video page - && ! preg_match( '/\/\/soundcloud\.com\/.+$/', $src ) // SoundCloud audio page - && ! preg_match( '/\/\/twitter\.com\/[^\/]+\/status\/[\d]+$/', $src ) // Twitter status page - && ! preg_match( '/\/\/vine\.co\/v\/[^\/]+/', $src ) ) { // Vine video page - $src = ''; + } else { + require_once( ABSPATH . WPINC . '/class-oembed.php' ); + $oembed = _wp_oembed_get_object(); + + if ( ! $oembed->get_provider( $src, array( 'discover' => false ) ) ) { + $src = ''; + } } return $src; @@ -730,6 +743,15 @@ class WP_Press_This { } } } + + // Support passing a single image src as `i` + if ( ! empty( $_REQUEST['i'] ) && ( $img_src = $this->_limit_img( wp_unslash( $_REQUEST['i'] ) ) ) ) { + if ( empty( $data['_images'] ) ) { + $data['_images'] = array( $img_src ); + } elseif ( ! in_array( $img_src, $data['_images'], true ) ) { + array_unshift( $data['_images'], $img_src ); + } + } } /** @@ -761,7 +783,36 @@ class WP_Press_This { $press_this = str_replace( '.css', '-rtl.css', $press_this ); } - return $styles . $press_this; + $open_sans_font_url = ''; + + /* translators: If there are characters in your language that are not supported + * by Open Sans, translate this to 'off'. Do not translate into your own language. + */ + if ( 'off' !== _x( 'on', 'Open Sans font: on or off' ) ) { + $subsets = 'latin,latin-ext'; + + /* translators: To add an additional Open Sans character subset specific to your language, + * translate this to 'greek', 'cyrillic' or 'vietnamese'. Do not translate into your own language. + */ + $subset = _x( 'no-subset', 'Open Sans font: add new subset (greek, cyrillic, vietnamese)' ); + + if ( 'cyrillic' == $subset ) { + $subsets .= ',cyrillic,cyrillic-ext'; + } elseif ( 'greek' == $subset ) { + $subsets .= ',greek,greek-ext'; + } elseif ( 'vietnamese' == $subset ) { + $subsets .= ',vietnamese'; + } + + $query_args = array( + 'family' => urlencode( 'Open Sans:400italic,700italic,400,600,700' ), + 'subset' => urlencode( $subsets ), + ); + + $open_sans_font_url = ',' . add_query_arg( $query_args, 'https://fonts.googleapis.com/css' ); + } + + return $styles . $press_this . $open_sans_font_url; } /** @@ -790,7 +841,7 @@ class WP_Press_This { ?>
-
+
/> _limit_embed( $data['u'] ) ) { + $data['_embeds'][] = $data['u']; + } + if ( ! empty( $data['_embeds'] ) ) { foreach( $data['_embeds'] as $src ) { $prot_relative_src = preg_replace( '/^https?:/', '', $src ); @@ -950,7 +1006,7 @@ class WP_Press_This { * @access public * * @param array $data The site's data. - * @returns array + * @return array */ public function get_images( $data ) { $selected_images = array(); @@ -984,7 +1040,7 @@ class WP_Press_This { * @access public * * @param array $data The site's data. - * @returns string Discovered canonical URL, or empty + * @return string Discovered canonical URL, or empty */ public function get_canonical_link( $data ) { $link = ''; @@ -1015,7 +1071,7 @@ class WP_Press_This { * @access public * * @param array $data The site's data. - * @returns string Discovered site name, or empty + * @return string Discovered site name, or empty */ public function get_source_site_name( $data ) { $name = ''; @@ -1038,14 +1094,14 @@ class WP_Press_This { * @access public * * @param array $data The site's data. - * @returns string Discovered page title, or empty + * @return string Discovered page title, or empty */ public function get_suggested_title( $data ) { $title = ''; if ( ! empty( $data['t'] ) ) { $title = $data['t']; - } elseif( ! empty( $data['_meta'] ) ) { + } elseif ( ! empty( $data['_meta'] ) ) { if ( ! empty( $data['_meta']['twitter:title'] ) ) { $title = $data['_meta']['twitter:title']; } else if ( ! empty( $data['_meta']['og:title'] ) ) { @@ -1067,7 +1123,7 @@ class WP_Press_This { * @access public * * @param array $data The site's data. - * @returns string Discovered content, or empty + * @return string Discovered content, or empty */ public function get_suggested_content( $data ) { $content = $text = ''; @@ -1091,10 +1147,7 @@ class WP_Press_This { $default_html = array( 'quote' => '', 'link' => '', 'embed' => '' ); - require_once( ABSPATH . WPINC . '/class-oembed.php' ); - $oembed = _wp_oembed_get_object(); - - if ( ! empty( $data['u'] ) && $oembed->get_provider( $data['u'], array( 'discover' => false ) ) ) { + if ( ! empty( $data['u'] ) && $this->_limit_embed( $data['u'] ) ) { $default_html['embed'] = '

[embed]' . $data['u'] . '[/embed]

'; if ( ! empty( $data['s'] ) ) { @@ -1148,6 +1201,10 @@ class WP_Press_This { * * @since 4.2.0 * @access public + * + * @global WP_Locale $wp_locale + * @global string $wp_version + * @global bool $is_IE */ public function html() { global $wp_locale, $wp_version; @@ -1157,10 +1214,6 @@ class WP_Press_This { $post_title = $this->get_suggested_title( $data ); - if ( empty( $title ) ) { - $title = __( 'New Post' ); - } - $post_content = $this->get_suggested_content( $data ); // Get site settings array/data. @@ -1310,6 +1363,7 @@ class WP_Press_This { + false, 'autoresize_min_height' => 600, 'wp_autoresize_on' => true, - 'plugins' => 'lists,media,paste,tabfocus,fullscreen,wordpress,wpautoresize,wpeditimage,wpgallery,wplink,wpview', + 'plugins' => 'lists,media,paste,tabfocus,fullscreen,wordpress,wpautoresize,wpeditimage,wpgallery,wplink,wptextpattern,wpview', 'toolbar1' => 'bold,italic,bullist,numlist,blockquote,link,unlink', 'toolbar2' => 'undo,redo', ), - 'quicktags' => false, + 'quicktags' => array( + 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,more', + ), ) ); ?> @@ -1435,13 +1491,22 @@ class WP_Press_This {
  - - - - +
+
+ +
+ +
@@ -1463,4 +1528,8 @@ class WP_Press_This { } } +/** + * + * @global WP_Press_This $wp_press_this + */ $GLOBALS['wp_press_this'] = new WP_Press_This;