Compare commits

...

71 Commits
5.3.2 ... 4.8.2

Author SHA1 Message Date
Aaron Campbell
3a101dd37d Tag 4.8.2
Built from https://develop.svn.wordpress.org/tags/4.8.2@41535


git-svn-id: http://core.svn.wordpress.org/tags/4.8.2@41368 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 22:21:10 +00:00
Dominik Schilling
c38ae9a68f Taxonomy/Users: Use correct escaping function for URLs.
Merge of [41522] to the 4.8 branch.
Built from https://develop.svn.wordpress.org/branches/4.8@41523


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41356 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 21:20:32 +00:00
Dominik Schilling
27433a5d25 Bump 4.8 branch to version 4.8.2.
Built from https://develop.svn.wordpress.org/branches/4.8@41509


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41342 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 19:42:33 +00:00
Aaron Campbell
1b16fc95d8 Database: Hardening to bring wpdb::prepare() inline with documentation.
`wpdb::prepare()` supports %s, %d, and %F as placeholders in the query string. Any other non-escaped % will be escaped.

Merges [41496] to 4.8 branch.


Built from https://develop.svn.wordpress.org/branches/4.8@41497


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41330 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 18:11:31 +00:00
Aaron Campbell
7b17c71213 Database: Don’t trigger _doing_it_wrong() for null values in wpdb::prepare().
While `wpdb::prepare()` does not support null values (see #12819) they still appear in the wild like in the WordPress Importer and other plugins.

Merges [41483] to 4.8 branch.


Built from https://develop.svn.wordpress.org/branches/4.8@41484


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41317 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 16:19:32 +00:00
Aaron Campbell
109695b948 Database: Hardening for wpdb::prepare()
Previously if you passed an array of values for placeholders, additional values could be passed as well. Now additional values will be ignored.

Merges [41470] to 4.8 branch.


Built from https://develop.svn.wordpress.org/branches/4.8@41471


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41304 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 14:55:32 +00:00
John Blackbourn
3e77adc619 Filesystem API: Ensure filenames are valid before attempting to unzip them to ensure malformed file paths don't cause issues.
Merges [41457] to the 4.8 branch.

Built from https://develop.svn.wordpress.org/branches/4.8@41458


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41291 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 14:37:33 +00:00
Aaron Campbell
a9b03b1b80 oEmbed: Add extra hardening around allowed HTML for improved sandboxing.
Merges [41448] to 4.8 branch.



Built from https://develop.svn.wordpress.org/branches/4.8@41450


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41283 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 13:47:33 +00:00
Dominik Schilling
40074d31a0 TinyMCE: Improve the previews for shortcodes.
Merge of [41395] to the 4.8 branch.

Built from https://develop.svn.wordpress.org/branches/4.8@41435


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41268 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 12:41:32 +00:00
Dominik Schilling
460edb5519 Customize: Ensure valid themes in the preview.
Merge of [41397] to the 4.8 branch.

Built from https://develop.svn.wordpress.org/branches/4.8@41429


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41262 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 11:50:31 +00:00
Dominik Schilling
07e1f9a6ca Taxonomy/Users: Provide a fallback for incorrect HTTP referrers.
Merge of [41398] to the 4.8 branch.

Built from https://develop.svn.wordpress.org/branches/4.8@41417


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41250 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 11:11:33 +00:00
John Blackbourn
846bd22a79 General: Add missing URL-encoding and add extra hardening to plugin and template names when they're displayed in the admin area.
Merges [41399], with additions, to the 4.8 branch.

See #13377

Built from https://develop.svn.wordpress.org/branches/4.8@41412


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41245 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 10:21:16 +00:00
Dominik Schilling
1647b11bf4 Editor: Prevent adding javascript: and data: URLs through the inline link dialog.
Merge of [41393] to the 4.8 branch.

Built from https://develop.svn.wordpress.org/branches/4.8@41400


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41233 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 10:15:32 +00:00
Dominik Schilling
a905eb3690 Emoji: Invert value returned by UN test for accuracy.
The JavaScript testing for UN flag support was passing when it failed, and failing when it passes.

This inverts the result to take more traditional approach of returning the correct result.

Merge of [41386] to the 4.8 branch.

Unprops Pento.
Fixes #41852.

Built from https://develop.svn.wordpress.org/branches/4.8@41396


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41229 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 08:29:33 +00:00
Dominik Schilling
d75fad697d Emoji: Update Twemoji to 2.5.0.
* Twemoji 2.3.0 has a rendering issue in Safari, emoji can sometimes be followed by U+FEOF (which is just a flag meaning "render the preceding character as emoji).
* Twemoji wasn't catching this character correctly, and Safari rendered it incorrectly.
* Twemoji 2.5.0 resolves this issue.

Merge of [41250] to the 4.8 branch.

Props peterwilsoncc.
Fixes #41584.
Built from https://develop.svn.wordpress.org/branches/4.8@41394


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41227 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 08:04:33 +00:00
Dominik Schilling
b7d54dd918 Widgets: Prevent visual Text widget from decoding encoded HTML.
Also apply `the_editor_content` filters on widget `text` with `format_for_editor()` as is done for the post editor.

Merge of [41260] to the 4.8 branch.

Amends [40631].
Props westonruter, azaozz.
See #35243.
Fixes #41596.
Built from https://develop.svn.wordpress.org/branches/4.8@41392


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41225 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 07:44:32 +00:00
Dominik Schilling
d82e0f5c86 Widgets: Suppress PHP warnings raised by DOMDocument::loadHTML() in WP_Widget_Text::is_legacy_instance() which could appear in Text widget forms.
Also explicitly use HTML5 doctype when parsing Text widget contents in legacy mode detection.

Merge of [41251] to the 4.8 branch.

Amends [41050].
See #40951.
Fixes #41622.
Built from https://develop.svn.wordpress.org/branches/4.8@41391


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41224 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-19 07:39:33 +00:00
Dominik Schilling
9cbea2762a Bump Akismet external to 3.3.4.
git-svn-id: http://core.svn.wordpress.org/branches/4.8@41169 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-04 20:11:08 +00:00
Dominik Schilling
93ba8ea6fb I18N: Allow numbers in locales during installation.
The current regex was a bit to strict for locales like `pt_PT_ao90` which were already supported by `wp_get_installed_translations()`.

Merge of [41335] to the 4.8 branch.

See #41794.
Built from https://develop.svn.wordpress.org/branches/4.8@41336


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41167 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-09-04 19:38:33 +00:00
John Blackbourn
795af804ba Build/Test tools: Use the latest in the 4.x and 6.x branches of PHPUnit when running tests on Travis for the 4.8 branch.
See #41472

Merges [41294] to the 4.8 branch.

Built from https://develop.svn.wordpress.org/branches/4.8@41295


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41135 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-08-22 17:10:35 +00:00
Weston Ruter
a0153f27c8 Post-4.8.1 version bump for 4.8 branch.
Built from https://develop.svn.wordpress.org/branches/4.8@41212


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41052 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-08-02 21:38:34 +00:00
Weston Ruter
e10af224e2 Bump 4.8 branch to version 4.8.1.
Built from https://develop.svn.wordpress.org/branches/4.8@41210


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41050 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-08-02 20:58:32 +00:00
Weston Ruter
a9897ef218 Post-WordPress 4.8.1 RC2 version bump.
Built from https://develop.svn.wordpress.org/branches/4.8@41203


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41043 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-08-01 22:28:31 +00:00
Weston Ruter
546dcf7fed WordPress 4.8.1 RC2.
Built from https://develop.svn.wordpress.org/branches/4.8@41202


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41042 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-08-01 22:21:32 +00:00
Peter Westwood
30f39b93be Emoji: Revert [41069] as the new Regular Expressions performance on balance significantly worse that the old ones.
See #35293 props @jmdodd

Built from https://develop.svn.wordpress.org/branches/4.8@41201


git-svn-id: http://core.svn.wordpress.org/branches/4.8@41041 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-08-01 21:16:34 +00:00
Gary Pendergast
fee9368d46 REST API: Update the fixture data for wp-api.js tests.
[41139] changed how the REST API URL is generated, but included an incorrect version of `wp-api-generated.js`.

This updates the generator to create the correct `wp-api-generated.js`, and updates ``wp-api-generated.js`.

Repeat of [41154], in the 4.8 branch.
Fixes #40886.


Built from https://develop.svn.wordpress.org/branches/4.8@41155


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40995 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-26 04:06:36 +00:00
Weston Ruter
b9d2c50edd Post-WordPress 4.8.1 RC 1 version bump.
Built from https://develop.svn.wordpress.org/branches/4.8@41144


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40984 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-25 03:20:36 +00:00
Weston Ruter
be70069a0a WordPress 4.8.1 RC1.
Built from https://develop.svn.wordpress.org/branches/4.8@41143


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40983 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-25 03:00:36 +00:00
Weston Ruter
7eccdc89e7 TinyMCE: Fix styling of selected state for linked images containing captions.
Merges [41141] onto 4.8 branch.
Props azaozz.
Fixes #41408 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41142


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40982 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-25 02:21:34 +00:00
Gary Pendergast
7cdc8af10c REST API: Always add index.php to the REST URL when pretty permalinks are disabled.
When pretty permalinks are disabled, the web server will internally forward requests to `index.php`. Unfortunately, nginx only forwards HTTP/1.0 methods: `PUT`, `PATCH`, and `DELETE` methods will return a 405 error.

To work around this nginx behaviour, including `index.php` in the REST URL skips the internal redirect.

Merges 41139 to the 4.8 branch.
Fixes #40886.


Built from https://develop.svn.wordpress.org/branches/4.8@41140


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40980 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-25 00:54:36 +00:00
Weston Ruter
cbfc476b43 Customize: Update Text widget starter content to utilize visual mode.
Merges [41136] onto 4.8 branch.
Amends [38991].
Props dlh, westonruter.
See #35243, #38114.
Fixes #41410 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41137


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40977 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-24 23:27:36 +00:00
Weston Ruter
a17fcecfda Widgets: Improve notice in Text widget's legacy mode.
Retains 'new' in notice on 4.8 branch, in contrast with [41134]. Also fixes phpunit test which broke in [41132].

Merges [41134] onto 4.8 branch.
Props melchoyce, westonruter.
See #41394, #35243, #40951, #40907.
Fixes #41386 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41135


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40975 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-24 23:15:34 +00:00
Weston Ruter
fd423f720e Widgets: Rename Text widget's legacy mode to non-visual mode, restore boolean filter prop, and improve compatibility for widget_text filters applied in Custom HTML widget.
Merges [41132] onto 4.8 branch.
Amends [41050].
Props westonruter, obenland, timmydcrawford for testing.
See #35243, #40951, #40907.
Fixes #41394 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41133


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40973 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-24 22:54:34 +00:00
Weston Ruter
74314b2ddb Bump package.json version to 4.8.1 to fix Tests_Basic::test_package_json failure
Built from https://develop.svn.wordpress.org/branches/4.8@41130


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40970 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-24 22:30:34 +00:00
Weston Ruter
6be40b7a13 WP-API JS Client: Interpret Settings resource as a model.
The REST API does not provide a mechanism to distinguish between endpoints representing models and those representing collections, so the Backbone client must make that distinction internally. Previously wp-api.js accounted for `/users/me`, but not for `/settings`. This patch updates the logic so that `/settings` is properly registered as a Backbone model.

When calling `wp.api.init`, additional endpoints can be specified to be models using the `modelEndpoints` argument.

Merges [41112] onto 4.8 branch.
Props adamsilverstein, kadamwhite.
Fixes #41056 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41126


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40966 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-24 20:46:38 +00:00
Weston Ruter
96da852a31 Widgets: Improve theme styling compatibility for Custom HTML widget by adding content container with textwidget class and widget_text class on widget wrapper element.
The same styling from the Text widget should apply to the Custom HTML widget since users are expected to copy HTML from the (legacy) Text widget into the latter.

Merges [41115] and partially [41116] onto 4.8 branch.
Amends [40893].
See #40907.
Fixes #41392 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41117


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40957 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-21 21:17:37 +00:00
Weston Ruter
6ce522414f Post-WordPress 4.8.1 Beta 1 version bump
Built from https://develop.svn.wordpress.org/branches/4.8@41098


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40938 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-20 00:52:36 +00:00
Weston Ruter
fc475c2d71 WordPress 4.8.1 Beta 1
Built from https://develop.svn.wordpress.org/branches/4.8@41097


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40937 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-20 00:09:35 +00:00
Weston Ruter
ff0656e37c Widgets: Improve Text widget's reliability in syncing Visual tab's contents with Text tab and with hidden sync inputs.
Merges [41094] onto 4.8 branch.
Amends [40631].
Props azaozz, westonruter, rinkuyadav999 for testing.
See #35243.
Fixes #40974 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41095


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40935 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-19 20:51:33 +00:00
Weston Ruter
8575d4e180 REST API: Add a filter to allow modifying the response *after* embedded data is added.
Merges [40961] onto 4.8 branch.
Props jnylen0.
Fixes #38964 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41093


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40933 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-19 20:12:38 +00:00
Weston Ruter
aef4b48187 Widgets: Check for existence of wp.customize.state before attempting to access in Text widget.
Merges [41088] onto 4.8 branch.
Amends [40631].
See #35243.
Fixes #41361 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41089


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40929 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-18 22:40:37 +00:00
Weston Ruter
940c2238ec Widgets: Replace adding balanceTags on widget_custom_html_content filter in favor of just applying widget_text filters in Custom HTML widget.
Ensures that users who copy HTML from the Text widget in legacy mode over to the Custom HTML widget will continue to get all of the same filters applied, including tag balancing and shortcodes, if a plugin added support. Plugins still have the `widget_text_content` and `widget_custom_html_content` filters they can use to target the specific widget types.

Merges [41086] onto 4.8 branch.
Amends [40893].
See #40951.
Fixes #40907 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41087


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40927 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-18 22:19:36 +00:00
Weston Ruter
ec08f02aa4 Widgets: Discount shortcodes and leading/trailing line breaks for triggering Text widget legacy mode.
Since shortcode handling is just-in-time deferred to run after `wpautop`, there is no need to retain the presence of shortcodes to trigger legacy mode. Also updates Text widget legacy mode notice informing of Custom HTML widget.

Merges [41070] onto 4.8 branch.
Amends [41050].
Props westonruter, melchoyce.
Fixes #40951 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41071


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40923 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-18 04:21:35 +00:00
Gary Pendergast
471cb97374 Emoji: Port the Twemoji regex to PHP.
Previously, `wp_encode_emoji()` and `wp_staticize_emoji()` used inaccurate regular expressions to find emoji, and transform then into HTML entities or `<img>`s, respectively. This would result in emoji not being correctly transformed, or occasionally, non-emoji being incorrectly transformed.

This commit adds a new `grunt` task - `grunt precommit:emoji`. It finds the regex in `twemoji.js`, transforms it into a PHP-friendly version, and adds it to `formatting.php`. This task is also automatically run by `grunt precommit`, when it detects that `twemoji.js` has changed.

The new regex requires features introduced in PCRE 8.32, which was introduced in PHP 5.4.14, though it was also backported to later releases of the PHP 5.3 series. For versions of PHP that don't support this, it will fall back to an updated version of the loose-matching regex.

For short posts, the performance difference between the old and new regex is negligible. As the posts get longer, however, the new method is exponentially faster.

Merges [41043], [41045], and [41046] to the 4.8 branch.

Fixes #35293.


Built from https://develop.svn.wordpress.org/branches/4.8@41069


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40921 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-18 03:48:38 +00:00
Weston Ruter
e875520cec Widgets: Bump the TinyMCE panels' base z-index to 500001 so they show in the Customizer (such as in the Text widget).
Merges [40990] and [40995] onto 4.8 branch.
Props greuben, westonruter.
Fixes #41158 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41068


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40920 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-18 03:23:33 +00:00
Weston Ruter
d68bbe13cb TinyMCE: respect the Disable the visual editor when writing user setting and don't output the TinyMCE components when using wp_enqueue_editor().
Merges [40991] onto 4.8 branch.
Props azaozz.
Fixes #40960 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41067


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40919 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-18 01:55:32 +00:00
Weston Ruter
db65c15aba TinyMCE: fix directionality settings for RTL languages.
Merges [40927] to 4.8 branch.
Props westonruter, sa3idho.
Fixes #40972 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41066


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40918 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-18 01:45:34 +00:00
Dominik Schilling
dd7c2798dc Bump Akismet external to 3.3.3.
git-svn-id: http://core.svn.wordpress.org/branches/4.8@40914 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-17 16:06:56 +00:00
Weston Ruter
3f4babe28b Customize: Restrict click target of menu deletion, moving to button from its container.
Merges [41020] onto 4.8 branch.
Props westonruter, afercia.
Fixes #40981 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41057


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40907 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-14 17:44:33 +00:00
Weston Ruter
d32185545b Widgets: Forcibly limit Video widget to only accept oEmbed URLs from YouTube and Vimeo (for now).
Merges [40939] onto 4.8 branch.
Amends [40640].
Props timmydcrawford.
See #34115, #39994.
Fixes #40935 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41056


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40906 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-14 17:41:32 +00:00
Weston Ruter
dbdd48e05e Customize: Restore right border on footer actions.
Fixes regression introduced in [40511].

Merges [40896] onto 4.8 branch.
Props timmydcrawford.
See #32296.
Fixes #40978 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41055


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40905 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-14 17:38:34 +00:00
Weston Ruter
2c82efe8ca Media: Restrict appending loop parameter to Vimeo URLs specifically and not all external URLs in Video widget (via shortcode).
Fixes issue where Video widgets embedding external files fail to get recognized due to the presence of the `loop` param after the video filename, even though it has a recognized extension. Regardless, the `loop` param is only present to fix a Vimeo issue in ME.js 2.x.

Merges [40892] into the 4.8 branch.
Props timmydcrawford.
Amends [40640].
See #39686, #39994.
Fixes #40977 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41054


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40904 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-14 17:34:32 +00:00
Weston Ruter
c4ac9d0ade Widgets: Add legacy mode for Text widget and add usage pointers to default visual mode.
The Text widget in legacy mode omits TinyMCE and retains old behavior for matching pre-existing Text widgets. Usage pointers added to default visual mode appear when attempting to paste HTML code into the Visual tab and when clicking on the Text tab, informing users of the new Custom HTML widget.

Merges [41050] to 4.8 branch.
Props westonruter, melchoyce, gitlost for testing, obenland for testing, dougal for testing, afercia for testing.
See #35243.
Fixes #40951 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41053


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40903 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-14 17:28:32 +00:00
Weston Ruter
e5f6b9078e Widgets: Enqueue assets needed by media and text widgets in their _register_one() methods.
The `WP_Widget::_register_one()` method is more guaranteed to be called as opposed to its wrapper `WP_Widget::_register()` which plugins may bypass for performance reasons.

Merges [41028] to the 4.8 branch.
Amends [40631], [40640].
See #35243, #32417.
Fixes #41021 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41052


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40902 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-14 17:23:32 +00:00
Weston Ruter
2e43bdea3e Widgets: Add accessibility mode support for TinyMCE-enhanced Text and Media widgets (Video, Audio, Images).
Merges [40941] to 4.8 branch.
Amends [40640], [40631].
Props westonruter, afercia.
See #35243, #32417.
Fixes #40986 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41051


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40901 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-14 17:17:33 +00:00
Weston Ruter
5f3b1410fd REST API: Ensure maxwidth and maxheight params are forwarded to oEmbed provider in proxy requests.
Also correct phpdoc return tag on `WP_oEmbed_Controller::get_proxy_item()` and remove dead code in oEmbed controller phpunit tests.

Merges [41047] into 4.8 branch.
Amends [40628].
See #40450.
Fixes #41299 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41049


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40899 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-14 16:19:31 +00:00
Weston Ruter
3a05029032 REST API: Remove _wpnonce value from being used in hashed oEmbed proxy cache key.
Merges [41035] to 4.8 branch.
Amends [40628].
Props r-a-y, westonruter.
See #40450.
Fixes #41048 for 4.8.1.

Built from https://develop.svn.wordpress.org/branches/4.8@41048


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40898 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-14 16:13:35 +00:00
Weston Ruter
2d4418b905 Widgets: Add Custom HTML widget.
Ports [40893], [40926], [41000] to the 4.8 branch.
Props westonruter, timmydcrawford, obenland.
Fixes #40907 for 4.8.

Built from https://develop.svn.wordpress.org/branches/4.8@41044


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40894 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-14 07:41:33 +00:00
Boone Gorges
c4809250ca Taxonomy: Avoid duplicates when querying for terms in taxonomies registered with $args parameter.
[40514] introduced a bug that caused term queries to return some duplicates
when the `$taxonomies` array contained only taxonomies that were originally
registered with an `$args` array. We fix this bug by ensuring that
recursive `get_terms()` queries stop when all queried `$taxonomies` have
already been referenced.

Ports [41037] to the 4.8 branch.

Props bor0, atanasangelovdev.
Fixes #41010.

Built from https://develop.svn.wordpress.org/branches/4.8@41038


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40888 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-13 13:43:33 +00:00
Sergey Biryukov
56f581b195 Embeds: Update oEmbed endpoint URL for VideoPress.
Props NomNom99.
Fixes #41019.

Merges [40901] to the 4.8 branch.
Built from https://develop.svn.wordpress.org/branches/4.8@41025


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40875 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-10 23:20:33 +00:00
Sergey Biryukov
e88ec329f7 Accessibility: Avoid a keyboard trap on the permalink custom structure setting.
Using the `focus` event on the permalink custom structure field made impossible
to navigate through all the form fields using only the keyboard without actually
selecting the custom structure setting. Instead, using click and input preserves
the original functionality when using any kind of pointing or input device.

Also changes `attr()` to `prop()` as recommended for a `checked` property.

Props afercia.
Fixes #40982.

Merges [40897] to the 4.8 branch.
Built from https://develop.svn.wordpress.org/branches/4.8@41024


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40874 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-10 23:16:32 +00:00
Sergey Biryukov
b59b5b9ab8 Comments: In WP_Comments_List_Table::extra_tablenav(), save the state of ::has_items() to a static variable, so that the value is consistent between top and bottom navigation.
This prevents "Empty Spam" and "Empty Trash" buttons from disappearing if there's only one page of comments in Spam/Trash.

Fixes #40975.

Merges [41022] to the 4.8 branch.
Built from https://develop.svn.wordpress.org/branches/4.8@41023


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40873 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-10 23:09:34 +00:00
Joe McGill
93db53b77d Sanity check $uploaderToggler in wp.media.view.UploaderInline.
This ensures `$uploaderToggler` exists before checking length so any views
extending or scripts accessing this view, won't encounter errors that stop execution.

See #41231.

Merges [41009] to the 4.8 branch.

Built from https://develop.svn.wordpress.org/branches/4.8@41010


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40860 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-07-06 00:46:33 +00:00
Ella Iseulde Van Dorpe
b15040f1b2 Bump version for WordPress 4.8
Built from https://develop.svn.wordpress.org/branches/4.8@40888


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40738 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-06-08 14:27:35 +00:00
Aaron Jorbin
408dae699e About: Swap out images and videos for CDN versions, and add responsive images.
Backports [40881] from trunk to 4.8.

Props: melchoyce, joemcgill, pento.

See #40721.


Built from https://develop.svn.wordpress.org/branches/4.8@40887


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-06-08 05:25:33 +00:00
Aaron Jorbin
0d820bf585 About Page: update CSS with prefixes
Backports [40885] from trunk to 4.8.

Seconded by melchoyce.

See #40721.

Built from https://develop.svn.wordpress.org/branches/4.8@40886


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40736 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-06-08 04:53:32 +00:00
Aaron Jorbin
9c577e4d04 Bundled Themes - Bump themes in preparation for 4.8
Backports [40883] from trunk to 4.8

Change version numbers in stylesheets, fix typo in Twenty Fourteen readme and update copyright dates for themes. Twentysixteen wasn't updated this cycle.

See #40745 for changes that helped push this along.
Fixes #40905.
Props davidakennedy, mrahmadawais, maedahbatool.


Built from https://develop.svn.wordpress.org/branches/4.8@40884


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40734 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-06-08 04:43:33 +00:00
Dominik Schilling
439478f087 Upgrade: Add wp-includes/js/tinymce/plugins/wpembed to $_old_files.
Merge of [40879] to the 4.8 branch.

See #39513, #40942.
Built from https://develop.svn.wordpress.org/branches/4.8@40880


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40730 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-06-07 21:36:33 +00:00
Gary Pendergast
882ab89172 Build: Add npm-shrinkwrap.json
`fsevent` has been manually removed, so it doesn't kill the build server.

Props netweb.
Fixes #40928.


Built from https://develop.svn.wordpress.org/branches/4.8@40878


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40728 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-06-07 00:18:37 +00:00
John Blackbourn
97dcac413f Build/Test Tools: Fix PHP 5.2 compatibility for grandchild methods which expect exceptions to be raised.
This is due to `is_callable( 'parent::setExpectedException' )` not being supported on PHP 5.2 when the method being checked only exists on the grandparent class.

See #39822

Merges [40872] and [40873] to the 4.8 branch.

Built from https://develop.svn.wordpress.org/branches/4.8@40875


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40725 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-06-05 10:41:22 +00:00
Ella Iseulde Van Dorpe
9398dbcbe7 Branch 4.8
Built from https://develop.svn.wordpress.org/branches/4.8@40869


git-svn-id: http://core.svn.wordpress.org/branches/4.8@40719 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2017-06-01 21:43:11 +00:00
97 changed files with 1328 additions and 328 deletions

View File

@@ -43,6 +43,18 @@ include( ABSPATH . 'wp-admin/admin-header.php' );
<a href="freedoms.php" class="nav-tab"><?php _e( 'Freedoms' ); ?></a>
</h2>
<div class="changelog point-releases">
<h3><?php _e( 'Maintenance and Security Releases' ); ?></h3>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.',
'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.', 5 ), '4.8.2', number_format_i18n( 5 ) ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.8.2' ); ?>
</p>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed %2$s bug.',
'<strong>Version %1$s</strong> addressed %2$s bugs.', 29 ), '4.8.1', number_format_i18n( 29 ) ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.8.1' ); ?>
</p>
</div>
<div class="feature-section one-col">
<div class="col">
<h2><?php _e( 'An Update with You in Mind' ); ?></h2>
@@ -59,11 +71,42 @@ include( ABSPATH . 'wp-admin/admin-header.php' );
<div class="col">
<picture>
<!-- Large image -->
<source media="(min-width: 1050px)" srcset="https://cldup.com/-951havc3C.png" />
<source media="( min-width: 1050px )"
srcset="
https://s.w.org/images/core/4.8/widgets-with-all-four-widescreen_w_810.png 810w,
https://s.w.org/images/core/4.8/widgets-with-all-four-widescreen_w_1054.png 1054w,
https://s.w.org/images/core/4.8/widgets-with-all-four-widescreen_w_1266.png 1266w,
https://s.w.org/images/core/4.8/widgets-with-all-four-widescreen_w_1458.png 1458w,
https://s.w.org/images/core/4.8/widgets-with-all-four-widescreen_w_1633.png 1633w,
https://s.w.org/images/core/4.8/widgets-with-all-four-widescreen_w_1797.png 1797w,
https://s.w.org/images/core/4.8/widgets-with-all-four-widescreen_w_1955.png 1955w,
https://s.w.org/images/core/4.8/widgets-with-all-four-widescreen_w_2100.png 2100w"
sizes="( max-width: 1290px ) calc( 100vw - 240px ), 1050px" />
<!-- Medium image -->
<source media="(min-width: 601px)" srcset="https://cldup.com/60ktdYzv0l.png" />
<source media="( min-width: 601px )"
srcset="
https://s.w.org/images/core/4.8/widgets-with-all-four_w_531.png 531w,
https://s.w.org/images/core/4.8/widgets-with-all-four_w_745.png 745w,
https://s.w.org/images/core/4.8/widgets-with-all-four_w_927.png 927w,
https://s.w.org/images/core/4.8/widgets-with-all-four_w_1089.png 1089w,
https://s.w.org/images/core/4.8/widgets-with-all-four_w_1236.png 1236w,
https://s.w.org/images/core/4.8/widgets-with-all-four_w_1370.png 1370w,
https://s.w.org/images/core/4.8/widgets-with-all-four_w_1498.png 1498w,
https://s.w.org/images/core/4.8/widgets-with-all-four_w_1620.png 1620w"
sizes="( max-width: 782px ) calc( 100vw - 70px ), ( max-width: 960px ) calc( 100vw - 116px ), calc( 100vw - 240px )" />
<!-- Small image -->
<img src="https://cldup.com/mwvU0Zi5wW.png" alt="" />
<img src="https://s.w.org/images/core/4.8/widgets-with-all-four-mobile_w_685.png"
srcset="
https://s.w.org/images/core/4.8/widgets-with-all-four-mobile_w_300.png 300w,
https://s.w.org/images/core/4.8/widgets-with-all-four-mobile_w_451.png 451w,
https://s.w.org/images/core/4.8/widgets-with-all-four-mobile_w_575.png 575w,
https://s.w.org/images/core/4.8/widgets-with-all-four-mobile_w_685.png 685w,
https://s.w.org/images/core/4.8/widgets-with-all-four-mobile_w_784.png 784w,
https://s.w.org/images/core/4.8/widgets-with-all-four-mobile_w_873.png 873w,
https://s.w.org/images/core/4.8/widgets-with-all-four-mobile_w_959.png 959w,
https://s.w.org/images/core/4.8/widgets-with-all-four-mobile_w_1040.png 1040w"
sizes="( max-width: 500px ) calc( 100vw - 40px ), calc( 100vw - 70px )"
alt="" />
</picture>
</div>
</div>
@@ -71,7 +114,7 @@ include( ABSPATH . 'wp-admin/admin-header.php' );
<div class="feature-section two-col">
<div class="col">
<h3><?php _e( 'Image Widget' ); ?></h3>
<p><?php _e( 'Adding an image to a widget is now a simple task that is achievable for any WordPress user without needing to know code. Simply insert your image right within the widget settings. Try adding something like a headshot or a photo of your latest weekend adventure &mdash; and see it appear automatically.' );?></p>
<p><?php _e( 'Adding an image to a widget is now a simple task that is achievable for any WordPress user without needing to know code. Simply insert your image right within the widget settings. Try adding something like a headshot or a photo of your latest weekend adventure &mdash; and see it appear automatically.' ); ?></p>
</div>
<div class="col">
<h3><?php _e( 'Video Widget' ); ?></h3>
@@ -97,8 +140,8 @@ include( ABSPATH . 'wp-admin/admin-header.php' );
<div class="col">
<?php
echo wp_video_shortcode( array(
'mp4' => 'https://cldup.com/LHwC1lL_jC.mp4',
'poster' => 'https://cldup.com/wx7uMMXJor.png',
'mp4' => 'https://s.w.org/images/core/4.8/link-boundaries.mp4',
'poster' => 'https://s.w.org/images/core/4.8/link-boundaries.png',
'width' => 1140,
'height' => 624,
// 'class' => 'wp-video-shortcode feature-video',
@@ -120,7 +163,23 @@ include( ABSPATH . 'wp-admin/admin-header.php' );
<p><?php _e( 'Being part of the community can help you improve your WordPress skills and network with people you wouldn&#8217;t otherwise meet. Now you can easily find your local events just by logging in to your dashboard and looking at the new Events and News dashboard widget.' ); ?>
</div>
<div class="col">
<img src="https://cldup.com/GuISab3_X1.png" alt="" />
<img
src="https://s.w.org/images/core/4.8/events-widget_w_732.png"
srcset="
https://s.w.org/images/core/4.8/events-widget_w_280.png 280w,
https://s.w.org/images/core/4.8/events-widget_w_420.png 420w,
https://s.w.org/images/core/4.8/events-widget_w_529.png 529w,
https://s.w.org/images/core/4.8/events-widget_w_638.png 638w,
https://s.w.org/images/core/4.8/events-widget_w_732.png 732w,
https://s.w.org/images/core/4.8/events-widget_w_827.png 827w,
https://s.w.org/images/core/4.8/events-widget_w_992.png 992w"
sizes="
( max-width: 500px ) calc( 100vw - 40px ),
( max-width: 782px ) calc( 48vw - 33px ),
( max-width: 960px ) calc( 47vw - 54px ),
( max-width: 1290px ) calc( 47vw - 112px ),
496px"
alt="" />
</div>
</div>

View File

@@ -40,7 +40,6 @@
max-width: 100%;
height: auto;
vertical-align: middle;
border: 1px solid rgba(0, 0, 0, 0.1);
}
.about-wrap .jetpack-video-wrapper {
@@ -164,9 +163,21 @@
.about-wrap [class$="-col"] {
display: -ms-flexbox;
display: -webkit-flex;
display: -webkit-box;
display: -moz-box;
display: flex;
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
-moz-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
-webkit-box-align: center;
-webkit-align-items: center;
-moz-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
@@ -178,6 +189,8 @@
.about-wrap [class$="-col"] .col {
-webkit-flex: 1;
-ms-flex: 1;
-webkit-box-flex: 1;
-moz-box-flex: 1;
flex: 1;
}
@@ -187,6 +200,8 @@
}
.about-wrap .three-col .col {
-webkit-align-self: flex-start;
-ms-flex-item-align: start;
align-self: flex-start;
min-width: 31%;
max-width: 31%;
@@ -294,10 +309,6 @@
padding-top: 35px;
}
.about-wrap .headline-feature img {
border: none;
}
.about-wrap .feature-section .media-container {
overflow: hidden;
}

File diff suppressed because one or more lines are too long

View File

@@ -40,7 +40,6 @@
max-width: 100%;
height: auto;
vertical-align: middle;
border: 1px solid rgba(0, 0, 0, 0.1);
}
.about-wrap .jetpack-video-wrapper {
@@ -164,9 +163,21 @@
.about-wrap [class$="-col"] {
display: -ms-flexbox;
display: -webkit-flex;
display: -webkit-box;
display: -moz-box;
display: flex;
-webkit-box-pack: justify;
-webkit-justify-content: space-between;
-moz-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
-webkit-box-align: center;
-webkit-align-items: center;
-moz-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
@@ -178,6 +189,8 @@
.about-wrap [class$="-col"] .col {
-webkit-flex: 1;
-ms-flex: 1;
-webkit-box-flex: 1;
-moz-box-flex: 1;
flex: 1;
}
@@ -187,6 +200,8 @@
}
.about-wrap .three-col .col {
-webkit-align-self: flex-start;
-ms-flex-item-align: start;
align-self: flex-start;
min-width: 31%;
max-width: 31%;
@@ -294,10 +309,6 @@
padding-top: 35px;
}
.about-wrap .headline-feature img {
border: none;
}
.about-wrap .feature-section .media-container {
overflow: hidden;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -334,7 +334,7 @@ form#tags-filter {
}
#content-resize-handle {
background: transparent url(../images/resize.gif) no-repeat scroll right bottom;
background: transparent url(../images/resize.gif) no-repeat scroll left bottom;
width: 12px;
cursor: row-resize;
}
@@ -1311,7 +1311,7 @@ table.links-table {
(min-resolution: 120dpi) {
#content-resize-handle,
#post-body .wp_themeSkin .mceStatusbar a.mceResize {
background: transparent url(../images/resize-2x.gif) no-repeat scroll right bottom;
background: transparent url(../images/resize-2x.gif) no-repeat scroll left bottom;
-webkit-background-size: 11px 11px;
background-size: 11px 11px;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1644,6 +1644,8 @@ body.full-overlay-active {
min-width: 299px;
max-width: 599px;
width: 18%;
width: -webkit-calc( 18% - 1px );
width: calc( 18% - 1px );
height: 45px;
border-top: 1px solid #ddd;
background: #eee;

File diff suppressed because one or more lines are too long

View File

@@ -1644,6 +1644,8 @@ body.full-overlay-active {
min-width: 299px;
max-width: 599px;
width: 18%;
width: -webkit-calc( 18% - 1px );
width: calc( 18% - 1px );
height: 45px;
border-top: 1px solid #ddd;
background: #eee;

File diff suppressed because one or more lines are too long

View File

@@ -619,6 +619,29 @@ div#widgets-right .widget-top:hover,
cursor: move;
}
/* =Specific widget styling
-------------------------------------------------------------- */
.text-widget-fields {
position: relative;
}
.text-widget-fields [hidden] {
display: none;
}
.text-widget-fields .wp-pointer.wp-pointer-top {
position: absolute;
z-index: 3;
top: 100px;
left: 10px;
right: 10px;
}
.text-widget-fields .wp-pointer .wp-pointer-arrow {
right: auto;
left: 15px;
}
.text-widget-fields .wp-pointer .wp-pointer-buttons {
line-height: 1.4em;
}
/* =Media Queries
-------------------------------------------------------------- */

File diff suppressed because one or more lines are too long

View File

@@ -619,6 +619,29 @@ div#widgets-right .widget-top:hover,
cursor: move;
}
/* =Specific widget styling
-------------------------------------------------------------- */
.text-widget-fields {
position: relative;
}
.text-widget-fields [hidden] {
display: none;
}
.text-widget-fields .wp-pointer.wp-pointer-top {
position: absolute;
z-index: 3;
top: 100px;
right: 10px;
left: 10px;
}
.text-widget-fields .wp-pointer .wp-pointer-arrow {
left: auto;
right: 15px;
}
.text-widget-fields .wp-pointer .wp-pointer-buttons {
line-height: 1.4em;
}
/* =Media Queries
-------------------------------------------------------------- */

File diff suppressed because one or more lines are too long

View File

@@ -74,7 +74,7 @@ do_action( "{$taxonomy}_pre_edit_form", $tag, $taxonomy ); ?>
<div id="message" class="updated">
<p><strong><?php echo $message; ?></strong></p>
<?php if ( $wp_http_referer ) { ?>
<p><a href="<?php echo esc_url( $wp_http_referer ); ?>"><?php
<p><a href="<?php echo esc_url( wp_validate_redirect( esc_url_raw( $wp_http_referer ), admin_url( 'term.php?taxonomy=' . $taxonomy ) ) ); ?>"><?php
/* translators: %s: taxonomy name */
printf( _x( '&larr; Back to %s', 'admin screen' ), $tax->labels->name );
?></a></p>

View File

@@ -319,6 +319,11 @@ class WP_Comments_List_Table extends WP_List_Table {
*/
protected function extra_tablenav( $which ) {
global $comment_status, $comment_type;
static $has_items;
if ( ! isset( $has_items ) ) {
$has_items = $this->has_items();
}
?>
<div class="alignleft actions">
<?php
@@ -354,7 +359,7 @@ class WP_Comments_List_Table extends WP_List_Table {
submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
}
if ( ( 'spam' === $comment_status || 'trash' === $comment_status ) && current_user_can( 'moderate_comments' ) && $this->has_items() ) {
if ( ( 'spam' === $comment_status || 'trash' === $comment_status ) && current_user_can( 'moderate_comments' ) && $has_items ) {
wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );
$title = ( 'spam' === $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' );
submit_button( $title, 'apply', 'delete_all', false );

View File

@@ -601,16 +601,16 @@ class WP_Plugins_List_Table extends WP_List_Table {
if ( $is_active ) {
if ( current_user_can( 'manage_network_plugins' ) ) {
/* translators: %s: plugin name */
$actions['deactivate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file ) . '" aria-label="' . esc_attr( sprintf( _x( 'Network Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Network Deactivate' ) . '</a>';
$actions['deactivate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file ) . '" aria-label="' . esc_attr( sprintf( _x( 'Network Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Network Deactivate' ) . '</a>';
}
} else {
if ( current_user_can( 'manage_network_plugins' ) ) {
/* translators: %s: plugin name */
$actions['activate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file ) . '" class="edit" aria-label="' . esc_attr( sprintf( _x( 'Network Activate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Network Activate' ) . '</a>';
$actions['activate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file ) . '" class="edit" aria-label="' . esc_attr( sprintf( _x( 'Network Activate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Network Activate' ) . '</a>';
}
if ( current_user_can( 'delete_plugins' ) && ! is_plugin_active( $plugin_file ) ) {
/* translators: %s: plugin name */
$actions['delete'] = '<a href="' . wp_nonce_url( 'plugins.php?action=delete-selected&amp;checked[]=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins' ) . '" class="delete" aria-label="' . esc_attr( sprintf( _x( 'Delete %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Delete' ) . '</a>';
$actions['delete'] = '<a href="' . wp_nonce_url( 'plugins.php?action=delete-selected&amp;checked[]=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins' ) . '" class="delete" aria-label="' . esc_attr( sprintf( _x( 'Delete %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Delete' ) . '</a>';
}
}
} else {
@@ -624,14 +624,14 @@ class WP_Plugins_List_Table extends WP_List_Table {
);
} elseif ( $is_active ) {
/* translators: %s: plugin name */
$actions['deactivate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file ) . '" aria-label="' . esc_attr( sprintf( _x( 'Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Deactivate' ) . '</a>';
$actions['deactivate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file ) . '" aria-label="' . esc_attr( sprintf( _x( 'Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Deactivate' ) . '</a>';
} else {
/* translators: %s: plugin name */
$actions['activate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file ) . '" class="edit" aria-label="' . esc_attr( sprintf( _x( 'Activate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Activate' ) . '</a>';
$actions['activate'] = '<a href="' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file ) . '" class="edit" aria-label="' . esc_attr( sprintf( _x( 'Activate %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Activate' ) . '</a>';
if ( ! is_multisite() && current_user_can( 'delete_plugins' ) ) {
/* translators: %s: plugin name */
$actions['delete'] = '<a href="' . wp_nonce_url( 'plugins.php?action=delete-selected&amp;checked[]=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins' ) . '" class="delete" aria-label="' . esc_attr( sprintf( _x( 'Delete %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Delete' ) . '</a>';
$actions['delete'] = '<a href="' . wp_nonce_url( 'plugins.php?action=delete-selected&amp;checked[]=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins' ) . '" class="delete" aria-label="' . esc_attr( sprintf( _x( 'Delete %s', 'plugin' ), $plugin_data['Name'] ) ) . '">' . __( 'Delete' ) . '</a>';
}
} // end if $is_active
@@ -639,7 +639,7 @@ class WP_Plugins_List_Table extends WP_List_Table {
if ( ( ! is_multisite() || $screen->in_admin( 'network' ) ) && current_user_can( 'edit_plugins' ) && is_writable( WP_PLUGIN_DIR . '/' . $plugin_file ) ) {
/* translators: %s: plugin name */
$actions['edit'] = '<a href="plugin-editor.php?file=' . $plugin_file . '" class="edit" aria-label="' . esc_attr( sprintf( __( 'Edit %s' ), $plugin_data['Name'] ) ) . '">' . __( 'Edit' ) . '</a>';
$actions['edit'] = '<a href="plugin-editor.php?file=' . urlencode( $plugin_file ) . '" class="edit" aria-label="' . esc_attr( sprintf( __( 'Edit %s' ), $plugin_data['Name'] ) ) . '">' . __( 'Edit' ) . '</a>';
}
} // end if $context

View File

@@ -647,6 +647,10 @@ function _unzip_file_ziparchive($file, $to, $needed_dirs = array() ) {
if ( '__MACOSX/' === substr($info['name'], 0, 9) ) // Skip the OS X-created __MACOSX directory
continue;
if ( 0 !== validate_file( $info['name'] ) ) {
return new WP_Error( 'invalid_file_ziparchive', __( 'Could not extract file from archive.' ), $info['name'] );
}
$uncompressed_size += $info['size'];
if ( '/' === substr( $info['name'], -1 ) ) {
@@ -807,6 +811,10 @@ function _unzip_file_pclzip($file, $to, $needed_dirs = array()) {
if ( '__MACOSX/' === substr($file['filename'], 0, 9) ) // Don't extract the OS X-created __MACOSX directory files
continue;
if ( 0 !== validate_file( $file['filename'] ) ) {
return new WP_Error( 'invalid_file_pclzip', __( 'Could not extract file from archive.' ), $file['filename'] );
}
if ( ! $wp_filesystem->put_contents( $to . $file['filename'], $file['content'], FS_CHMOD_FILE) )
return new WP_Error( 'copy_failed_pclzip', __( 'Could not copy file.' ), $file['filename'] );
}

View File

@@ -100,8 +100,8 @@ jQuery(document).ready(function() {
return;
jQuery('#permalink_structure').val( this.value );
});
jQuery('#permalink_structure').focus(function() {
jQuery("#custom_selection").attr('checked', 'checked');
jQuery( '#permalink_structure' ).on( 'click input', function() {
jQuery( '#custom_selection' ).prop( 'checked', true );
});
});
</script>

View File

@@ -772,7 +772,7 @@ function page_template_dropdown( $default = '', $post_type = 'page' ) {
ksort( $templates );
foreach ( array_keys( $templates ) as $template ) {
$selected = selected( $default, $templates[ $template ], false );
echo "\n\t<option value='" . $templates[ $template ] . "' $selected>$template</option>";
echo "\n\t<option value='" . esc_attr( $templates[ $template ] ) . "' $selected>" . esc_html( $template ) . "</option>";
}
}

View File

@@ -706,6 +706,7 @@ $_old_files = array(
// 4.6
'wp-admin/includes/class-wp-automatic-upgrader.php', // Wrong file name, see #37628.
// 4.8
'wp-includes/js/tinymce/plugins/wpembed',
'wp-includes/js/tinymce/plugins/media/moxieplayer.swf',
'wp-includes/js/tinymce/skins/lightgray/fonts/readme.md',
'wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.json',

View File

@@ -279,7 +279,7 @@ if ( defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) {
*/
$language = '';
if ( ! empty( $_REQUEST['language'] ) ) {
$language = preg_replace( '/[^a-zA-Z_]/', '', $_REQUEST['language'] );
$language = preg_replace( '/[^a-zA-Z0-9_]/', '', $_REQUEST['language'] );
} elseif ( isset( $GLOBALS['wp_local_package'] ) ) {
$language = $GLOBALS['wp_local_package'];
}

View File

@@ -5507,6 +5507,13 @@
} );
} ());
// Make sure TinyMCE dialogs appear above Customizer UI.
$( document ).one( 'wp-before-tinymce-init', function() {
if ( ! window.tinymce.ui.FloatPanel.zIndex || window.tinymce.ui.FloatPanel.zIndex < 500001 ) {
window.tinymce.ui.FloatPanel.zIndex = 500001;
}
} );
api.trigger( 'ready' );
});

File diff suppressed because one or more lines are too long

View File

@@ -2229,8 +2229,7 @@
}
} );
control.container.find( '.menu-delete-item' ).on( 'click', function( event ) {
event.stopPropagation();
control.container.find( '.menu-delete-item .button-link-delete' ).on( 'click', function( event ) {
event.preventDefault();
control.setting.set( false );
});

File diff suppressed because one or more lines are too long

View File

@@ -184,6 +184,12 @@ wp.mediaWidgets = ( function( $ ) {
return;
}
// If video, test for Vimeo and YouTube, otherwise, renderFail(). This should be removed once #34115 is resolved.
if ( 'video' === this.controller.options.mimeType && ! /vimeo|youtu\.?be/.test( urlParser.host ) ) {
embedLinkView.renderFail();
return;
}
embedLinkView.dfd = $.ajax({
url: wp.media.view.settings.oEmbedProxyUrl,
data: {
@@ -429,7 +435,8 @@ wp.mediaWidgets = ( function( $ ) {
*
* @param {Object} options - Options.
* @param {Backbone.Model} options.model - Model.
* @param {jQuery} options.el - Control container element.
* @param {jQuery} options.el - Control field container element.
* @param {jQuery} options.syncContainer - Container element where fields are synced for the server.
* @returns {void}
*/
initialize: function initialize( options ) {
@@ -437,12 +444,19 @@ wp.mediaWidgets = ( function( $ ) {
Backbone.View.prototype.initialize.call( control, options );
if ( ! control.el ) {
throw new Error( 'Missing options.el' );
}
if ( ! ( control.model instanceof component.MediaWidgetModel ) ) {
throw new Error( 'Missing options.model' );
}
if ( ! options.el ) {
throw new Error( 'Missing options.el' );
}
if ( ! options.syncContainer ) {
throw new Error( 'Missing options.syncContainer' );
}
control.syncContainer = options.syncContainer;
control.$el.addClass( 'media-widget-control' );
// Allow methods to be passed in with control context preserved.
_.bindAll( control, 'syncModelToInputs', 'render', 'updateSelectedAttachment', 'renderPreview' );
@@ -547,7 +561,7 @@ wp.mediaWidgets = ( function( $ ) {
*/
syncModelToInputs: function syncModelToInputs() {
var control = this;
control.$el.next( '.widget-content' ).find( '.media-widget-instance-property' ).each( function() {
control.syncContainer.find( '.media-widget-instance-property' ).each( function() {
var input = $( this ), value;
value = control.model.get( input.data( 'property' ) );
if ( _.isUndefined( value ) ) {
@@ -1003,9 +1017,8 @@ wp.mediaWidgets = ( function( $ ) {
* @returns {void}
*/
component.handleWidgetAdded = function handleWidgetAdded( event, widgetContainer ) {
var widgetContent, controlContainer, widgetForm, idBase, ControlConstructor, ModelConstructor, modelAttributes, widgetControl, widgetModel, widgetId, widgetInside, animatedCheckDelay = 50, renderWhenAnimationDone;
var fieldContainer, syncContainer, widgetForm, idBase, ControlConstructor, ModelConstructor, modelAttributes, widgetControl, widgetModel, widgetId, widgetInside, animatedCheckDelay = 50, renderWhenAnimationDone;
widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' ); // Note: '.form' appears in the customizer, whereas 'form' on the widgets admin screen.
widgetContent = widgetForm.find( '> .widget-content' );
idBase = widgetForm.find( '> .id_base' ).val();
widgetId = widgetForm.find( '> .widget-id' ).val();
@@ -1032,8 +1045,9 @@ wp.mediaWidgets = ( function( $ ) {
* components", the JS template is rendered outside of the normal form
* container.
*/
controlContainer = $( '<div class="media-widget-control"></div>' );
widgetContent.before( controlContainer );
fieldContainer = $( '<div></div>' );
syncContainer = widgetContainer.find( '.widget-content:first' );
syncContainer.before( fieldContainer );
/*
* Sync the widget instance model attributes onto the hidden inputs that widgets currently use to store the state.
@@ -1041,7 +1055,7 @@ wp.mediaWidgets = ( function( $ ) {
* from the start, without having to sync with hidden fields. See <https://core.trac.wordpress.org/ticket/33507>.
*/
modelAttributes = {};
widgetContent.find( '.media-widget-instance-property' ).each( function() {
syncContainer.find( '.media-widget-instance-property' ).each( function() {
var input = $( this );
modelAttributes[ input.data( 'property' ) ] = input.val();
});
@@ -1050,7 +1064,8 @@ wp.mediaWidgets = ( function( $ ) {
widgetModel = new ModelConstructor( modelAttributes );
widgetControl = new ControlConstructor({
el: controlContainer,
el: fieldContainer,
syncContainer: syncContainer,
model: widgetModel
});
@@ -1078,6 +1093,51 @@ wp.mediaWidgets = ( function( $ ) {
component.widgetControls[ widgetModel.get( 'widget_id' ) ] = widgetControl;
};
/**
* Setup widget in accessibility mode.
*
* @returns {void}
*/
component.setupAccessibleMode = function setupAccessibleMode() {
var widgetForm, widgetId, idBase, widgetControl, ControlConstructor, ModelConstructor, modelAttributes, fieldContainer, syncContainer;
widgetForm = $( '.editwidget > form' );
if ( 0 === widgetForm.length ) {
return;
}
idBase = widgetForm.find( '> .widget-control-actions > .id_base' ).val();
ControlConstructor = component.controlConstructors[ idBase ];
if ( ! ControlConstructor ) {
return;
}
widgetId = widgetForm.find( '> .widget-control-actions > .widget-id' ).val();
ModelConstructor = component.modelConstructors[ idBase ] || component.MediaWidgetModel;
fieldContainer = $( '<div></div>' );
syncContainer = widgetForm.find( '> .widget-inside' );
syncContainer.before( fieldContainer );
modelAttributes = {};
syncContainer.find( '.media-widget-instance-property' ).each( function() {
var input = $( this );
modelAttributes[ input.data( 'property' ) ] = input.val();
});
modelAttributes.widget_id = widgetId;
widgetControl = new ControlConstructor({
el: fieldContainer,
syncContainer: syncContainer,
model: new ModelConstructor( modelAttributes )
});
component.modelCollection.add( [ widgetControl.model ] );
component.widgetControls[ widgetControl.model.get( 'widget_id' ) ] = widgetControl;
widgetControl.render();
};
/**
* Sync widget instance data sanitized from server back onto widget model.
*
@@ -1146,6 +1206,11 @@ wp.mediaWidgets = ( function( $ ) {
var widgetContainer = $( this );
component.handleWidgetAdded( new jQuery.Event( 'widget-added' ), widgetContainer );
});
// Accessibility mode.
$( window ).on( 'load', function() {
component.setupAccessibleMode();
});
});
};

File diff suppressed because one or more lines are too long

View File

@@ -3,7 +3,9 @@
wp.textWidgets = ( function( $ ) {
'use strict';
var component = {};
var component = {
dismissedPointers: []
};
/**
* Text widget control.
@@ -24,9 +26,9 @@ wp.textWidgets = ( function( $ ) {
/**
* Initialize.
*
* @param {Object} options - Options.
* @param {Backbone.Model} options.model - Model.
* @param {jQuery} options.el - Control container element.
* @param {Object} options - Options.
* @param {jQuery} options.el - Control field container element.
* @param {jQuery} options.syncContainer - Container element where fields are synced for the server.
* @returns {void}
*/
initialize: function initialize( options ) {
@@ -35,42 +37,97 @@ wp.textWidgets = ( function( $ ) {
if ( ! options.el ) {
throw new Error( 'Missing options.el' );
}
if ( ! options.syncContainer ) {
throw new Error( 'Missing options.syncContainer' );
}
Backbone.View.prototype.initialize.call( control, options );
control.syncContainer = options.syncContainer;
/*
* Create a container element for the widget control fields.
* This is inserted into the DOM immediately before the the .widget-content
* element because the contents of this element are essentially "managed"
* by PHP, where each widget update cause the entire element to be emptied
* and replaced with the rendered output of WP_Widget::form() which is
* sent back in Ajax request made to save/update the widget instance.
* To prevent a "flash of replaced DOM elements and re-initialized JS
* components", the JS template is rendered outside of the normal form
* container.
*/
control.fieldContainer = $( '<div class="text-widget-fields"></div>' );
control.fieldContainer.html( wp.template( 'widget-text-control-fields' ) );
control.widgetContentContainer = control.$el.find( '.widget-content:first' );
control.widgetContentContainer.before( control.fieldContainer );
control.$el.addClass( 'text-widget-fields' );
control.$el.html( wp.template( 'widget-text-control-fields' ) );
control.customHtmlWidgetPointer = control.$el.find( '.wp-pointer.custom-html-widget-pointer' );
if ( control.customHtmlWidgetPointer.length ) {
control.customHtmlWidgetPointer.find( '.close' ).on( 'click', function( event ) {
event.preventDefault();
control.customHtmlWidgetPointer.hide();
$( '#' + control.fields.text.attr( 'id' ) + '-html' ).focus();
control.dismissPointers( [ 'text_widget_custom_html' ] );
});
control.customHtmlWidgetPointer.find( '.add-widget' ).on( 'click', function( event ) {
event.preventDefault();
control.customHtmlWidgetPointer.hide();
control.openAvailableWidgetsPanel();
});
}
control.pasteHtmlPointer = control.$el.find( '.wp-pointer.paste-html-pointer' );
if ( control.pasteHtmlPointer.length ) {
control.pasteHtmlPointer.find( '.close' ).on( 'click', function( event ) {
event.preventDefault();
control.pasteHtmlPointer.hide();
control.editor.focus();
control.dismissPointers( [ 'text_widget_custom_html', 'text_widget_paste_html' ] );
});
}
control.fields = {
title: control.fieldContainer.find( '.title' ),
text: control.fieldContainer.find( '.text' )
title: control.$el.find( '.title' ),
text: control.$el.find( '.text' )
};
// Sync input fields to hidden sync fields which actually get sent to the server.
_.each( control.fields, function( fieldInput, fieldName ) {
fieldInput.on( 'input change', function updateSyncField() {
var syncInput = control.widgetContentContainer.find( 'input[type=hidden].' + fieldName );
if ( syncInput.val() !== $( this ).val() ) {
syncInput.val( $( this ).val() );
var syncInput = control.syncContainer.find( '.sync-input.' + fieldName );
if ( syncInput.val() !== fieldInput.val() ) {
syncInput.val( fieldInput.val() );
syncInput.trigger( 'change' );
}
});
// Note that syncInput cannot be re-used because it will be destroyed with each widget-updated event.
fieldInput.val( control.widgetContentContainer.find( 'input[type=hidden].' + fieldName ).val() );
fieldInput.val( control.syncContainer.find( '.sync-input.' + fieldName ).val() );
});
},
/**
* Dismiss pointers for Custom HTML widget.
*
* @since 4.8.1
*
* @param {Array} pointers Pointer IDs to dismiss.
* @returns {void}
*/
dismissPointers: function dismissPointers( pointers ) {
_.each( pointers, function( pointer ) {
wp.ajax.post( 'dismiss-wp-pointer', {
pointer: pointer
});
component.dismissedPointers.push( pointer );
});
},
/**
* Open available widgets panel.
*
* @since 4.8.1
* @returns {void}
*/
openAvailableWidgetsPanel: function openAvailableWidgetsPanel() {
var sidebarControl;
wp.customize.section.each( function( section ) {
if ( section.extended( wp.customize.Widgets.SidebarSection ) && section.expanded() ) {
sidebarControl = wp.customize.control( 'sidebars_widgets[' + section.params.sidebarId + ']' );
}
});
if ( ! sidebarControl ) {
return;
}
setTimeout( function() { // Timeout to prevent click event from causing panel to immediately collapse.
wp.customize.Widgets.availableWidgetsPanel.open( sidebarControl );
wp.customize.Widgets.availableWidgetsPanel.$search.val( 'HTML' ).trigger( 'keyup' );
});
},
@@ -87,11 +144,11 @@ wp.textWidgets = ( function( $ ) {
var control = this, syncInput;
if ( ! control.fields.title.is( document.activeElement ) ) {
syncInput = control.widgetContentContainer.find( 'input[type=hidden].title' );
syncInput = control.syncContainer.find( '.sync-input.title' );
control.fields.title.val( syncInput.val() );
}
syncInput = control.widgetContentContainer.find( 'input[type=hidden].text' );
syncInput = control.syncContainer.find( '.sync-input.text' );
if ( control.fields.text.is( ':visible' ) ) {
if ( ! control.fields.text.is( document.activeElement ) ) {
control.fields.text.val( syncInput.val() );
@@ -107,23 +164,77 @@ wp.textWidgets = ( function( $ ) {
* @returns {void}
*/
initializeEditor: function initializeEditor() {
var control = this, changeDebounceDelay = 1000, id, textarea, restoreTextMode = false;
var control = this, changeDebounceDelay = 1000, id, textarea, triggerChangeIfDirty, restoreTextMode = false, needsTextareaChangeTrigger = false;
textarea = control.fields.text;
id = textarea.attr( 'id' );
/**
* Trigger change if dirty.
*
* @returns {void}
*/
triggerChangeIfDirty = function() {
var updateWidgetBuffer = 300; // See wp.customize.Widgets.WidgetControl._setupUpdateUI() which uses 250ms for updateWidgetDebounced.
if ( control.editor.isDirty() ) {
/*
* Account for race condition in customizer where user clicks Save & Publish while
* focus was just previously given to to the editor. Since updates to the editor
* are debounced at 1 second and since widget input changes are only synced to
* settings after 250ms, the customizer needs to be put into the processing
* state during the time between the change event is triggered and updateWidget
* logic starts. Note that the debounced update-widget request should be able
* to be removed with the removal of the update-widget request entirely once
* widgets are able to mutate their own instance props directly in JS without
* having to make server round-trips to call the respective WP_Widget::update()
* callbacks. See <https://core.trac.wordpress.org/ticket/33507>.
*/
if ( wp.customize && wp.customize.state ) {
wp.customize.state( 'processing' ).set( wp.customize.state( 'processing' ).get() + 1 );
_.delay( function() {
wp.customize.state( 'processing' ).set( wp.customize.state( 'processing' ).get() - 1 );
}, updateWidgetBuffer );
}
if ( ! control.editor.isHidden() ) {
control.editor.save();
}
}
// Trigger change on textarea when it is dirty for sake of widgets in the Customizer needing to sync form inputs to setting models.
if ( needsTextareaChangeTrigger ) {
textarea.trigger( 'change' );
needsTextareaChangeTrigger = false;
}
};
// Just-in-time force-update the hidden input fields.
control.syncContainer.closest( '.widget' ).find( '[name=savewidget]:first' ).on( 'click', function onClickSaveButton() {
triggerChangeIfDirty();
});
/**
* Build (or re-build) the visual editor.
*
* @returns {void}
*/
function buildEditor() {
var editor, triggerChangeIfDirty, onInit;
var editor, onInit, showPointerElement;
// Abort building if the textarea is gone, likely due to the widget having been deleted entirely.
if ( ! document.getElementById( id ) ) {
return;
}
// The user has disabled TinyMCE.
if ( typeof window.tinymce === 'undefined' ) {
wp.editor.initialize( id, {
quicktags: true
});
return;
}
// Destroy any existing editor so that it can be re-initialized after a widget-updated event.
if ( tinymce.get( id ) ) {
restoreTextMode = tinymce.get( id ).isHidden();
@@ -137,6 +248,20 @@ wp.textWidgets = ( function( $ ) {
quicktags: true
});
/**
* Show a pointer, focus on dismiss, and speak the contents for a11y.
*
* @param {jQuery} pointerElement Pointer element.
* @returns {void}
*/
showPointerElement = function( pointerElement ) {
pointerElement.show();
pointerElement.find( '.close' ).focus();
wp.a11y.speak( pointerElement.find( 'h3, p' ).map( function() {
return $( this ).text();
} ).get().join( '\n\n' ) );
};
editor = window.tinymce.get( id );
if ( ! editor ) {
throw new Error( 'Failed to initialize editor' );
@@ -150,8 +275,36 @@ wp.textWidgets = ( function( $ ) {
// If a prior mce instance was replaced, and it was in text mode, toggle to text mode.
if ( restoreTextMode ) {
switchEditors.go( id, 'toggle' );
switchEditors.go( id, 'html' );
}
// Show the pointer.
$( '#' + id + '-html' ).on( 'click', function() {
control.pasteHtmlPointer.hide(); // Hide the HTML pasting pointer.
if ( -1 !== component.dismissedPointers.indexOf( 'text_widget_custom_html' ) ) {
return;
}
showPointerElement( control.customHtmlWidgetPointer );
});
// Hide the pointer when switching tabs.
$( '#' + id + '-tmce' ).on( 'click', function() {
control.customHtmlWidgetPointer.hide();
});
// Show pointer when pasting HTML.
editor.on( 'pastepreprocess', function( event ) {
var content = event.content;
if ( -1 !== component.dismissedPointers.indexOf( 'text_widget_paste_html' ) || ! content || ! /&lt;\w+.*?&gt;/.test( content ) ) {
return;
}
// Show the pointer after a slight delay so the user sees what they pasted.
_.delay( function() {
showPointerElement( control.pasteHtmlPointer );
}, 250 );
});
};
if ( editor.initialized ) {
@@ -161,38 +314,19 @@ wp.textWidgets = ( function( $ ) {
}
control.editorFocused = false;
triggerChangeIfDirty = function() {
var updateWidgetBuffer = 300; // See wp.customize.Widgets.WidgetControl._setupUpdateUI() which uses 250ms for updateWidgetDebounced.
if ( editor.isDirty() ) {
/*
* Account for race condition in customizer where user clicks Save & Publish while
* focus was just previously given to to the editor. Since updates to the editor
* are debounced at 1 second and since widget input changes are only synced to
* settings after 250ms, the customizer needs to be put into the processing
* state during the time between the change event is triggered and updateWidget
* logic starts. Note that the debounced update-widget request should be able
* to be removed with the removal of the update-widget request entirely once
* widgets are able to mutate their own instance props directly in JS without
* having to make server round-trips to call the respective WP_Widget::update()
* callbacks. See <https://core.trac.wordpress.org/ticket/33507>.
*/
if ( wp.customize ) {
wp.customize.state( 'processing' ).set( wp.customize.state( 'processing' ).get() + 1 );
_.delay( function() {
wp.customize.state( 'processing' ).set( wp.customize.state( 'processing' ).get() - 1 );
}, updateWidgetBuffer );
}
editor.save();
textarea.trigger( 'change' );
}
};
editor.on( 'focus', function() {
editor.on( 'focus', function onEditorFocus() {
control.editorFocused = true;
});
editor.on( 'paste', function onEditorPaste() {
editor.setDirty( true ); // Because pasting doesn't currently set the dirty state.
triggerChangeIfDirty();
});
editor.on( 'NodeChange', function onNodeChange() {
needsTextareaChangeTrigger = true;
});
editor.on( 'NodeChange', _.debounce( triggerChangeIfDirty, changeDebounceDelay ) );
editor.on( 'blur', function() {
editor.on( 'blur hide', function onEditorBlur() {
control.editorFocused = false;
triggerChangeIfDirty();
});
@@ -219,7 +353,7 @@ wp.textWidgets = ( function( $ ) {
* @returns {void}
*/
component.handleWidgetAdded = function handleWidgetAdded( event, widgetContainer ) {
var widgetForm, idBase, widgetControl, widgetId, animatedCheckDelay = 50, widgetInside, renderWhenAnimationDone;
var widgetForm, idBase, widgetControl, widgetId, animatedCheckDelay = 50, widgetInside, renderWhenAnimationDone, fieldContainer, syncContainer;
widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' ); // Note: '.form' appears in the customizer, whereas 'form' on the widgets admin screen.
idBase = widgetForm.find( '> .id_base' ).val();
@@ -228,13 +362,34 @@ wp.textWidgets = ( function( $ ) {
}
// Prevent initializing already-added widgets.
widgetId = widgetForm.find( '> .widget-id' ).val();
widgetId = widgetForm.find( '.widget-id' ).val();
if ( component.widgetControls[ widgetId ] ) {
return;
}
// Bypass using TinyMCE when widget is in legacy mode.
if ( ! widgetForm.find( '.visual' ).val() ) {
return;
}
/*
* Create a container element for the widget control fields.
* This is inserted into the DOM immediately before the the .widget-content
* element because the contents of this element are essentially "managed"
* by PHP, where each widget update cause the entire element to be emptied
* and replaced with the rendered output of WP_Widget::form() which is
* sent back in Ajax request made to save/update the widget instance.
* To prevent a "flash of replaced DOM elements and re-initialized JS
* components", the JS template is rendered outside of the normal form
* container.
*/
fieldContainer = $( '<div></div>' );
syncContainer = widgetContainer.find( '.widget-content:first' );
syncContainer.before( fieldContainer );
widgetControl = new component.TextWidgetControl({
el: widgetContainer
el: fieldContainer,
syncContainer: syncContainer
});
component.widgetControls[ widgetId ] = widgetControl;
@@ -256,6 +411,40 @@ wp.textWidgets = ( function( $ ) {
renderWhenAnimationDone();
};
/**
* Setup widget in accessibility mode.
*
* @returns {void}
*/
component.setupAccessibleMode = function setupAccessibleMode() {
var widgetForm, idBase, widgetControl, fieldContainer, syncContainer;
widgetForm = $( '.editwidget > form' );
if ( 0 === widgetForm.length ) {
return;
}
idBase = widgetForm.find( '> .widget-control-actions > .id_base' ).val();
if ( 'text' !== idBase ) {
return;
}
// Bypass using TinyMCE when widget is in legacy mode.
if ( ! widgetForm.find( '.visual' ).val() ) {
return;
}
fieldContainer = $( '<div></div>' );
syncContainer = widgetForm.find( '> .widget-inside' );
syncContainer.before( fieldContainer );
widgetControl = new component.TextWidgetControl({
el: fieldContainer,
syncContainer: syncContainer
});
widgetControl.initializeEditor();
};
/**
* Sync widget instance data sanitized from server back onto widget model.
*
@@ -319,6 +508,11 @@ wp.textWidgets = ( function( $ ) {
var widgetContainer = $( this );
component.handleWidgetAdded( new jQuery.Event( 'widget-added' ), widgetContainer );
});
// Accessibility mode.
$( window ).on( 'load', function() {
component.setupAccessibleMode();
});
});
};

File diff suppressed because one or more lines are too long

View File

@@ -37,11 +37,11 @@ if ( empty( $plugins ) ) {
$file = '';
$plugin = '';
if ( isset( $_REQUEST['file'] ) ) {
$file = sanitize_text_field( $_REQUEST['file'] );
$file = wp_unslash( $_REQUEST['file'] );
}
if ( isset( $_REQUEST['plugin'] ) ) {
$plugin = sanitize_text_field( $_REQUEST['plugin'] );
$plugin = wp_unslash( $_REQUEST['plugin'] );
}
if ( empty( $plugin ) ) {
@@ -107,10 +107,10 @@ if ( isset( $_REQUEST['action'] ) && 'update' === $_REQUEST['action'] ) {
}
if ( ( ! empty( $_GET['networkwide'] ) && ! is_plugin_active_for_network( $file ) ) || ! is_plugin_active( $file ) ) {
activate_plugin( $plugin, "plugin-editor.php?file=$file&phperror=1", ! empty( $_GET['networkwide'] ) );
activate_plugin( $plugin, "plugin-editor.php?file=" . urlencode( $file ) . "&phperror=1", ! empty( $_GET['networkwide'] ) );
} // we'll override this later if the plugin can be included without fatal error
wp_redirect( self_admin_url("plugin-editor.php?file=$file&plugin=$plugin&a=te&scrollto=$scrollto") );
wp_redirect( self_admin_url( 'plugin-editor.php?file=' . urlencode( $file ) . '&plugin=' . urlencode( $plugin ) . "&a=te&scrollto=$scrollto" ) );
exit;
}
@@ -203,18 +203,18 @@ if ( isset( $_REQUEST['action'] ) && 'update' === $_REQUEST['action'] ) {
if ( is_plugin_active( $plugin ) ) {
if ( is_writeable( $real_file ) ) {
/* translators: %s: plugin file name */
echo sprintf( __( 'Editing %s (active)' ), '<strong>' . $file . '</strong>' );
echo sprintf( __( 'Editing %s (active)' ), '<strong>' . esc_html( $file ) . '</strong>' );
} else {
/* translators: %s: plugin file name */
echo sprintf( __( 'Browsing %s (active)' ), '<strong>' . $file . '</strong>' );
echo sprintf( __( 'Browsing %s (active)' ), '<strong>' . esc_html( $file ) . '</strong>' );
}
} else {
if ( is_writeable( $real_file ) ) {
/* translators: %s: plugin file name */
echo sprintf( __( 'Editing %s (inactive)' ), '<strong>' . $file . '</strong>' );
echo sprintf( __( 'Editing %s (inactive)' ), '<strong>' . esc_html( $file ) . '</strong>' );
} else {
/* translators: %s: plugin file name */
echo sprintf( __( 'Browsing %s (inactive)' ), '<strong>' . $file . '</strong>' );
echo sprintf( __( 'Browsing %s (inactive)' ), '<strong>' . esc_html( $file ) . '</strong>' );
}
}
?></big>
@@ -259,7 +259,7 @@ foreach ( $plugin_files as $plugin_file ) :
continue;
}
?>
<li<?php echo $file == $plugin_file ? ' class="highlight"' : ''; ?>><a href="plugin-editor.php?file=<?php echo urlencode( $plugin_file ) ?>&amp;plugin=<?php echo urlencode( $plugin ) ?>"><?php echo $plugin_file ?></a></li>
<li<?php echo $file == $plugin_file ? ' class="highlight"' : ''; ?>><a href="plugin-editor.php?file=<?php echo urlencode( $plugin_file ) ?>&amp;plugin=<?php echo urlencode( $plugin ) ?>"><?php echo esc_html( $plugin_file ); ?></a></li>
<?php endforeach; ?>
</ul>
</div>

View File

@@ -17,7 +17,7 @@ $pagenum = $wp_list_table->get_pagenum();
$action = $wp_list_table->current_action();
$plugin = isset($_REQUEST['plugin']) ? $_REQUEST['plugin'] : '';
$plugin = isset($_REQUEST['plugin']) ? wp_unslash( $_REQUEST['plugin'] ) : '';
$s = isset($_REQUEST['s']) ? urlencode( wp_unslash( $_REQUEST['s'] ) ) : '';
// Clean up request URI from temporary args for screen options/paging uri's to work as expected.
@@ -39,10 +39,10 @@ if ( $action ) {
check_admin_referer('activate-plugin_' . $plugin);
$result = activate_plugin($plugin, self_admin_url('plugins.php?error=true&plugin=' . $plugin), is_network_admin() );
$result = activate_plugin($plugin, self_admin_url('plugins.php?error=true&plugin=' . urlencode( $plugin ) ), is_network_admin() );
if ( is_wp_error( $result ) ) {
if ( 'unexpected_output' == $result->get_error_code() ) {
$redirect = self_admin_url('plugins.php?error=true&charsout=' . strlen($result->get_error_data()) . '&plugin=' . $plugin . "&plugin_status=$status&paged=$page&s=$s");
$redirect = self_admin_url('plugins.php?error=true&charsout=' . strlen($result->get_error_data()) . '&plugin=' . urlencode( $plugin ) . "&plugin_status=$status&paged=$page&s=$s");
wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect));
exit;
} else {
@@ -73,7 +73,7 @@ if ( $action ) {
check_admin_referer('bulk-plugins');
$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
if ( is_network_admin() ) {
foreach ( $plugins as $i => $plugin ) {
@@ -122,9 +122,9 @@ if ( $action ) {
check_admin_referer( 'bulk-plugins' );
if ( isset( $_GET['plugins'] ) )
$plugins = explode( ',', $_GET['plugins'] );
$plugins = explode( ',', wp_unslash( $_GET['plugins'] ) );
elseif ( isset( $_POST['checked'] ) )
$plugins = (array) $_POST['checked'];
$plugins = (array) wp_unslash( $_POST['checked'] );
else
$plugins = array();
@@ -197,7 +197,7 @@ if ( $action ) {
check_admin_referer('bulk-plugins');
$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
// Do not deactivate plugins which are already deactivated.
if ( is_network_admin() ) {
$plugins = array_filter( $plugins, 'is_plugin_active_for_network' );
@@ -234,7 +234,7 @@ if ( $action ) {
check_admin_referer('bulk-plugins');
//$_POST = from the plugin form; $_GET = from the FTP details screen.
$plugins = isset( $_REQUEST['checked'] ) ? (array) $_REQUEST['checked'] : array();
$plugins = isset( $_REQUEST['checked'] ) ? (array) wp_unslash( $_REQUEST['checked'] ) : array();
if ( empty( $plugins ) ) {
wp_redirect( self_admin_url("plugins.php?plugin_status=$status&paged=$page&s=$s") );
exit;
@@ -368,7 +368,7 @@ if ( $action ) {
default:
if ( isset( $_POST['checked'] ) ) {
check_admin_referer('bulk-plugins');
$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
$sendback = wp_get_referer();
/** This action is documented in wp-admin/edit-comments.php */

View File

@@ -105,7 +105,7 @@ function setup_config_display_header( $body_classes = array() ) {
$language = '';
if ( ! empty( $_REQUEST['language'] ) ) {
$language = preg_replace( '/[^a-zA-Z_]/', '', $_REQUEST['language'] );
$language = preg_replace( '/[^a-zA-Z0-9_]/', '', $_REQUEST['language'] );
} elseif ( isset( $GLOBALS['wp_local_package'] ) ) {
$language = $GLOBALS['wp_local_package'];
}

View File

@@ -99,7 +99,7 @@ if ( empty( $file ) ) {
$relative_file = 'style.css';
$file = $allowed_files['style.css'];
} else {
$relative_file = $file;
$relative_file = wp_unslash( $file );
$file = $theme->get_stylesheet_directory() . '/' . $relative_file;
}
@@ -156,10 +156,12 @@ default:
<div id="message" class="updated notice is-dismissible"><p><?php _e( 'File edited successfully.' ) ?></p></div>
<?php endif;
$description = get_file_description( $relative_file );
$file_description = get_file_description( $relative_file );
$file_show = array_search( $file, array_filter( $allowed_files ) );
if ( $description != $file_show )
$description .= ' <span>(' . $file_show . ')</span>';
$description = esc_html( $file_description );
if ( $file_description != $file_show ) {
$description .= ' <span>(' . esc_html( $file_show ) . ')</span>';
}
?>
<div class="wrap">
<h1><?php echo esc_html( $title ); ?></h1>
@@ -230,9 +232,9 @@ if ( $allowed_files ) :
echo "\t<ul>\n";
}
$file_description = get_file_description( $filename );
$file_description = esc_html( get_file_description( $filename ) );
if ( $filename !== basename( $absolute_filename ) || $file_description !== $filename ) {
$file_description .= '<br /><span class="nonessential">(' . $filename . ')</span>';
$file_description .= '<br /><span class="nonessential">(' . esc_html( $filename ) . ')</span>';
}
if ( $absolute_filename === $file ) {

View File

@@ -189,7 +189,7 @@ include(ABSPATH . 'wp-admin/admin-header.php');
<p><strong><?php _e('User updated.') ?></strong></p>
<?php endif; ?>
<?php if ( $wp_http_referer && false === strpos( $wp_http_referer, 'user-new.php' ) && ! IS_PROFILE_PAGE ) : ?>
<p><a href="<?php echo esc_url( $wp_http_referer ); ?>"><?php _e('&larr; Back to Users'); ?></a></p>
<p><a href="<?php echo esc_url( wp_validate_redirect( esc_url_raw( $wp_http_referer ), self_admin_url( 'users.php' ) ) ); ?>"><?php _e('&larr; Back to Users'); ?></a></p>
<?php endif; ?>
</div>
<?php endif; ?>

View File

@@ -1,8 +1,8 @@
=== Twenty Eleven ===
Contributors: the WordPress team
Requires at least: WordPress 3.2
Tested up to: WordPress 4.7-trunk
Stable tag: 2.5
Tested up to: WordPress 4.9-trunk
Stable tag: 2.6
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, one-column, two-columns, left-sidebar, right-sidebar, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-image-header, featured-images, flexible-header, footer-widgets, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready
@@ -22,7 +22,7 @@ For more information about Twenty Eleven please go to https://codex.wordpress.or
== Copyright ==
Twenty Eleven WordPress Theme, Copyright 2011-2016 WordPress.org & Automattic.com
Twenty Eleven WordPress Theme, Copyright 2011-2017 WordPress.org & Automattic.com
Twenty Eleven is Distributed under the terms of the GNU GPL
This program is free software: you can redistribute it and/or modify
@@ -43,6 +43,11 @@ Source: https://github.com/aFarkas/html5shiv
== Changelog ==
= 2.6 =
* Released: June 8, 2017
https://codex.wordpress.org/Twenty_Eleven_Theme_Changelog#Version_2.6
= 2.5 =
* Released: August 15, 2016

View File

@@ -4,7 +4,7 @@ Theme URI: https://wordpress.org/themes/twentyeleven/
Author: the WordPress team
Author URI: https://wordpress.org/
Description: The 2011 theme for WordPress is sophisticated, lightweight, and adaptable. Make it yours with a custom menu, header image, and background -- then go further with available theme options for light or dark color scheme, custom link colors, and three layout choices. Twenty Eleven comes equipped with a Showcase page template that transforms your front page into a showcase to show off your best content, widget support galore (sidebar, three footer areas, and a Showcase page widget area), and a custom "Ephemera" widget to display your Aside, Link, Quote, or Status posts. Included are styles for print and for the admin editor, support for featured images (as custom header images on posts and pages and as large images on featured "sticky" posts), and special styles for six different post formats.
Version: 2.5
Version: 2.6
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, one-column, two-columns, left-sidebar, right-sidebar, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-image-header, featured-images, flexible-header, footer-widgets, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready

View File

@@ -1,8 +1,8 @@
=== Twenty Fifteen ===
Contributors: the WordPress team
Requires at least: WordPress 4.1
Tested up to: WordPress 4.8-trunk
Version: 1.7
Tested up to: WordPress 4.9-trunk
Version: 1.8
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, two-columns, left-sidebar, accessibility-ready, custom-background, custom-colors, custom-header, custom-logo, custom-menu, editor-style, featured-images, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready
@@ -55,6 +55,11 @@ Source: http://www.genericons.com
== Changelog ==
= 1.8 =
* Released: June 8, 2017
https://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.8
= 1.7 =
* Released: December 6, 2016

View File

@@ -4,7 +4,7 @@ Theme URI: https://wordpress.org/themes/twentyfifteen/
Author: the WordPress team
Author URI: https://wordpress.org/
Description: Our 2015 default theme is clean, blog-focused, and designed for clarity. Twenty Fifteen's simple, straightforward typography is readable on a wide variety of screen sizes, and suitable for multiple languages. We designed it using a mobile-first approach, meaning your content takes center-stage, regardless of whether your visitors arrive by smartphone, tablet, laptop, or desktop computer.
Version: 1.7
Version: 1.8
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, two-columns, left-sidebar, accessibility-ready, custom-background, custom-colors, custom-header, custom-logo, custom-menu, editor-style, featured-images, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready

View File

@@ -1,8 +1,8 @@
=== Twenty Fourteen ===
Contributors: the WordPress team
Requires at least: WordPress 3.6
Tested up to: WordPress 4.8-trunk
Stable tag: 1.9
Tested up to: WordPress 4.9-trunk
Stable tag: 2.0
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, news, two-columns, three-columns, left-sidebar, right-sidebar, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, footer-widgets, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, accessibility-ready
@@ -22,7 +22,7 @@ For more information about Twenty Fourteen please go to https://codex.wordpress.
== Copyright ==
Twenty Fourteen WordPress Theme, Copyright 2013-2016 WordPress.org & Automattic.com
Twenty Fourteen WordPress Theme, Copyright 2013-2017 WordPress.org & Automattic.com
Twenty Fourteen is Distributed under the terms of the GNU GPL
This program is free software: you can redistribute it and/or modify
@@ -50,6 +50,11 @@ Source: http://www.genericons.com
== Changelog ==
= 2.0 =
* Released: June 8, 2017
https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_2.0
= 1.9 =
* Released: December 6, 2016

View File

@@ -4,7 +4,7 @@ Theme URI: https://wordpress.org/themes/twentyfourteen/
Author: the WordPress team
Author URI: https://wordpress.org/
Description: In 2014, our default theme lets you create a responsive magazine website with a sleek, modern design. Feature your favorite homepage content in either a grid or a slider. Use the three widget areas to customize your website, and change your content's layout with a full-width page template and a contributor page to show off your authors. Creating a magazine website with WordPress has never been easier.
Version: 1.9
Version: 2.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, news, two-columns, three-columns, left-sidebar, right-sidebar, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, footer-widgets, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, accessibility-ready

View File

@@ -1,8 +1,8 @@
=== Twenty Seventeen ===
Contributors: the WordPress team
Requires at least: WordPress 4.7
Tested up to: WordPress 4.7
Version: 1.2
Tested up to: WordPress 4.9-trunk
Version: 1.3
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: one-column, two-columns, right-sidebar, flexible-header, accessibility-ready, custom-colors, custom-header, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, post-formats, rtl-language-support, sticky-post, theme-options, threaded-comments, translation-ready
@@ -60,6 +60,11 @@ Source: https://unsplash.com/@englr?photo=bIhpiQA009k
== Changelog ==
= 1.3 =
* Released: June 8, 2017
https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_1.3
= 1.2 =
* Released: April 18, 2017

View File

@@ -4,7 +4,7 @@ Theme URI: https://wordpress.org/themes/twentyseventeen/
Author: the WordPress team
Author URI: https://wordpress.org/
Description: Twenty Seventeen brings your site to life with header video and immersive featured images. With a focus on business sites, it features multiple sections on the front page as well as widgets, navigation and social menus, a logo, and more. Personalize its asymmetrical grid with a custom color scheme and showcase your multimedia content with post formats. Our default theme for 2017 works great in many languages, for any abilities, and on any device.
Version: 1.2
Version: 1.3
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: twentyseventeen

View File

@@ -1,8 +1,8 @@
=== Twenty Ten ===
Contributors: the WordPress team
Requires at least: WordPress 3.0
Tested up to: WordPress 4.7-trunk
Stable tag: 2.2
Tested up to: WordPress 4.9-trunk
Stable tag: 2.3
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, two-columns, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style, custom-menu, flexible-header, featured-images, footer-widgets, featured-image-header
@@ -22,7 +22,7 @@ For more information about Twenty Ten theme please go to https://codex.wordpress
== Copyright ==
Twenty Ten WordPress Theme, Copyright 2010-2016 WordPress.org & Automattic.com
Twenty Ten WordPress Theme, Copyright 2010-2017 WordPress.org & Automattic.com
Twenty Ten is Distributed under the terms of the GNU GPL
This program is free software: you can redistribute it and/or modify
@@ -37,6 +37,11 @@ GNU General Public License for more details.
== Changelog ==
= 2.3 =
* Released: June 8, 2017
https://codex.wordpress.org/Twenty_Ten_Theme_Changelog#Version_2.3
= 2.2 =
* Released: August 15, 2016

View File

@@ -4,7 +4,7 @@ Theme URI: https://wordpress.org/themes/twentyten/
Description: The 2010 theme for WordPress is stylish, customizable, simple, and readable -- make it yours with a custom menu, header image, and background. Twenty Ten supports six widgetized areas (two in the sidebar, four in the footer) and featured images (thumbnails for gallery posts and custom header images for posts and pages). It includes stylesheets for print and the admin Visual Editor, special styles for posts in the "Asides" and "Gallery" categories, and has an optional one-column page template that removes the sidebar.
Author: the WordPress team
Author URI: https://wordpress.org/
Version: 2.2
Version: 2.3
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, two-columns, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style, custom-menu, flexible-header, featured-images, footer-widgets, featured-image-header

View File

@@ -1,8 +1,8 @@
=== Twenty Thirteen ===
Contributors: the WordPress team
Requires at least: WordPress 3.6
Tested up to: WordPress 4.8-trunk
Stable tag: 2.1
Tested up to: WordPress 4.9-trunk
Stable tag: 2.2
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, one-column, two-columns, right-sidebar, custom-header, custom-menu, editor-style, featured-images, footer-widgets, microformats, post-formats, rtl-language-support, sticky-post, translation-ready, accessibility-ready
@@ -22,7 +22,7 @@ For more information about Twenty Thirteen please go to https://codex.wordpress.
== Copyright ==
Twenty Thirteen WordPress Theme, Copyright 2013-2016 WordPress.org & Automattic.com
Twenty Thirteen WordPress Theme, Copyright 2013-2017 WordPress.org & Automattic.com
Twenty Thirteen is Distributed under the terms of the GNU GPL
This program is free software: you can redistribute it and/or modify
@@ -47,6 +47,11 @@ Source: http://www.genericons.com
== Changelog ==
= 2.2 =
* Released: June 8, 2017
https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_2.2
= 2.1 =
* Released: December 6, 2016

View File

@@ -4,7 +4,7 @@ Theme URI: https://wordpress.org/themes/twentythirteen/
Author: the WordPress team
Author URI: https://wordpress.org/
Description: The 2013 theme for WordPress takes us back to the blog, featuring a full range of post formats, each displayed beautifully in their own unique way. Design details abound, starting with a vibrant color scheme and matching header images, beautiful typography and icons, and a flexible layout that looks great on any device, big or small.
Version: 2.1
Version: 2.2
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, one-column, two-columns, right-sidebar, custom-header, custom-menu, editor-style, featured-images, footer-widgets, microformats, post-formats, rtl-language-support, sticky-post, translation-ready, accessibility-ready

View File

@@ -1,8 +1,8 @@
=== Twenty Twelve ===
Contributors: the WordPress team
Requires at least: WordPress 3.5
Tested up to: WordPress 4.8-trunk
Stable tag: 2.2
Tested up to: WordPress 4.9-trunk
Stable tag: 2.3
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, one-column, two-columns, right-sidebar, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, footer-widgets, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready
@@ -22,7 +22,7 @@ For more information about Twenty Twelve please go to https://codex.wordpress.or
== Copyright ==
Twenty Twelve WordPress Theme, Copyright 2012-2016 WordPress.org & Automattic.com
Twenty Twelve WordPress Theme, Copyright 2012-2017 WordPress.org & Automattic.com
Twenty Twelve is Distributed under the terms of the GNU GPL
This program is free software: you can redistribute it and/or modify
@@ -43,6 +43,11 @@ Source: https://github.com/aFarkas/html5shiv
== Changelog ==
= 2.3 =
* Released: June 8, 2017
https://codex.wordpress.org/Twenty_Twelve_Theme_Changelog#Version_2.3
= 2.2 =
* Released: December 6, 2016

View File

@@ -4,7 +4,7 @@ Theme URI: https://wordpress.org/themes/twentytwelve/
Author: the WordPress team
Author URI: https://wordpress.org/
Description: The 2012 theme for WordPress is a fully responsive theme that looks great on any device. Features include a front page template with its own widgets, an optional display font, styling for post formats on both index and single views, and an optional no-sidebar page template. Make it yours with a custom menu, header image, and background.
Version: 2.2
Version: 2.3
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, one-column, two-columns, right-sidebar, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, footer-widgets, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready

View File

@@ -95,7 +95,7 @@ class WP_oEmbed {
'#https?://kck\.st/.*#i' => array( 'https://www.kickstarter.com/services/oembed', true ),
'#https?://cloudup\.com/.*#i' => array( 'https://cloudup.com/oembed', true ),
'#https?://(www\.)?reverbnation\.com/.*#i' => array( 'https://www.reverbnation.com/oembed', true ),
'#https?://videopress\.com/v/.*#' => array( 'https://public-api.wordpress.com/oembed/1.0/?for=' . $host, true ),
'#https?://videopress\.com/v/.*#' => array( 'https://public-api.wordpress.com/oembed/?for=' . $host, true ),
'#https?://(www\.)?reddit\.com/r/[^/]+/comments/.*#i' => array( 'https://www.reddit.com/oembed', true ),
'#https?://(www\.)?speakerdeck\.com/.*#i' => array( 'https://speakerdeck.com/oembed.{format}', true ),
'#https?://www\.facebook\.com/.*/posts/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ),

View File

@@ -265,7 +265,7 @@ final class WP_Customize_Manager {
}
$this->original_stylesheet = get_stylesheet();
$this->theme = wp_get_theme( $args['theme'] );
$this->theme = wp_get_theme( 0 === validate_file( $args['theme'] ) ? $args['theme'] : null );
$this->messenger_channel = $args['messenger_channel'];
$this->_changeset_uuid = $args['changeset_uuid'];

View File

@@ -35,9 +35,23 @@ final class WP_Customize_Widgets {
* @var array
*/
protected $core_widget_id_bases = array(
'archives', 'calendar', 'categories', 'links', 'meta',
'nav_menu', 'pages', 'recent-comments', 'recent-posts',
'rss', 'search', 'tag_cloud', 'text',
'archives',
'calendar',
'categories',
'custom_html',
'links',
'media_audio',
'media_image',
'media_video',
'meta',
'nav_menu',
'pages',
'recent-comments',
'recent-posts',
'rss',
'search',
'tag_cloud',
'text',
);
/**

View File

@@ -819,40 +819,45 @@ final class _WP_Editors {
*
*/
public static function print_default_editor_scripts() {
$settings = self::default_settings();
$user_can_richedit = user_can_richedit();
$settings['toolbar1'] = 'bold,italic,bullist,numlist,link';
$settings['wpautop'] = false;
$settings['indent'] = true;
$settings['elementpath'] = false;
if ( $user_can_richedit ) {
$settings = self::default_settings();
// In production all plugins are loaded (they are in wp-editor.js.gz)
// but only these will be initialized by default.
$settings['plugins'] = implode( ',', array(
'charmap',
'colorpicker',
'hr',
'lists',
// 'media',
'paste',
'tabfocus',
'textcolor',
'fullscreen',
'wordpress',
'wpautoresize',
'wpeditimage',
'wpemoji',
'wpgallery',
'wplink',
// 'wpdialogs',
'wptextpattern',
// 'wpview',
) );
$settings['toolbar1'] = 'bold,italic,bullist,numlist,link';
$settings['wpautop'] = false;
$settings['indent'] = true;
$settings['elementpath'] = false;
$settings = self::_parse_init( $settings );
if ( is_rtl() ) {
$settings['directionality'] = 'rtl';
}
$suffix = SCRIPT_DEBUG ? '' : '.min';
$baseurl = self::get_baseurl();
// In production all plugins are loaded (they are in wp-editor.js.gz).
// The 'wpview', 'wpdialogs', and 'media' TinyMCE plugins are not initialized by default.
// Can be added from js by using the 'wp-before-tinymce-init' event.
$settings['plugins'] = implode( ',', array(
'charmap',
'colorpicker',
'hr',
'lists',
'paste',
'tabfocus',
'textcolor',
'fullscreen',
'wordpress',
'wpautoresize',
'wpeditimage',
'wpemoji',
'wpgallery',
'wplink',
'wptextpattern',
) );
$settings = self::_parse_init( $settings );
} else {
$settings = '{}';
}
?>
<script type="text/javascript">
@@ -867,17 +872,29 @@ final class _WP_Editors {
};
};
var tinyMCEPreInit = {
baseURL: "<?php echo $baseurl; ?>",
suffix: "<?php echo $suffix; ?>",
mceInit: {},
qtInit: {},
load_ext: function(url,lang){var sl=tinymce.ScriptLoader;sl.markDone(url+'/langs/'+lang+'.js');sl.markDone(url+'/langs/'+lang+'_dlg.js');}
};
<?php
if ( $user_can_richedit ) {
$suffix = SCRIPT_DEBUG ? '' : '.min';
$baseurl = self::get_baseurl();
?>
var tinyMCEPreInit = {
baseURL: "<?php echo $baseurl; ?>",
suffix: "<?php echo $suffix; ?>",
mceInit: {},
qtInit: {},
load_ext: function(url,lang){var sl=tinymce.ScriptLoader;sl.markDone(url+'/langs/'+lang+'.js');sl.markDone(url+'/langs/'+lang+'_dlg.js');}
};
<?php
}
?>
</script>
<?php
self::print_tinymce_scripts();
if ( $user_can_richedit ) {
self::print_tinymce_scripts();
}
/**
* Fires when the editor scripts are loaded for later initialization,

View File

@@ -153,12 +153,13 @@ final class WP_oEmbed_Controller {
*
* @see WP_oEmbed::get_html()
* @param WP_REST_Request $request Full data about the request.
* @return WP_Error|array oEmbed response data or WP_Error on failure.
* @return object|WP_Error oEmbed response data or WP_Error on failure.
*/
public function get_proxy_item( $request ) {
$args = $request->get_params();
// Serve oEmbed data from cache if set.
unset( $args['_wpnonce'] );
$cache_key = 'oembed_' . md5( serialize( $args ) );
$data = get_transient( $cache_key );
if ( ! empty( $data ) ) {
@@ -168,6 +169,14 @@ final class WP_oEmbed_Controller {
$url = $request['url'];
unset( $args['url'] );
// Copy maxwidth/maxheight to width/height since WP_oEmbed::fetch() uses these arg names.
if ( isset( $args['maxwidth'] ) ) {
$args['width'] = $args['maxwidth'];
}
if ( isset( $args['maxheight'] ) ) {
$args['height'] = $args['maxheight'];
}
$data = _wp_oembed_get_object()->get_data( $url, $args );
if ( false === $data ) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -60,3 +60,155 @@ require_once( ABSPATH . WPINC . '/widgets/class-wp-widget-tag-cloud.php' );
/** WP_Nav_Menu_Widget class */
require_once( ABSPATH . WPINC . '/widgets/class-wp-nav-menu-widget.php' );
/**
* Core class used to implement a Custom HTML widget.
*
* Note that this class is only located in this file in the 4.8 branch
* for the sake of automatic updates. In 4.9 and above, it is located at
* `wp-includes/widgets/class-wp-widget-custom-html.php`.
*
* @since 4.8.1
*
* @see WP_Widget
*/
class WP_Widget_Custom_HTML extends WP_Widget {
/**
* Default instance.
*
* @since 4.8.1
* @var array
*/
protected $default_instance = array(
'title' => '',
'content' => '',
);
/**
* Sets up a new Custom HTML widget instance.
*
* @since 4.8.1
*/
public function __construct() {
$widget_ops = array(
'classname' => 'widget_custom_html',
'description' => __( 'Arbitrary HTML code.' ),
'customize_selective_refresh' => true,
);
$control_ops = array(
'width' => 400,
'height' => 350,
);
parent::__construct( 'custom_html', __( 'Custom HTML' ), $widget_ops, $control_ops );
}
/**
* Outputs the content for the current Custom HTML widget instance.
*
* @since 4.8.1
*
* @param array $args Display arguments including 'before_title', 'after_title',
* 'before_widget', and 'after_widget'.
* @param array $instance Settings for the current Custom HTML widget instance.
*/
public function widget( $args, $instance ) {
$instance = array_merge( $this->default_instance, $instance );
/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
$title = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );
// Prepare instance data that looks like a normal Text widget.
$simulated_text_widget_instance = array_merge( $instance, array(
'text' => isset( $instance['content'] ) ? $instance['content'] : '',
'filter' => false, // Because wpautop is not applied.
'visual' => false, // Because it wasn't created in TinyMCE.
) );
unset( $simulated_text_widget_instance['content'] ); // Was moved to 'text' prop.
/** This filter is documented in wp-includes/widgets/class-wp-widget-text.php */
$content = apply_filters( 'widget_text', $instance['content'], $simulated_text_widget_instance, $this );
/**
* Filters the content of the Custom HTML widget.
*
* @since 4.8.1
*
* @param string $content The widget content.
* @param array $instance Array of settings for the current widget.
* @param WP_Widget_Custom_HTML $this Current Custom HTML widget instance.
*/
$content = apply_filters( 'widget_custom_html_content', $content, $instance, $this );
// Inject the Text widget's container class name alongside this widget's class name for theme styling compatibility.
$args['before_widget'] = preg_replace( '/(?<=\sclass=["\'])/', 'widget_text ', $args['before_widget'] );
echo $args['before_widget'];
if ( ! empty( $title ) ) {
echo $args['before_title'] . $title . $args['after_title'];
}
echo '<div class="textwidget custom-html-widget">'; // The textwidget class is for theme styling compatibility.
echo $content;
echo '</div>';
echo $args['after_widget'];
}
/**
* Handles updating settings for the current Custom HTML widget instance.
*
* @since 4.8.1
*
* @param array $new_instance New settings for this instance as input by the user via
* WP_Widget::form().
* @param array $old_instance Old settings for this instance.
* @return array Settings to save or bool false to cancel saving.
*/
public function update( $new_instance, $old_instance ) {
$instance = array_merge( $this->default_instance, $old_instance );
$instance['title'] = sanitize_text_field( $new_instance['title'] );
if ( current_user_can( 'unfiltered_html' ) ) {
$instance['content'] = $new_instance['content'];
} else {
$instance['content'] = wp_kses_post( $new_instance['content'] );
}
return $instance;
}
/**
* Outputs the Custom HTML widget settings form.
*
* @since 4.8.1
*
* @param array $instance Current instance.
* @returns void
*/
public function form( $instance ) {
$instance = wp_parse_args( (array) $instance, $this->default_instance );
?>
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>"/>
</p>
<p>
<label for="<?php echo $this->get_field_id( 'content' ); ?>"><?php _e( 'Content:' ); ?></label>
<textarea class="widefat code" rows="16" cols="20" id="<?php echo $this->get_field_id( 'content' ); ?>" name="<?php echo $this->get_field_name( 'content' ); ?>"><?php echo esc_textarea( $instance['content'] ); ?></textarea>
</p>
<?php if ( ! current_user_can( 'unfiltered_html' ) ) : ?>
<?php
$probably_unsafe_html = array( 'script', 'iframe', 'form', 'input', 'style' );
$allowed_html = wp_kses_allowed_html( 'post' );
$disallowed_html = array_diff( $probably_unsafe_html, array_keys( $allowed_html ) );
?>
<?php if ( ! empty( $disallowed_html ) ) : ?>
<p>
<?php _e( 'Some HTML tags are not permitted, including:' ); ?>
<code><?php echo join( '</code>, <code>', $disallowed_html ); ?></code>
</p>
<?php endif; ?>
<?php endif; ?>
<?php
}
}

View File

@@ -753,24 +753,30 @@ function wp_filter_oembed_result( $result, $data, $url ) {
}
$html = $content[1] . $content[2];
preg_match( '/ src=([\'"])(.*?)\1/', $html, $results );
if ( ! empty( $results ) ) {
$secret = wp_generate_password( 10, false );
$url = esc_url( "{$results[2]}#?secret=$secret" );
$q = $results[1];
$html = str_replace( $results[0], ' src=' . $q . $url . $q . ' data-secret=' . $q . $secret . $q, $html );
$html = str_replace( '<blockquote', "<blockquote data-secret=\"$secret\"", $html );
}
$allowed_html['blockquote']['data-secret'] = true;
$allowed_html['iframe']['data-secret'] = true;
$html = wp_kses( $html, $allowed_html );
if ( ! empty( $content[1] ) ) {
// We have a blockquote to fall back on. Hide the iframe by default.
$html = str_replace( '<iframe', '<iframe style="position: absolute; clip: rect(1px, 1px, 1px, 1px);"', $html );
$html = str_replace( '<blockquote', '<blockquote class="wp-embedded-content"', $html );
}
$html = str_replace( '<iframe', '<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"', $html );
preg_match( '/ src=[\'"]([^\'"]*)[\'"]/', $html, $results );
if ( ! empty( $results ) ) {
$secret = wp_generate_password( 10, false );
$url = esc_url( "{$results[1]}#?secret=$secret" );
$html = str_replace( $results[0], " src=\"$url\" data-secret=\"$secret\"", $html );
$html = str_replace( '<blockquote', "<blockquote data-secret=\"$secret\"", $html );
}
$html = str_ireplace( '<iframe', '<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"', $html );
return $html;
}

View File

@@ -5077,7 +5077,7 @@ function _print_emoji_detection_script() {
?>
<script type="text/javascript">
window._wpemojiSettings = <?php echo wp_json_encode( $settings ); ?>;
!function(a,b,c){function d(a){var b,c,d,e,f=String.fromCharCode;if(!k||!k.fillText)return!1;switch(k.clearRect(0,0,j.width,j.height),k.textBaseline="top",k.font="600 32px Arial",a){case"flag":return k.fillText(f(55356,56826,55356,56819),0,0),b=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,56826,8203,55356,56819),0,0),c=j.toDataURL(),b===c&&(k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447),0,0),b=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447),0,0),c=j.toDataURL(),b!==c);case"emoji4":return k.fillText(f(55358,56794,8205,9794,65039),0,0),d=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55358,56794,8203,9794,65039),0,0),e=j.toDataURL(),d!==e}return!1}function e(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var f,g,h,i,j=b.createElement("canvas"),k=j.getContext&&j.getContext("2d");for(i=Array("flag","emoji4"),c.supports={everything:!0,everythingExceptFlag:!0},h=0;h<i.length;h++)c.supports[i[h]]=d(i[h]),c.supports.everything=c.supports.everything&&c.supports[i[h]],"flag"!==i[h]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[i[h]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(g=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1)):(a.attachEvent("onload",g),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),f=c.source||{},f.concatemoji?e(f.concatemoji):f.wpemoji&&f.twemoji&&(e(f.twemoji),e(f.wpemoji)))}(window,document,window._wpemojiSettings);
!function(a,b,c){function d(a){var b,c,d,e,f=String.fromCharCode;if(!k||!k.fillText)return!1;switch(k.clearRect(0,0,j.width,j.height),k.textBaseline="top",k.font="600 32px Arial",a){case"flag":return k.fillText(f(55356,56826,55356,56819),0,0),b=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,56826,8203,55356,56819),0,0),c=j.toDataURL(),b!==c&&(k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447),0,0),b=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447),0,0),c=j.toDataURL(),b!==c);case"emoji4":return k.fillText(f(55358,56794,8205,9794,65039),0,0),d=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55358,56794,8203,9794,65039),0,0),e=j.toDataURL(),d!==e}return!1}function e(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var f,g,h,i,j=b.createElement("canvas"),k=j.getContext&&j.getContext("2d");for(i=Array("flag","emoji4"),c.supports={everything:!0,everythingExceptFlag:!0},h=0;h<i.length;h++)c.supports[i[h]]=d(i[h]),c.supports.everything=c.supports.everything&&c.supports[i[h]],"flag"!==i[h]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[i[h]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(g=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1)):(a.attachEvent("onload",g),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),f=c.source||{},f.concatemoji?e(f.concatemoji):f.wpemoji&&f.twemoji&&(e(f.twemoji),e(f.wpemoji)))}(window,document,window._wpemojiSettings);
</script>
<?php
}

View File

@@ -155,8 +155,6 @@
encodedText,
instance;
text = tinymce.DOM.decode( text );
if ( text.indexOf( '[' ) !== -1 && text.indexOf( ']' ) !== -1 ) {
// Looks like a shortcode? Remove any line breaks from inside of shortcodes
// or autop will replace them with <p> and <br> later and the string won't match.
@@ -431,7 +429,7 @@
var selected = node === editor.selection.getNode();
var $viewNode;
if ( ! this.loader && $( node ).text() !== this.text ) {
if ( ! this.loader && $( node ).text() !== tinymce.DOM.decode( this.text ) ) {
editor.dom.setAttrib( node, 'data-wpview-marker', null );
return;
}
@@ -502,6 +500,14 @@
setIframes: function( head, body, callback, rendered ) {
var self = this;
if ( body.indexOf( '[' ) !== -1 && body.indexOf( ']' ) !== -1 ) {
var shortcodesRegExp = new RegExp( '\\[\\/?(?:' + window.mceViewL10n.shortcodes.join( '|' ) + ')[^\\]]*?\\]', 'g' );
// Escape tags inside shortcode previews.
body = body.replace( shortcodesRegExp, function( match ) {
return match.replace( /</g, '&lt;' ).replace( />/g, '&gt;' );
} );
}
this.getNodes( function( editor, node ) {
var dom = editor.dom,
styles = '',

File diff suppressed because one or more lines are too long

View File

@@ -8227,13 +8227,13 @@ UploaderInline = View.extend({
},
show: function() {
this.$el.removeClass( 'hidden' );
if ( this.controller.$uploaderToggler.length ) {
if ( this.controller.$uploaderToggler && this.controller.$uploaderToggler.length ) {
this.controller.$uploaderToggler.attr( 'aria-expanded', 'true' );
}
},
hide: function() {
this.$el.addClass( 'hidden' );
if ( this.controller.$uploaderToggler.length ) {
if ( this.controller.$uploaderToggler && this.controller.$uploaderToggler.length ) {
this.controller.$uploaderToggler
.attr( 'aria-expanded', 'false' )
// Move focus back to the toggle button when closing the uploader.

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,9 @@
/* global getUserSetting, setUserSetting */
( function( tinymce ) {
// Set the minimum value for the modals z-index higher than #wpadminbar (100000)
tinymce.ui.FloatPanel.zIndex = 100100;
if ( tinymce.ui.FloatPanel.zIndex < 100100 ) {
tinymce.ui.FloatPanel.zIndex = 100100;
}
tinymce.PluginManager.add( 'wordpress', function( editor ) {
var wpAdvButton, style,

File diff suppressed because one or more lines are too long

View File

@@ -4,7 +4,7 @@
renderHtml: function() {
return (
'<div id="' + this._id + '" class="wp-link-preview">' +
'<a href="' + this.url + '" target="_blank" tabindex="-1">' + this.url + '</a>' +
'<a href="' + this.url + '" target="_blank" rel="noopener" tabindex="-1">' + this.url + '</a>' +
'</div>'
);
},
@@ -249,6 +249,13 @@
text = inputInstance.getLinkText();
editor.focus();
var parser = document.createElement( 'a' );
parser.href = href;
if ( 'javascript:' === parser.protocol || 'data:' === parser.protocol ) { // jshint ignore:line
href = '';
}
if ( ! href ) {
editor.dom.remove( linkNode, true );
return;

File diff suppressed because one or more lines are too long

View File

@@ -101,8 +101,9 @@ img {
width: auto !important;
}
.wp-caption img {
display: block;
dl.wp-caption dt.wp-caption-dt img {
display: inline-block;
margin-bottom: -1ex;
}
div.mceTemp {
@@ -180,6 +181,14 @@ img[data-mce-selected]::selection {
background: #bfe6ff;
}
.mce-content-body .wp-caption-dt a[data-mce-selected] {
outline: none;
padding: 0;
margin: 0;
box-shadow: none;
background: transparent;
}
.mce-content-body code {
padding: 2px 4px;
margin: 0;

View File

@@ -88,7 +88,7 @@ var twemoji = (function (
*/
onerror: function onerror() {
if (this.parentNode) {
this.parentNode.replaceChild(createText(this.alt), this);
this.parentNode.replaceChild(createText(this.alt, false), this);
}
},
@@ -159,13 +159,13 @@ var twemoji = (function (
* @example
*
* twemoji.parse("I \u2764\uFE0F emoji!");
* // I <img class="emoji" draggable="false" alt="❤️" src="/assets/2764.gif"> emoji!
* // I <img class="emoji" draggable="false" alt="❤️" src="/assets/2764.gif"/> emoji!
*
*
* twemoji.parse("I \u2764\uFE0F emoji!", function(iconId, options) {
* return '/assets/' + iconId + '.gif';
* });
* // I <img class="emoji" draggable="false" alt="❤️" src="/assets/2764.gif"> emoji!
* // I <img class="emoji" draggable="false" alt="❤️" src="/assets/2764.gif"/> emoji!
*
*
* twemoji.parse("I \u2764\uFE0F emoji!", {
@@ -174,7 +174,7 @@ var twemoji = (function (
* return '/assets/' + options.size + '/' + iconId + options.ext;
* }
* });
* // I <img class="emoji" draggable="false" alt="❤️" src="/assets/72x72/2764.png"> emoji!
* // I <img class="emoji" draggable="false" alt="❤️" src="/assets/72x72/2764.png"/> emoji!
*
*/
parse: parse,
@@ -237,8 +237,8 @@ var twemoji = (function (
// used to find HTML special chars in attributes
rescaper = /[&<>'"]/g,
// nodes with type 1 which should **not** be parsed (including lower case svg)
shouldntBeParsed = /IFRAME|NOFRAMES|NOSCRIPT|SCRIPT|SELECT|STYLE|TEXTAREA|[a-z]/,
// nodes with type 1 which should **not** be parsed
shouldntBeParsed = /^(?:iframe|noframes|noscript|script|select|style|textarea)$/,
// just a private shortcut
fromCharCode = String.fromCharCode;
@@ -256,8 +256,8 @@ var twemoji = (function (
* @param string text used to create DOM text node
* @return Node a DOM node with that text
*/
function createText(text) {
return document.createTextNode(text);
function createText(text, clean) {
return document.createTextNode(clean ? text.replace(UFE0Fg, '') : text);
}
/**
@@ -301,9 +301,10 @@ var twemoji = (function (
// collect them to process emoji later
allText.push(subnode);
}
// ignore all nodes that are not type 1 or that
// ignore all nodes that are not type 1, that are svg, or that
// should not be parsed as script, style, and others
else if (nodeType === 1 && !shouldntBeParsed.test(subnode.nodeName)) {
else if (nodeType === 1 && !('ownerSVGElement' in subnode) &&
!shouldntBeParsed.test(subnode.nodeName.toLowerCase())) {
grabAllTextNodes(subnode, allText);
}
}
@@ -365,7 +366,7 @@ var twemoji = (function (
index = match.index;
if (index !== i) {
fragment.appendChild(
createText(text.slice(i, index))
createText(text.slice(i, index), true)
);
}
rawText = match[0];
@@ -393,7 +394,7 @@ var twemoji = (function (
modified = true;
fragment.appendChild(img);
}
if (!img) fragment.appendChild(createText(rawText));
if (!img) fragment.appendChild(createText(rawText, false));
img = null;
}
// is there actually anything to replace in here ?
@@ -401,7 +402,7 @@ var twemoji = (function (
// any text left to be added ?
if (i < text.length) {
fragment.appendChild(
createText(text.slice(i))
createText(text.slice(i), true)
);
}
// replace the text node only, leave intact
@@ -459,7 +460,7 @@ var twemoji = (function (
ret = ret.concat(' ', attrname, '="', escapeHTML(attrib[attrname]), '"');
}
}
ret = ret.concat('>');
ret = ret.concat('/>');
}
return ret;
});

File diff suppressed because one or more lines are too long

View File

@@ -1112,7 +1112,10 @@
'PostsRevisions': 'PostRevisions',
'PostsTags': 'PostTags'
}
};
},
modelEndpoints = routeModel.get( 'modelEndpoints' ),
modelRegex = new RegExp( '(?:.*[+)]|\/(' + modelEndpoints.join( '|' ) + '))$' );
/**
* Iterate thru the routes, picking up models and collections to build. Builds two arrays,
@@ -1137,8 +1140,8 @@
index !== ( '/' + routeModel.get( 'versionString' ).slice( 0, -1 ) )
) {
// Single items end with a regex (or the special case 'me').
if ( /(?:.*[+)]|\/me)$/.test( index ) ) {
// Single items end with a regex, or a special case word.
if ( modelRegex.test( index ) ) {
modelRoutes.push( { index: index, route: route } );
} else {
@@ -1360,10 +1363,11 @@
wp.api.init = function( args ) {
var endpoint, attributes = {}, deferred, promise;
args = args || {};
attributes.apiRoot = args.apiRoot || wpApiSettings.root || '/wp-json';
attributes.versionString = args.versionString || wpApiSettings.versionString || 'wp/v2/';
attributes.schema = args.schema || null;
args = args || {};
attributes.apiRoot = args.apiRoot || wpApiSettings.root || '/wp-json';
attributes.versionString = args.versionString || wpApiSettings.versionString || 'wp/v2/';
attributes.schema = args.schema || null;
attributes.modelEndpoints = args.modelEndpoints || [ 'me', 'settings' ];
if ( ! attributes.schema && attributes.apiRoot === wpApiSettings.root && attributes.versionString === wpApiSettings.versionString ) {
attributes.schema = wpApiSettings.schema;
}

File diff suppressed because one or more lines are too long

View File

@@ -54,7 +54,7 @@
context.fillText( stringFromCharCode( 55356, 56826, 8203, 55356, 56819 ), 0, 0 );
flag2 = canvas.toDataURL();
if ( flag !== flag2 ) {
if ( flag === flag2 ) {
return false;
}

View File

@@ -1 +1 @@
!function(a,b,c){function d(a){var b,c,d,e,f=String.fromCharCode;if(!k||!k.fillText)return!1;switch(k.clearRect(0,0,j.width,j.height),k.textBaseline="top",k.font="600 32px Arial",a){case"flag":return k.fillText(f(55356,56826,55356,56819),0,0),b=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,56826,8203,55356,56819),0,0),c=j.toDataURL(),b===c&&(k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447),0,0),b=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447),0,0),c=j.toDataURL(),b!==c);case"emoji4":return k.fillText(f(55358,56794,8205,9794,65039),0,0),d=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55358,56794,8203,9794,65039),0,0),e=j.toDataURL(),d!==e}return!1}function e(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var f,g,h,i,j=b.createElement("canvas"),k=j.getContext&&j.getContext("2d");for(i=Array("flag","emoji4"),c.supports={everything:!0,everythingExceptFlag:!0},h=0;h<i.length;h++)c.supports[i[h]]=d(i[h]),c.supports.everything=c.supports.everything&&c.supports[i[h]],"flag"!==i[h]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[i[h]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(g=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1)):(a.attachEvent("onload",g),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),f=c.source||{},f.concatemoji?e(f.concatemoji):f.wpemoji&&f.twemoji&&(e(f.twemoji),e(f.wpemoji)))}(window,document,window._wpemojiSettings);
!function(a,b,c){function d(a){var b,c,d,e,f=String.fromCharCode;if(!k||!k.fillText)return!1;switch(k.clearRect(0,0,j.width,j.height),k.textBaseline="top",k.font="600 32px Arial",a){case"flag":return k.fillText(f(55356,56826,55356,56819),0,0),b=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,56826,8203,55356,56819),0,0),c=j.toDataURL(),b!==c&&(k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447),0,0),b=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447),0,0),c=j.toDataURL(),b!==c);case"emoji4":return k.fillText(f(55358,56794,8205,9794,65039),0,0),d=j.toDataURL(),k.clearRect(0,0,j.width,j.height),k.fillText(f(55358,56794,8203,9794,65039),0,0),e=j.toDataURL(),d!==e}return!1}function e(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var f,g,h,i,j=b.createElement("canvas"),k=j.getContext&&j.getContext("2d");for(i=Array("flag","emoji4"),c.supports={everything:!0,everythingExceptFlag:!0},h=0;h<i.length;h++)c.supports[i[h]]=d(i[h]),c.supports.everything=c.supports.everything&&c.supports[i[h]],"flag"!==i[h]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[i[h]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(g=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1)):(a.attachEvent("onload",g),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),f=c.source||{},f.concatemoji?e(f.concatemoji):f.wpemoji&&f.twemoji&&(e(f.twemoji),e(f.wpemoji)))}(window,document,window._wpemojiSettings);

File diff suppressed because one or more lines are too long

View File

@@ -312,7 +312,7 @@ var wpLink;
var html = '<a href="' + attrs.href + '"';
if ( attrs.target ) {
html += ' target="' + attrs.target + '"';
html += ' rel="noopener" target="' + attrs.target + '"';
}
return html + '>';
@@ -337,6 +337,13 @@ var wpLink;
attrs = wpLink.getAttrs();
text = inputs.text.val();
var parser = document.createElement( 'a' );
parser.href = attrs.href;
if ( 'javascript:' === parser.protocol || 'data:' === parser.protocol ) { // jshint ignore:line
attrs.href = '';
}
// If there's no href, return.
if ( ! attrs.href ) {
return;
@@ -390,6 +397,13 @@ var wpLink;
var attrs = wpLink.getAttrs(),
$link, text, hasText, $mceCaret;
var parser = document.createElement( 'a' );
parser.href = attrs.href;
if ( 'javascript:' === parser.protocol || 'data:' === parser.protocol ) { // jshint ignore:line
attrs.href = '';
}
if ( ! attrs.href ) {
editor.execCommand( 'unlink' );
wpLink.close();

File diff suppressed because one or more lines are too long

View File

@@ -2556,7 +2556,11 @@ function wp_video_shortcode( $attr, $content = '' ) {
} elseif ( $is_vimeo ) {
// Remove all query arguments and force SSL - see #40866.
$parsed_vimeo_url = wp_parse_url( $atts['src'] );
$atts['src'] = 'https://' . $parsed_vimeo_url['host'] . $parsed_vimeo_url['path'];
$vimeo_src = 'https://' . $parsed_vimeo_url['host'] . $parsed_vimeo_url['path'];
// Add loop param for mejs bug - see #40977, not needed after #39686.
$loop = $atts['loop'] ? '1' : '0';
$atts['src'] = add_query_arg( 'loop', $loop, $vimeo_src );
}
}

View File

@@ -324,6 +324,11 @@ function get_rest_url( $blog_id = null, $path = '/', $scheme = 'rest' ) {
$url .= '/' . ltrim( $path, '/' );
} else {
$url = trailingslashit( get_home_url( $blog_id, '', $scheme ) );
// nginx only allows HTTP/1.0 methods when redirecting from / to /index.php
// To work around this, we manually add index.php to the URL, avoiding the redirect.
if ( 'index.php' !== substr( $url, 9 ) ) {
$url .= 'index.php';
}
$path = '/' . ltrim( $path, '/' );

View File

@@ -387,6 +387,20 @@ class WP_REST_Server {
// Embed links inside the request.
$result = $this->response_to_data( $result, isset( $_GET['_embed'] ) );
/**
* Filters the API response.
*
* Allows modification of the response data after inserting
* embedded data (if any) and before echoing the response data.
*
* @since 4.8.1
*
* @param array $result Response data to send to the client.
* @param WP_REST_Server $this Server instance.
* @param WP_REST_Request $request Request used to generate the response.
*/
$result = apply_filters( 'rest_pre_echo_response', $result, $this, $request );
$result = wp_json_encode( $result );
$json_error_message = $this->get_json_last_error();

View File

@@ -608,7 +608,7 @@ function wp_default_scripts( &$scripts ) {
$scripts->add( 'media-audio-widget', "/wp-admin/js/widgets/media-audio-widget$suffix.js", array( 'media-widgets', 'media-audiovideo' ) );
$scripts->add( 'media-image-widget', "/wp-admin/js/widgets/media-image-widget$suffix.js", array( 'media-widgets' ) );
$scripts->add( 'media-video-widget', "/wp-admin/js/widgets/media-video-widget$suffix.js", array( 'media-widgets', 'media-audiovideo' ) );
$scripts->add( 'text-widgets', "/wp-admin/js/widgets/text-widgets$suffix.js", array( 'jquery', 'backbone', 'editor', 'wp-util' ) );
$scripts->add( 'text-widgets', "/wp-admin/js/widgets/text-widgets$suffix.js", array( 'jquery', 'backbone', 'editor', 'wp-util', 'wp-a11y' ) );
$scripts->add_inline_script( 'text-widgets', 'wp.textWidgets.init();', 'after' );
$scripts->add( 'theme', "/wp-admin/js/theme$suffix.js", array( 'wp-backbone', 'wp-a11y' ), false, 1 );
@@ -845,7 +845,7 @@ function wp_default_styles( &$styles ) {
$styles->add( 'themes', "/wp-admin/css/themes$suffix.css" );
$styles->add( 'about', "/wp-admin/css/about$suffix.css" );
$styles->add( 'nav-menus', "/wp-admin/css/nav-menus$suffix.css" );
$styles->add( 'widgets', "/wp-admin/css/widgets$suffix.css" );
$styles->add( 'widgets', "/wp-admin/css/widgets$suffix.css", array( 'wp-pointer' ) );
$styles->add( 'site-icon', "/wp-admin/css/site-icon$suffix.css" );
$styles->add( 'l10n', "/wp-admin/css/l10n$suffix.css" );
@@ -949,6 +949,10 @@ function wp_just_in_time_script_localization() {
'autosaveInterval' => AUTOSAVE_INTERVAL,
'blog_id' => get_current_blog_id(),
) );
wp_localize_script( 'mce-view', 'mceViewL10n', array(
'shortcodes' => ! empty( $GLOBALS['shortcode_tags'] ) ? array_keys( $GLOBALS['shortcode_tags'] ) : array()
) );
}
/**

View File

@@ -1864,7 +1864,10 @@ function wp_get_object_terms($object_ids, $taxonomies, $args = array()) {
$args['taxonomy'] = $taxonomies;
$args['object_ids'] = $object_ids;
$terms = array_merge( $terms, get_terms( $args ) );
// Taxonomies registered without an 'args' param are handled here.
if ( ! empty( $taxonomies ) ) {
$terms = array_merge( $terms, get_terms( $args ) );
}
/**
* Filters the terms for a given object or objects.

View File

@@ -1948,15 +1948,19 @@ function get_theme_starter_content() {
'text_business_info' => array( 'text', array(
'title' => _x( 'Find Us', 'Theme starter content' ),
'text' => join( '', array(
'<p><strong>' . _x( 'Address', 'Theme starter content' ) . '</strong><br />',
_x( '123 Main Street', 'Theme starter content' ) . '<br />' . _x( 'New York, NY 10001', 'Theme starter content' ) . '</p>',
'<p><strong>' . _x( 'Hours', 'Theme starter content' ) . '</strong><br />',
_x( 'Monday&mdash;Friday: 9:00AM&ndash;5:00PM', 'Theme starter content' ) . '<br />' . _x( 'Saturday &amp; Sunday: 11:00AM&ndash;3:00PM', 'Theme starter content' ) . '</p>'
'<strong>' . _x( 'Address', 'Theme starter content' ) . "</strong>\n",
_x( '123 Main Street', 'Theme starter content' ) . "\n" . _x( 'New York, NY 10001', 'Theme starter content' ) . "\n\n",
'<strong>' . _x( 'Hours', 'Theme starter content' ) . "</strong>\n",
_x( 'Monday&mdash;Friday: 9:00AM&ndash;5:00PM', 'Theme starter content' ) . "\n" . _x( 'Saturday &amp; Sunday: 11:00AM&ndash;3:00PM', 'Theme starter content' )
) ),
'filter' => true,
'visual' => true,
) ),
'text_about' => array( 'text', array(
'title' => _x( 'About This Site', 'Theme starter content' ),
'text' => _x( 'This may be a good place to introduce yourself and your site or include some credits.', 'Theme starter content' ),
'filter' => true,
'visual' => true,
) ),
'archives' => array( 'archives', array(
'title' => _x( 'Archives', 'Theme starter content' ),

View File

@@ -4,7 +4,7 @@
*
* @global string $wp_version
*/
$wp_version = '4.8-RC2-40868';
$wp_version = '4.8.2';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.

View File

@@ -1474,6 +1474,8 @@ function wp_widgets_init() {
register_widget( 'WP_Nav_Menu_Widget' );
register_widget( 'WP_Widget_Custom_HTML' );
/**
* Fires after all default WordPress widgets have been registered.
*

View File

@@ -115,13 +115,9 @@ class WP_Widget_Media_Video extends WP_Widget_Media {
$attachment = get_post( $instance['attachment_id'] );
}
$src = $instance['url'];
if ( $attachment ) {
$src = wp_get_attachment_url( $attachment->ID );
} else {
// Manually add the loop query argument.
$loop = $instance['loop'] ? '1' : '0';
$src = empty( $instance['url'] ) ? $instance['url'] : add_query_arg( 'loop', $loop, $instance['url'] );
}
if ( empty( $src ) ) {

View File

@@ -33,6 +33,14 @@ abstract class WP_Widget_Media extends WP_Widget {
'add_media' => '',
);
/**
* Whether or not the widget has been registered yet.
*
* @since 4.8.1
* @var bool
*/
protected $registered = false;
/**
* Constructor.
*
@@ -86,8 +94,16 @@ abstract class WP_Widget_Media extends WP_Widget {
*
* @since 4.8.0
* @access public
*
* @param integer $number Optional. The unique order number of this widget instance
* compared to other instances of the same class. Default -1.
*/
public function _register() {
public function _register_one( $number = -1 ) {
parent::_register_one( $number );
if ( $this->registered ) {
return;
}
$this->registered = true;
// Note that the widgets component in the customizer will also do the 'admin_print_scripts-widgets.php' action in WP_Customize_Widgets::print_scripts().
add_action( 'admin_print_scripts-widgets.php', array( $this, 'enqueue_admin_scripts' ) );
@@ -100,8 +116,6 @@ abstract class WP_Widget_Media extends WP_Widget {
add_action( 'admin_footer-widgets.php', array( $this, 'render_control_template_scripts' ) );
add_filter( 'display_media_states', array( $this, 'display_media_state' ), 10, 2 );
parent::_register();
}
/**

View File

@@ -16,6 +16,14 @@
*/
class WP_Widget_Text extends WP_Widget {
/**
* Whether or not the widget has been registered yet.
*
* @since 4.8.1
* @var bool
*/
protected $registered = false;
/**
* Sets up a new Text widget instance.
*
@@ -25,7 +33,7 @@ class WP_Widget_Text extends WP_Widget {
public function __construct() {
$widget_ops = array(
'classname' => 'widget_text',
'description' => __( 'Arbitrary text or HTML.' ),
'description' => __( 'Arbitrary text.' ),
'customize_selective_refresh' => true,
);
$control_ops = array(
@@ -38,18 +46,135 @@ class WP_Widget_Text extends WP_Widget {
/**
* Add hooks for enqueueing assets when registering all widget instances of this widget class.
*
* @since 4.8.0
* @access public
* @param integer $number Optional. The unique order number of this widget instance
* compared to other instances of the same class. Default -1.
*/
public function _register() {
public function _register_one( $number = -1 ) {
parent::_register_one( $number );
if ( $this->registered ) {
return;
}
$this->registered = true;
// Note that the widgets component in the customizer will also do the 'admin_print_scripts-widgets.php' action in WP_Customize_Widgets::print_scripts().
add_action( 'admin_print_scripts-widgets.php', array( $this, 'enqueue_admin_scripts' ) );
// Note that the widgets component in the customizer will also do the 'admin_footer-widgets.php' action in WP_Customize_Widgets::print_footer_scripts().
add_action( 'admin_footer-widgets.php', array( $this, 'render_control_template_scripts' ) );
}
parent::_register();
/**
* Determines whether a given instance is legacy and should bypass using TinyMCE.
*
* @since 4.8.1
*
* @param array $instance {
* Instance data.
*
* @type string $text Content.
* @type bool|string $filter Whether autop or content filters should apply.
* @type bool $legacy Whether widget is in legacy mode.
* }
* @return bool Whether Text widget instance contains legacy data.
*/
public function is_legacy_instance( $instance ) {
// Legacy mode when not in visual mode.
if ( isset( $instance['visual'] ) ) {
return ! $instance['visual'];
}
// Or, the widget has been added/updated in 4.8.0 then filter prop is 'content' and it is no longer legacy.
if ( isset( $instance['filter'] ) && 'content' === $instance['filter'] ) {
return false;
}
// If the text is empty, then nothing is preventing migration to TinyMCE.
if ( empty( $instance['text'] ) ) {
return false;
}
$wpautop = ! empty( $instance['filter'] );
$has_line_breaks = ( false !== strpos( trim( $instance['text'] ), "\n" ) );
// If auto-paragraphs are not enabled and there are line breaks, then ensure legacy mode.
if ( ! $wpautop && $has_line_breaks ) {
return true;
}
// If an HTML comment is present, assume legacy mode.
if ( false !== strpos( $instance['text'], '<!--' ) ) {
return true;
}
// In the rare case that DOMDocument is not available we cannot reliably sniff content and so we assume legacy.
if ( ! class_exists( 'DOMDocument' ) ) {
// @codeCoverageIgnoreStart
return true;
// @codeCoverageIgnoreEnd
}
$doc = new DOMDocument();
@$doc->loadHTML( sprintf(
'<!DOCTYPE html><html><head><meta charset="%s"></head><body>%s</body></html>',
esc_attr( get_bloginfo( 'charset' ) ),
$instance['text']
) );
$body = $doc->getElementsByTagName( 'body' )->item( 0 );
// See $allowedposttags.
$safe_elements_attributes = array(
'strong' => array(),
'em' => array(),
'b' => array(),
'i' => array(),
'u' => array(),
's' => array(),
'ul' => array(),
'ol' => array(),
'li' => array(),
'hr' => array(),
'abbr' => array(),
'acronym' => array(),
'code' => array(),
'dfn' => array(),
'a' => array(
'href' => true,
),
'img' => array(
'src' => true,
'alt' => true,
),
);
$safe_empty_elements = array( 'img', 'hr', 'iframe' );
foreach ( $body->getElementsByTagName( '*' ) as $element ) {
/** @var DOMElement $element */
$tag_name = strtolower( $element->nodeName );
// If the element is not safe, then the instance is legacy.
if ( ! isset( $safe_elements_attributes[ $tag_name ] ) ) {
return true;
}
// If the element is not safely empty and it has empty contents, then legacy mode.
if ( ! in_array( $tag_name, $safe_empty_elements, true ) && '' === trim( $element->textContent ) ) {
return true;
}
// If an attribute is not recognized as safe, then the instance is legacy.
foreach ( $element->attributes as $attribute ) {
/** @var DOMAttr $attribute */
$attribute_name = strtolower( $attribute->nodeName );
if ( ! isset( $safe_elements_attributes[ $tag_name ][ $attribute_name ] ) ) {
return true;
}
}
}
// Otherwise, the text contains no elements/attributes that TinyMCE could drop, and therefore the widget does not need legacy mode.
return false;
}
/**
@@ -68,38 +193,66 @@ class WP_Widget_Text extends WP_Widget {
$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );
$text = ! empty( $instance['text'] ) ? $instance['text'] : '';
$is_visual_text_widget = ( ! empty( $instance['visual'] ) && ! empty( $instance['filter'] ) );
// In 4.8.0 only, visual Text widgets get filter=content, without visual prop; upgrade instance props just-in-time.
if ( ! $is_visual_text_widget ) {
$is_visual_text_widget = ( isset( $instance['filter'] ) && 'content' === $instance['filter'] );
}
if ( $is_visual_text_widget ) {
$instance['filter'] = true;
$instance['visual'] = true;
}
/*
* Just-in-time temporarily upgrade Visual Text widget shortcode handling
* (with support added by plugin) from the widget_text filter to
* widget_text_content:11 to prevent wpautop from corrupting HTML output
* added by the shortcode.
*/
$widget_text_do_shortcode_priority = has_filter( 'widget_text', 'do_shortcode' );
$should_upgrade_shortcode_handling = ( $is_visual_text_widget && false !== $widget_text_do_shortcode_priority );
if ( $should_upgrade_shortcode_handling ) {
remove_filter( 'widget_text', 'do_shortcode', $widget_text_do_shortcode_priority );
add_filter( 'widget_text_content', 'do_shortcode', 11 );
}
/**
* Filters the content of the Text widget.
*
* @since 2.3.0
* @since 4.4.0 Added the `$this` parameter.
* @since 4.8.1 The `$this` param may now be a `WP_Widget_Custom_HTML` object in addition to a `WP_Widget_Text` object.
*
* @param string $text The widget content.
* @param array $instance Array of settings for the current widget.
* @param WP_Widget_Text $this Current Text widget instance.
* @param string $text The widget content.
* @param array $instance Array of settings for the current widget.
* @param WP_Widget_Text|WP_Widget_Custom_HTML $this Current Text widget instance.
*/
$text = apply_filters( 'widget_text', $text, $instance, $this );
if ( isset( $instance['filter'] ) ) {
if ( 'content' === $instance['filter'] ) {
if ( $is_visual_text_widget ) {
/**
* Filters the content of the Text widget to apply changes expected from the visual (TinyMCE) editor.
*
* By default a subset of the_content filters are applied, including wpautop and wptexturize.
*
* @since 4.8.0
*
* @param string $text The widget content.
* @param array $instance Array of settings for the current widget.
* @param WP_Widget_Text $this Current Text widget instance.
*/
$text = apply_filters( 'widget_text_content', $text, $instance, $this );
/**
* Filters the content of the Text widget to apply changes expected from the visual (TinyMCE) editor.
*
* By default a subset of the_content filters are applied, including wpautop and wptexturize.
*
* @since 4.8.0
*
* @param string $text The widget content.
* @param array $instance Array of settings for the current widget.
* @param WP_Widget_Text $this Current Text widget instance.
*/
$text = apply_filters( 'widget_text_content', $text, $instance, $this );
} elseif ( $instance['filter'] ) {
$text = wpautop( $text ); // Back-compat for instances prior to 4.8.
}
} elseif ( ! empty( $instance['filter'] ) ) {
$text = wpautop( $text ); // Back-compat for instances prior to 4.8.
}
// Undo temporary upgrade of the plugin-supplied shortcode handling.
if ( $should_upgrade_shortcode_handling ) {
remove_filter( 'widget_text_content', 'do_shortcode', 11 );
add_filter( 'widget_text', 'do_shortcode', $widget_text_do_shortcode_priority );
}
echo $args['before_widget'];
@@ -125,7 +278,15 @@ class WP_Widget_Text extends WP_Widget {
* @return array Settings to save or bool false to cancel saving.
*/
public function update( $new_instance, $old_instance ) {
$new_instance = wp_parse_args( $new_instance, array(
'title' => '',
'text' => '',
'filter' => false, // For back-compat.
'visual' => null, // Must be explicitly defined.
) );
$instance = $old_instance;
$instance['title'] = sanitize_text_field( $new_instance['title'] );
if ( current_user_can( 'unfiltered_html' ) ) {
$instance['text'] = $new_instance['text'];
@@ -133,13 +294,24 @@ class WP_Widget_Text extends WP_Widget {
$instance['text'] = wp_kses_post( $new_instance['text'] );
}
/*
* Re-use legacy 'filter' (wpautop) property to now indicate content filters will always apply.
* Prior to 4.8, this is a boolean value used to indicate whether or not wpautop should be
* applied. By re-using this property, downgrading WordPress from 4.8 to 4.7 will ensure
* that the content for Text widgets created with TinyMCE will continue to get wpautop.
*/
$instance['filter'] = 'content';
$instance['filter'] = ! empty( $new_instance['filter'] );
// Upgrade 4.8.0 format.
if ( isset( $old_instance['filter'] ) && 'content' === $old_instance['filter'] ) {
$instance['visual'] = true;
}
if ( 'content' === $new_instance['filter'] ) {
$instance['visual'] = true;
}
if ( isset( $new_instance['visual'] ) ) {
$instance['visual'] = ! empty( $new_instance['visual'] );
}
// Filter is always true in visual mode.
if ( ! empty( $instance['visual'] ) ) {
$instance['filter'] = true;
}
return $instance;
}
@@ -160,8 +332,10 @@ class WP_Widget_Text extends WP_Widget {
*
* @since 2.8.0
* @since 4.8.0 Form only contains hidden inputs which are synced with JS template.
* @since 4.8.1 Restored original form to be displayed when in legacy mode.
* @access public
* @see WP_Widget_Visual_Text::render_control_template_scripts()
* @see _WP_Editors::editor()
*
* @param array $instance Current settings.
* @return void
@@ -175,9 +349,54 @@ class WP_Widget_Text extends WP_Widget {
)
);
?>
<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" class="title" type="hidden" value="<?php echo esc_attr( $instance['title'] ); ?>">
<input id="<?php echo $this->get_field_id( 'text' ); ?>" name="<?php echo $this->get_field_name( 'text' ); ?>" class="text" type="hidden" value="<?php echo esc_attr( $instance['text'] ); ?>">
<?php if ( ! $this->is_legacy_instance( $instance ) ) : ?>
<?php
if ( user_can_richedit() ) {
add_filter( 'the_editor_content', 'format_for_editor', 10, 2 );
$default_editor = 'tinymce';
} else {
$default_editor = 'html';
}
/** This filter is documented in wp-includes/class-wp-editor.php */
$text = apply_filters( 'the_editor_content', $instance['text'], $default_editor );
// Reset filter addition.
if ( user_can_richedit() ) {
remove_filter( 'the_editor_content', 'format_for_editor' );
}
// Prevent premature closing of textarea in case format_for_editor() didn't apply or the_editor_content filter did a wrong thing.
$escaped_text = preg_replace( '#</textarea#i', '&lt;/textarea', $text );
?>
<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" class="title sync-input" type="hidden" value="<?php echo esc_attr( $instance['title'] ); ?>">
<textarea id="<?php echo $this->get_field_id( 'text' ); ?>" name="<?php echo $this->get_field_name( 'text' ); ?>" class="text sync-input" hidden><?php echo $escaped_text; ?></textarea>
<input id="<?php echo $this->get_field_id( 'filter' ); ?>" name="<?php echo $this->get_field_name( 'filter' ); ?>" class="filter sync-input" type="hidden" value="on">
<input id="<?php echo $this->get_field_id( 'visual' ); ?>" name="<?php echo $this->get_field_name( 'visual' ); ?>" class="visual sync-input" type="hidden" value="on">
<?php else : ?>
<input id="<?php echo $this->get_field_id( 'visual' ); ?>" name="<?php echo $this->get_field_name( 'visual' ); ?>" class="visual" type="hidden" value="">
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>"/>
</p>
<div class="notice inline notice-info notice-alt">
<?php if ( ! isset( $instance['visual'] ) ) : ?>
<p><?php _e( 'This widget may contain code that may work better in the new &#8220;Custom HTML&#8221; widget. How about trying that widget instead?' ); ?></p>
<?php else : ?>
<p><?php _e( 'This widget may have contained code that may work better in the new &#8220;Custom HTML&#8221; widget. If you haven&#8217;t yet, how about trying that widget instead?' ); ?></p>
<?php endif; ?>
</div>
<p>
<label for="<?php echo $this->get_field_id( 'text' ); ?>"><?php _e( 'Content:' ); ?></label>
<textarea class="widefat" rows="16" cols="20" id="<?php echo $this->get_field_id( 'text' ); ?>" name="<?php echo $this->get_field_name( 'text' ); ?>"><?php echo esc_textarea( $instance['text'] ); ?></textarea>
</p>
<p>
<input id="<?php echo $this->get_field_id( 'filter' ); ?>" name="<?php echo $this->get_field_name( 'filter' ); ?>" type="checkbox"<?php checked( ! empty( $instance['filter'] ) ); ?> />&nbsp;<label for="<?php echo $this->get_field_id( 'filter' ); ?>"><?php _e( 'Automatically add paragraphs' ); ?></label>
</p>
<?php
endif;
}
/**
@@ -187,6 +406,7 @@ class WP_Widget_Text extends WP_Widget {
* @access public
*/
public function render_control_template_scripts() {
$dismissed_pointers = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );
?>
<script type="text/html" id="tmpl-widget-text-control-fields">
<# var elementIdPrefix = 'el' + String( Math.random() ).replace( /\D/g, '' ) + '_' #>
@@ -194,6 +414,41 @@ class WP_Widget_Text extends WP_Widget {
<label for="{{ elementIdPrefix }}title"><?php esc_html_e( 'Title:' ); ?></label>
<input id="{{ elementIdPrefix }}title" type="text" class="widefat title">
</p>
<?php if ( ! in_array( 'text_widget_custom_html', $dismissed_pointers, true ) ) : ?>
<div hidden class="wp-pointer custom-html-widget-pointer wp-pointer-top">
<div class="wp-pointer-content">
<h3><?php _e( 'New Custom HTML Widget' ); ?></h3>
<?php if ( is_customize_preview() ) : ?>
<p><?php _e( 'Hey, did you hear we have a &#8220;Custom HTML&#8221; widget now? You can find it by pressing the &#8220;<a class="add-widget" href="#">Add a Widget</a>&#8221; button and searching for &#8220;HTML&#8221;. Check it out to add some custom code to your site!' ); ?></p>
<?php else : ?>
<p><?php _e( 'Hey, did you hear we have a &#8220;Custom HTML&#8221; widget now? You can find it by scanning the list of available widgets on this screen. Check it out to add some custom code to your site!' ); ?></p>
<?php endif; ?>
<div class="wp-pointer-buttons">
<a class="close" href="#"><?php _e( 'Dismiss' ); ?></a>
</div>
</div>
<div class="wp-pointer-arrow">
<div class="wp-pointer-arrow-inner"></div>
</div>
</div>
<?php endif; ?>
<?php if ( ! in_array( 'text_widget_paste_html', $dismissed_pointers, true ) ) : ?>
<div hidden class="wp-pointer paste-html-pointer wp-pointer-top">
<div class="wp-pointer-content">
<h3><?php _e( 'Did you just paste HTML?' ); ?></h3>
<p><?php _e( 'Hey there, looks like you just pasted HTML into the &#8220;Visual&#8221; tab of the Text widget. You may want to paste your code into the &#8220;Text&#8221; tab instead. Alternately, try out the new &#8220;Custom HTML&#8221; widget!' ); ?></p>
<div class="wp-pointer-buttons">
<a class="close" href="#"><?php _e( 'Dismiss' ); ?></a>
</div>
</div>
<div class="wp-pointer-arrow">
<div class="wp-pointer-arrow-inner"></div>
</div>
</div>
<?php endif; ?>
<p>
<label for="{{ elementIdPrefix }}text" class="screen-reader-text"><?php esc_html_e( 'Content:' ); ?></label>
<textarea id="{{ elementIdPrefix }}text" class="widefat text wp-editor-area" style="height: 200px" rows="16" cols="20"></textarea>

View File

@@ -1299,13 +1299,23 @@ class wpdb {
$args = func_get_args();
array_shift( $args );
// If args were passed as an array (as in vsprintf), move them up
if ( isset( $args[0] ) && is_array($args[0]) )
if ( is_array( $args[0] ) && count( $args ) == 1 ) {
$args = $args[0];
}
foreach ( $args as $arg ) {
if ( ! is_scalar( $arg ) && ! is_null( $arg ) ) {
_doing_it_wrong( 'wpdb::prepare', sprintf( 'Unsupported value type (%s).', gettype( $arg ) ), '4.8.2' );
}
}
$query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
$query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
$query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
$query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
$query = preg_replace( '/%(?:%|$|([^dsF]))/', '%%\\1', $query ); // escape any unescaped percents
array_walk( $args, array( $this, 'escape_by_ref' ) );
return @vsprintf( $query, $args );
}
@@ -2888,7 +2898,8 @@ class wpdb {
}
if ( is_array( $value['length'] ) ) {
$queries[ $col ] = $this->prepare( "CONVERT( LEFT( CONVERT( %s USING $charset ), %.0f ) USING $connection_charset )", $value['value'], $value['length']['length'] );
$length = sprintf( '%.0f', $value['length']['length'] );
$queries[ $col ] = $this->prepare( "CONVERT( LEFT( CONVERT( %s USING $charset ), $length ) USING $connection_charset )", $value['value'] );
} else if ( 'binary' !== $charset ) {
// If we don't have a length, there's no need to convert binary - it will always return the same result.
$queries[ $col ] = $this->prepare( "CONVERT( CONVERT( %s USING $charset ) USING $connection_charset )", $value['value'] );