Version Description
Download this release
Release Info
| Developer | westonruter |
| Plugin | |
| Version | 1.4.2 |
| Comparing to | |
| See all releases | |
Code changes from version 1.4.1 to 1.4.2
- amp.php +2 -2
- assets/css/amp-validation-single-error-url-rtl.css +4 -0
- assets/css/amp-validation-single-error-url.css +4 -0
- assets/fonts/genericons.woff +0 -0
- assets/fonts/nonbreakingspaceoverride.woff +0 -0
- assets/fonts/nonbreakingspaceoverride.woff2 +0 -0
- includes/class-amp-story-post-type.php +6 -2
- includes/class-amp-theme-support.php +61 -25
- includes/options/class-amp-options-manager.php +32 -54
- includes/sanitizers/class-amp-core-theme-sanitizer.php +203 -154
- includes/sanitizers/class-amp-style-sanitizer.php +14 -2
- includes/sanitizers/class-amp-tag-and-attribute-sanitizer.php +8 -10
- includes/validation/class-amp-validated-url-post-type.php +29 -23
- includes/validation/class-amp-validation-manager.php +87 -23
- readme.txt +6 -2
- vendor/autoload.php +1 -1
- vendor/composer/autoload_real.php +4 -4
- vendor/composer/autoload_static.php +5 -5
amp.php
CHANGED
|
@@ -5,7 +5,7 @@
|
|
| 5 |
* Plugin URI: https://amp-wp.org
|
| 6 |
* Author: AMP Project Contributors
|
| 7 |
* Author URI: https://github.com/ampproject/amp-wp/graphs/contributors
|
| 8 |
-
* Version: 1.4.
|
| 9 |
* Text Domain: amp
|
| 10 |
* Domain Path: /languages/
|
| 11 |
* License: GPLv2 or later
|
|
@@ -15,7 +15,7 @@
|
|
| 15 |
|
| 16 |
define( 'AMP__FILE__', __FILE__ );
|
| 17 |
define( 'AMP__DIR__', dirname( __FILE__ ) );
|
| 18 |
-
define( 'AMP__VERSION', '1.4.
|
| 19 |
|
| 20 |
/**
|
| 21 |
* Errors encountered while loading the plugin.
|
| 5 |
* Plugin URI: https://amp-wp.org
|
| 6 |
* Author: AMP Project Contributors
|
| 7 |
* Author URI: https://github.com/ampproject/amp-wp/graphs/contributors
|
| 8 |
+
* Version: 1.4.2
|
| 9 |
* Text Domain: amp
|
| 10 |
* Domain Path: /languages/
|
| 11 |
* License: GPLv2 or later
|
| 15 |
|
| 16 |
define( 'AMP__FILE__', __FILE__ );
|
| 17 |
define( 'AMP__DIR__', dirname( __FILE__ ) );
|
| 18 |
+
define( 'AMP__VERSION', '1.4.2' );
|
| 19 |
|
| 20 |
/**
|
| 21 |
* Errors encountered while loading the plugin.
|
assets/css/amp-validation-single-error-url-rtl.css
CHANGED
|
@@ -63,6 +63,10 @@ table.striped > tbody > tr.even {
|
|
| 63 |
font-weight: 600;
|
| 64 |
}
|
| 65 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
.column-status select {
|
| 67 |
vertical-align: top;
|
| 68 |
}
|
| 63 |
font-weight: 600;
|
| 64 |
}
|
| 65 |
|
| 66 |
+
.detailed pre {
|
| 67 |
+
white-space: pre-wrap;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
.column-status select {
|
| 71 |
vertical-align: top;
|
| 72 |
}
|
assets/css/amp-validation-single-error-url.css
CHANGED
|
@@ -63,6 +63,10 @@ table.striped > tbody > tr.even {
|
|
| 63 |
font-weight: 600;
|
| 64 |
}
|
| 65 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
.column-status select {
|
| 67 |
vertical-align: top;
|
| 68 |
}
|
| 63 |
font-weight: 600;
|
| 64 |
}
|
| 65 |
|
| 66 |
+
.detailed pre {
|
| 67 |
+
white-space: pre-wrap;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
.column-status select {
|
| 71 |
vertical-align: top;
|
| 72 |
}
|
assets/fonts/genericons.woff
ADDED
|
Binary file
|
assets/fonts/nonbreakingspaceoverride.woff
ADDED
|
Binary file
|
assets/fonts/nonbreakingspaceoverride.woff2
ADDED
|
Binary file
|
includes/class-amp-story-post-type.php
CHANGED
|
@@ -684,10 +684,14 @@ class AMP_Story_Post_Type {
|
|
| 684 |
/**
|
| 685 |
* Filter the allowed tags for KSES to allow for amp-story children.
|
| 686 |
*
|
| 687 |
-
* @param array $allowed_tags Allowed tags.
|
| 688 |
-
* @return array Allowed tags.
|
| 689 |
*/
|
| 690 |
public static function filter_kses_allowed_html( $allowed_tags ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 691 |
$story_components = [
|
| 692 |
'amp-story-page',
|
| 693 |
'amp-story-grid-layer',
|
| 684 |
/**
|
| 685 |
* Filter the allowed tags for KSES to allow for amp-story children.
|
| 686 |
*
|
| 687 |
+
* @param array|string $allowed_tags Allowed tags.
|
| 688 |
+
* @return array|string Allowed tags.
|
| 689 |
*/
|
| 690 |
public static function filter_kses_allowed_html( $allowed_tags ) {
|
| 691 |
+
if ( ! is_array( $allowed_tags ) ) {
|
| 692 |
+
return $allowed_tags;
|
| 693 |
+
}
|
| 694 |
+
|
| 695 |
$story_components = [
|
| 696 |
'amp-story-page',
|
| 697 |
'amp-story-grid-layer',
|
includes/class-amp-theme-support.php
CHANGED
|
@@ -1468,6 +1468,57 @@ class AMP_Theme_Support {
|
|
| 1468 |
return false;
|
| 1469 |
}
|
| 1470 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1471 |
/**
|
| 1472 |
* Add data-ampdevmode attribute to any enqueued style that depends on the admin-bar.
|
| 1473 |
*
|
|
@@ -1478,30 +1529,11 @@ class AMP_Theme_Support {
|
|
| 1478 |
* @return string Tag.
|
| 1479 |
*/
|
| 1480 |
public static function filter_admin_bar_style_loader_tag( $tag, $handle ) {
|
| 1481 |
-
if (
|
| 1482 |
-
|
| 1483 |
-
|
| 1484 |
-
|
| 1485 |
-
|
| 1486 |
-
// If a theme or plugin directly enqueued dashicons, then it is not added via admin-bar dependency and it is not part of dev mode.
|
| 1487 |
-
'dashicons' === $queued_handle
|
| 1488 |
-
||
|
| 1489 |
-
// If a stylesheet has dashicons as a dependency without also having admin-bar as a dependency, then no dev mode.
|
| 1490 |
-
(
|
| 1491 |
-
self::has_dependency( wp_styles(), $queued_handle, 'dashicons' )
|
| 1492 |
-
&&
|
| 1493 |
-
! self::has_dependency( wp_styles(), $queued_handle, 'admin-bar' )
|
| 1494 |
-
)
|
| 1495 |
-
) {
|
| 1496 |
-
$needs_dev_mode = false;
|
| 1497 |
-
break;
|
| 1498 |
-
}
|
| 1499 |
-
}
|
| 1500 |
-
} else {
|
| 1501 |
-
$needs_dev_mode = self::has_dependency( wp_styles(), $handle, 'admin-bar' );
|
| 1502 |
-
}
|
| 1503 |
-
|
| 1504 |
-
if ( $needs_dev_mode ) {
|
| 1505 |
$tag = preg_replace( '/(?<=<link)(?=\s|>)/i', ' ' . AMP_Rule_Spec::DEV_MODE_ATTRIBUTE, $tag );
|
| 1506 |
}
|
| 1507 |
return $tag;
|
|
@@ -1517,7 +1549,11 @@ class AMP_Theme_Support {
|
|
| 1517 |
* @return string Tag.
|
| 1518 |
*/
|
| 1519 |
public static function filter_admin_bar_script_loader_tag( $tag, $handle ) {
|
| 1520 |
-
if (
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1521 |
$tag = preg_replace( '/(?<=<script)(?=\s|>)/i', ' ' . AMP_Rule_Spec::DEV_MODE_ATTRIBUTE, $tag );
|
| 1522 |
}
|
| 1523 |
return $tag;
|
| 1468 |
return false;
|
| 1469 |
}
|
| 1470 |
|
| 1471 |
+
/**
|
| 1472 |
+
* Check if a handle is exclusively a dependency of another handle.
|
| 1473 |
+
*
|
| 1474 |
+
* For example, check if dashicons is being added exclusively because it is a dependency of admin-bar, as opposed
|
| 1475 |
+
* to being added because it was directly enqueued by a theme or a dependency of some other style.
|
| 1476 |
+
*
|
| 1477 |
+
* @since 1.4.2
|
| 1478 |
+
*
|
| 1479 |
+
* @param WP_Dependencies $dependencies Dependencies.
|
| 1480 |
+
* @param string $dependency_handle Dependency handle.
|
| 1481 |
+
* @param string $dependent_handle Dependent handle.
|
| 1482 |
+
* @return bool Whether the $handle is exclusively a handle of the $exclusive_dependency handle.
|
| 1483 |
+
*/
|
| 1484 |
+
protected static function is_exclusively_dependent( WP_Dependencies $dependencies, $dependency_handle, $dependent_handle ) {
|
| 1485 |
+
|
| 1486 |
+
// If a dependency handle is the same as the dependent handle, then this self-referential relationship is exclusive.
|
| 1487 |
+
if ( $dependency_handle === $dependent_handle ) {
|
| 1488 |
+
return true;
|
| 1489 |
+
}
|
| 1490 |
+
|
| 1491 |
+
// Short-circuit if there is no dependency relationship up front.
|
| 1492 |
+
if ( ! self::has_dependency( $dependencies, $dependent_handle, $dependency_handle ) ) {
|
| 1493 |
+
return false;
|
| 1494 |
+
}
|
| 1495 |
+
|
| 1496 |
+
// Check whether any enqueued handle depends on the dependency.
|
| 1497 |
+
foreach ( $dependencies->queue as $queued_handle ) {
|
| 1498 |
+
// Skip considering the dependent handle.
|
| 1499 |
+
if ( $dependent_handle === $queued_handle ) {
|
| 1500 |
+
continue;
|
| 1501 |
+
}
|
| 1502 |
+
|
| 1503 |
+
// If the dependency handle was directly enqueued, then it is not exclusively dependent.
|
| 1504 |
+
if ( $dependency_handle === $queued_handle ) {
|
| 1505 |
+
return false;
|
| 1506 |
+
}
|
| 1507 |
+
|
| 1508 |
+
// Otherwise, if the dependency handle is depended on by the queued handle while at the same time the queued
|
| 1509 |
+
// handle _does_ have a dependency on the supplied dependent handle, then the dependency handle is not
|
| 1510 |
+
// exclusively dependent on the dependent handle.
|
| 1511 |
+
if (
|
| 1512 |
+
self::has_dependency( $dependencies, $queued_handle, $dependency_handle )
|
| 1513 |
+
&&
|
| 1514 |
+
! self::has_dependency( $dependencies, $queued_handle, $dependent_handle )
|
| 1515 |
+
) {
|
| 1516 |
+
return false;
|
| 1517 |
+
}
|
| 1518 |
+
}
|
| 1519 |
+
return true;
|
| 1520 |
+
}
|
| 1521 |
+
|
| 1522 |
/**
|
| 1523 |
* Add data-ampdevmode attribute to any enqueued style that depends on the admin-bar.
|
| 1524 |
*
|
| 1529 |
* @return string Tag.
|
| 1530 |
*/
|
| 1531 |
public static function filter_admin_bar_style_loader_tag( $tag, $handle ) {
|
| 1532 |
+
if (
|
| 1533 |
+
in_array( $handle, wp_styles()->registered['admin-bar']->deps, true ) ?
|
| 1534 |
+
self::is_exclusively_dependent( wp_styles(), $handle, 'admin-bar' ) :
|
| 1535 |
+
self::has_dependency( wp_styles(), $handle, 'admin-bar' )
|
| 1536 |
+
) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1537 |
$tag = preg_replace( '/(?<=<link)(?=\s|>)/i', ' ' . AMP_Rule_Spec::DEV_MODE_ATTRIBUTE, $tag );
|
| 1538 |
}
|
| 1539 |
return $tag;
|
| 1549 |
* @return string Tag.
|
| 1550 |
*/
|
| 1551 |
public static function filter_admin_bar_script_loader_tag( $tag, $handle ) {
|
| 1552 |
+
if (
|
| 1553 |
+
in_array( $handle, wp_scripts()->registered['admin-bar']->deps, true ) ?
|
| 1554 |
+
self::is_exclusively_dependent( wp_scripts(), $handle, 'admin-bar' ) :
|
| 1555 |
+
self::has_dependency( wp_scripts(), $handle, 'admin-bar' )
|
| 1556 |
+
) {
|
| 1557 |
$tag = preg_replace( '/(?<=<script)(?=\s|>)/i', ' ' . AMP_Rule_Spec::DEV_MODE_ATTRIBUTE, $tag );
|
| 1558 |
}
|
| 1559 |
return $tag;
|
includes/options/class-amp-options-manager.php
CHANGED
|
@@ -718,23 +718,9 @@ class AMP_Options_Manager {
|
|
| 718 |
$validation = AMP_Validation_Manager::validate_url( $url );
|
| 719 |
|
| 720 |
if ( is_wp_error( $validation ) ) {
|
| 721 |
-
$review_messages[] =
|
| 722 |
-
|
| 723 |
-
|
| 724 |
-
__( 'However, there was an error when checking the AMP validity for your site.', 'amp' ),
|
| 725 |
-
$validation->get_error_message(),
|
| 726 |
-
$validation->get_error_code()
|
| 727 |
-
)
|
| 728 |
-
);
|
| 729 |
-
|
| 730 |
-
$error_message = $validation->get_error_message();
|
| 731 |
-
if ( $error_message ) {
|
| 732 |
-
$review_messages[] = $error_message;
|
| 733 |
-
} else {
|
| 734 |
-
/* translators: %s is the error code */
|
| 735 |
-
$review_messages[] = esc_html( sprintf( __( 'Error code: %s.', 'amp' ), $validation->get_error_code() ) );
|
| 736 |
-
}
|
| 737 |
-
$notice_type = 'error';
|
| 738 |
} elseif ( is_array( $validation ) ) {
|
| 739 |
$new_errors = 0;
|
| 740 |
$rejected_errors = 0;
|
|
@@ -757,7 +743,7 @@ class AMP_Options_Manager {
|
|
| 757 |
if ( $rejected_errors > 0 ) {
|
| 758 |
$notice_type = 'error';
|
| 759 |
|
| 760 |
-
$message =
|
| 761 |
sprintf(
|
| 762 |
/* translators: %s is count of rejected errors */
|
| 763 |
_n(
|
|
@@ -772,43 +758,37 @@ class AMP_Options_Manager {
|
|
| 772 |
);
|
| 773 |
|
| 774 |
if ( $invalid_url_screen_url ) {
|
| 775 |
-
$message .= ' ' .
|
| 776 |
-
|
| 777 |
-
|
| 778 |
-
|
| 779 |
-
|
| 780 |
-
|
| 781 |
-
|
| 782 |
-
|
| 783 |
-
|
| 784 |
-
esc_url( $invalid_url_screen_url )
|
| 785 |
-
)
|
| 786 |
);
|
| 787 |
}
|
| 788 |
|
| 789 |
$review_messages[] = $message;
|
| 790 |
} else {
|
| 791 |
-
$message =
|
| 792 |
-
|
| 793 |
-
|
| 794 |
-
|
| 795 |
-
esc_url( $url )
|
| 796 |
-
)
|
| 797 |
);
|
| 798 |
|
| 799 |
if ( $new_errors > 0 && $invalid_url_screen_url ) {
|
| 800 |
-
$message .= ' ' .
|
| 801 |
-
|
| 802 |
-
|
| 803 |
-
|
| 804 |
-
|
| 805 |
-
|
| 806 |
-
|
| 807 |
-
|
| 808 |
-
|
| 809 |
-
|
| 810 |
-
number_format_i18n( $new_errors )
|
| 811 |
-
)
|
| 812 |
);
|
| 813 |
}
|
| 814 |
|
|
@@ -831,18 +811,16 @@ class AMP_Options_Manager {
|
|
| 831 |
}
|
| 832 |
break;
|
| 833 |
case AMP_Theme_Support::READER_MODE_SLUG:
|
| 834 |
-
$message =
|
| 835 |
-
|
| 836 |
-
|
| 837 |
-
|
| 838 |
-
esc_url( $url )
|
| 839 |
-
)
|
| 840 |
);
|
| 841 |
break;
|
| 842 |
}
|
| 843 |
|
| 844 |
if ( isset( $message ) ) {
|
| 845 |
-
add_settings_error( self::OPTION_NAME, 'template_mode_updated', $message, $notice_type );
|
| 846 |
}
|
| 847 |
}
|
| 848 |
}
|
| 718 |
$validation = AMP_Validation_Manager::validate_url( $url );
|
| 719 |
|
| 720 |
if ( is_wp_error( $validation ) ) {
|
| 721 |
+
$review_messages[] = esc_html__( 'However, there was an error when checking the AMP validity for your site.', 'amp' );
|
| 722 |
+
$review_messages[] = AMP_Validation_Manager::get_validate_url_error_message( $validation->get_error_code(), $validation->get_error_message() );
|
| 723 |
+
$notice_type = 'error';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 724 |
} elseif ( is_array( $validation ) ) {
|
| 725 |
$new_errors = 0;
|
| 726 |
$rejected_errors = 0;
|
| 743 |
if ( $rejected_errors > 0 ) {
|
| 744 |
$notice_type = 'error';
|
| 745 |
|
| 746 |
+
$message = esc_html(
|
| 747 |
sprintf(
|
| 748 |
/* translators: %s is count of rejected errors */
|
| 749 |
_n(
|
| 758 |
);
|
| 759 |
|
| 760 |
if ( $invalid_url_screen_url ) {
|
| 761 |
+
$message .= ' ' . sprintf(
|
| 762 |
+
/* translators: %s is URL to review issues */
|
| 763 |
+
_n(
|
| 764 |
+
'<a href="%s">Review Issue</a>.',
|
| 765 |
+
'<a href="%s">Review Issues</a>.',
|
| 766 |
+
$rejected_errors,
|
| 767 |
+
'amp'
|
| 768 |
+
),
|
| 769 |
+
esc_url( $invalid_url_screen_url )
|
|
|
|
|
|
|
| 770 |
);
|
| 771 |
}
|
| 772 |
|
| 773 |
$review_messages[] = $message;
|
| 774 |
} else {
|
| 775 |
+
$message = sprintf(
|
| 776 |
+
/* translators: %s is an AMP URL */
|
| 777 |
+
__( 'View an <a href="%s">AMP version of your site</a>.', 'amp' ),
|
| 778 |
+
esc_url( $url )
|
|
|
|
|
|
|
| 779 |
);
|
| 780 |
|
| 781 |
if ( $new_errors > 0 && $invalid_url_screen_url ) {
|
| 782 |
+
$message .= ' ' . sprintf(
|
| 783 |
+
/* translators: 1: URL to review issues. 2: count of new errors. */
|
| 784 |
+
_n(
|
| 785 |
+
'Please also <a href="%1$s">review %2$s issue</a> which may need to be fixed (for one URL at least).',
|
| 786 |
+
'Please also <a href="%1$s">review %2$s issues</a> which may need to be fixed (for one URL at least).',
|
| 787 |
+
$new_errors,
|
| 788 |
+
'amp'
|
| 789 |
+
),
|
| 790 |
+
esc_url( $invalid_url_screen_url ),
|
| 791 |
+
number_format_i18n( $new_errors )
|
|
|
|
|
|
|
| 792 |
);
|
| 793 |
}
|
| 794 |
|
| 811 |
}
|
| 812 |
break;
|
| 813 |
case AMP_Theme_Support::READER_MODE_SLUG:
|
| 814 |
+
$message = sprintf(
|
| 815 |
+
/* translators: %s is an AMP URL */
|
| 816 |
+
__( 'Reader mode activated! View the <a href="%s">AMP version of a recent post</a>. It is recommended that you upgrade to Standard or Transitional mode.', 'amp' ),
|
| 817 |
+
esc_url( $url )
|
|
|
|
|
|
|
| 818 |
);
|
| 819 |
break;
|
| 820 |
}
|
| 821 |
|
| 822 |
if ( isset( $message ) ) {
|
| 823 |
+
add_settings_error( self::OPTION_NAME, 'template_mode_updated', wp_kses_post( $message ), $notice_type );
|
| 824 |
}
|
| 825 |
}
|
| 826 |
}
|
includes/sanitizers/class-amp-core-theme-sanitizer.php
CHANGED
|
@@ -45,161 +45,204 @@ class AMP_Core_Theme_Sanitizer extends AMP_Base_Sanitizer {
|
|
| 45 |
protected $xpath;
|
| 46 |
|
| 47 |
/**
|
| 48 |
-
*
|
| 49 |
*
|
| 50 |
-
* @since 1.0
|
| 51 |
* @var array
|
| 52 |
*/
|
| 53 |
-
protected static $
|
| 54 |
-
|
| 55 |
-
'
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
'twentytwenty_skip_link_focus_fix', // See <https://github.com/WordPress/twentynineteen/pull/47>.
|
| 65 |
-
],
|
| 66 |
-
],
|
| 67 |
-
'add_smooth_scrolling' => [
|
| 68 |
-
// @todo Only replaces twentytwenty.smoothscroll.scrollToAnchor, but not twentytwenty.smoothscroll.scrollToElement
|
| 69 |
-
'//a[ starts-with( @href, "#" ) and not( @href = "#" )and not( @href = "#0" ) and not( contains( @class, "do-not-scroll" ) ) and not( contains( @class, "skip-link" ) ) ]',
|
| 70 |
-
],
|
| 71 |
-
'add_twentytwenty_modals' => [],
|
| 72 |
-
'add_twentytwenty_toggles' => [],
|
| 73 |
-
'add_nav_menu_styles' => [],
|
| 74 |
-
'add_twentytwenty_masthead_styles' => [],
|
| 75 |
-
'add_twentytwenty_current_page_awareness' => [],
|
| 76 |
-
],
|
| 77 |
-
|
| 78 |
-
// Twenty Nineteen.
|
| 79 |
-
'twentynineteen' => [
|
| 80 |
-
'dequeue_scripts' => [
|
| 81 |
-
'twentynineteen-skip-link-focus-fix', // This is part of AMP. See <https://github.com/ampproject/amphtml/issues/18671>.
|
| 82 |
-
'twentynineteen-priority-menu',
|
| 83 |
-
'twentynineteen-touch-navigation', // @todo There could be an AMP implementation of this, similar to what is implemented on ampproject.org.
|
| 84 |
-
],
|
| 85 |
-
'remove_actions' => [
|
| 86 |
-
'wp_print_footer_scripts' => [
|
| 87 |
-
'twentynineteen_skip_link_focus_fix', // See <https://github.com/WordPress/twentynineteen/pull/47>.
|
| 88 |
-
],
|
| 89 |
-
],
|
| 90 |
-
'add_twentynineteen_masthead_styles' => [],
|
| 91 |
-
'adjust_twentynineteen_images' => [],
|
| 92 |
-
],
|
| 93 |
-
|
| 94 |
-
// Twenty Seventeen.
|
| 95 |
-
'twentyseventeen' => [
|
| 96 |
-
// @todo Try to implement belowEntryMetaClass().
|
| 97 |
-
'dequeue_scripts' => [
|
| 98 |
-
'twentyseventeen-html5', // Only relevant for IE<9.
|
| 99 |
-
'twentyseventeen-global', // There are somethings not yet implemented in AMP. See todos below.
|
| 100 |
-
'jquery-scrollto', // Implemented via add_smooth_scrolling().
|
| 101 |
-
'twentyseventeen-navigation', // Handled by add_nav_menu_styles, add_nav_menu_toggle, add_nav_sub_menu_buttons.
|
| 102 |
-
'twentyseventeen-skip-link-focus-fix', // Unnecessary since part of the AMP runtime.
|
| 103 |
-
],
|
| 104 |
-
'remove_actions' => [
|
| 105 |
-
'wp_head' => [
|
| 106 |
-
'twentyseventeen_javascript_detection', // AMP is essentially no-js, with any interactivity added explicitly via amp-bind.
|
| 107 |
-
],
|
| 108 |
-
],
|
| 109 |
-
'force_fixed_background_support' => [],
|
| 110 |
-
'add_twentyseventeen_masthead_styles' => [],
|
| 111 |
-
'add_twentyseventeen_image_styles' => [],
|
| 112 |
-
'add_twentyseventeen_sticky_nav_menu' => [],
|
| 113 |
-
'add_has_header_video_body_class' => [],
|
| 114 |
-
'add_nav_menu_styles' => [
|
| 115 |
-
'sub_menu_button_toggle_class' => 'toggled-on',
|
| 116 |
-
'no_js_submenu_visible' => true,
|
| 117 |
-
],
|
| 118 |
-
'add_smooth_scrolling' => [
|
| 119 |
-
'//header[@id = "masthead"]//a[ contains( @class, "menu-scroll-down" ) ]',
|
| 120 |
-
],
|
| 121 |
-
'set_twentyseventeen_quotes_icon' => [],
|
| 122 |
-
'add_twentyseventeen_attachment_image_attributes' => [],
|
| 123 |
-
],
|
| 124 |
-
|
| 125 |
-
// Twenty Sixteen.
|
| 126 |
-
'twentysixteen' => [
|
| 127 |
-
// @todo Figure out an AMP solution for onResizeARIA().
|
| 128 |
-
// @todo Try to implement belowEntryMetaClass().
|
| 129 |
-
'dequeue_scripts' => [
|
| 130 |
-
'twentysixteen-script',
|
| 131 |
-
'twentysixteen-html5', // Only relevant for IE<9.
|
| 132 |
-
'twentysixteen-keyboard-image-navigation', // AMP does not yet allow for listening to keydown events.
|
| 133 |
-
'twentysixteen-skip-link-focus-fix', // Unnecessary since part of the AMP runtime.
|
| 134 |
-
],
|
| 135 |
-
'remove_actions' => [
|
| 136 |
-
'wp_head' => [
|
| 137 |
-
'twentysixteen_javascript_detection', // AMP is essentially no-js, with any interactivity added explicitly via amp-bind.
|
| 138 |
-
],
|
| 139 |
-
],
|
| 140 |
-
'add_nav_menu_styles' => [
|
| 141 |
-
'sub_menu_button_toggle_class' => 'toggled-on',
|
| 142 |
-
'no_js_submenu_visible' => true,
|
| 143 |
-
],
|
| 144 |
-
],
|
| 145 |
-
|
| 146 |
-
// Twenty Fifteen.
|
| 147 |
-
'twentyfifteen' => [
|
| 148 |
-
// @todo Figure out an AMP solution for onResizeARIA().
|
| 149 |
-
'dequeue_scripts' => [
|
| 150 |
-
'twentyfifteen-script',
|
| 151 |
-
'twentyfifteen-keyboard-image-navigation', // AMP does not yet allow for listening to keydown events.
|
| 152 |
-
'twentyfifteen-skip-link-focus-fix', // Unnecessary since part of the AMP runtime.
|
| 153 |
-
],
|
| 154 |
-
'remove_actions' => [
|
| 155 |
-
'wp_head' => [
|
| 156 |
-
'twentyfifteen_javascript_detection', // AMP is essentially no-js, with any interactivity added explicitly via amp-bind.
|
| 157 |
-
],
|
| 158 |
-
],
|
| 159 |
-
'add_nav_menu_styles' => [
|
| 160 |
-
'sub_menu_button_toggle_class' => 'toggle-on',
|
| 161 |
-
'no_js_submenu_visible' => true,
|
| 162 |
-
],
|
| 163 |
-
],
|
| 164 |
-
|
| 165 |
-
// Twenty Fourteen.
|
| 166 |
-
'twentyfourteen' => [
|
| 167 |
-
// @todo Figure out an AMP solution for onResizeARIA().
|
| 168 |
-
'dequeue_scripts' => [
|
| 169 |
-
'twentyfourteen-script',
|
| 170 |
-
'twentyfourteen-keyboard-image-navigation', // AMP does not yet allow for listening to keydown events.
|
| 171 |
-
'jquery-masonry', // Masonry style layout is not supported in AMP.
|
| 172 |
-
'twentyfourteen-slider',
|
| 173 |
-
],
|
| 174 |
-
'add_nav_menu_styles' => [],
|
| 175 |
-
'add_twentyfourteen_masthead_styles' => [],
|
| 176 |
-
'add_twentyfourteen_slider_carousel' => [],
|
| 177 |
-
'add_twentyfourteen_search' => [],
|
| 178 |
-
],
|
| 179 |
-
|
| 180 |
-
// Twenty Thirteen.
|
| 181 |
-
'twentythirteen' => [
|
| 182 |
-
'dequeue_scripts' => [
|
| 183 |
-
'jquery-masonry', // Masonry style layout is not supported in AMP.
|
| 184 |
-
'twentythirteen-script',
|
| 185 |
-
],
|
| 186 |
-
'add_nav_menu_toggle' => [],
|
| 187 |
-
'add_nav_sub_menu_buttons' => [],
|
| 188 |
-
'add_nav_menu_styles' => [],
|
| 189 |
-
],
|
| 190 |
-
|
| 191 |
-
// Twenty Twelve.
|
| 192 |
-
'twentytwelve' => [
|
| 193 |
-
'dequeue_scripts' => [
|
| 194 |
-
'twentytwelve-navigation',
|
| 195 |
-
],
|
| 196 |
-
'add_nav_menu_styles' => [],
|
| 197 |
-
],
|
| 198 |
-
|
| 199 |
-
'twentyeleven' => [],
|
| 200 |
-
'twentyten' => [],
|
| 201 |
];
|
| 202 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 203 |
/**
|
| 204 |
* Get list of supported core themes.
|
| 205 |
*
|
|
@@ -208,7 +251,7 @@ class AMP_Core_Theme_Sanitizer extends AMP_Base_Sanitizer {
|
|
| 208 |
* @return string[] Slugs for supported themes.
|
| 209 |
*/
|
| 210 |
public static function get_supported_themes() {
|
| 211 |
-
return
|
| 212 |
}
|
| 213 |
|
| 214 |
/**
|
|
@@ -220,7 +263,7 @@ class AMP_Core_Theme_Sanitizer extends AMP_Base_Sanitizer {
|
|
| 220 |
* @return array Acceptable errors.
|
| 221 |
*/
|
| 222 |
public static function get_acceptable_errors( $template ) {
|
| 223 |
-
if (
|
| 224 |
return [
|
| 225 |
'illegal_css_at_rule' => [
|
| 226 |
[
|
|
@@ -399,8 +442,8 @@ class AMP_Core_Theme_Sanitizer extends AMP_Base_Sanitizer {
|
|
| 399 |
$theme_features = [];
|
| 400 |
$theme_candidates = wp_array_slice_assoc( $args, [ 'stylesheet', 'template' ] );
|
| 401 |
foreach ( $theme_candidates as $theme_candidate ) {
|
| 402 |
-
if (
|
| 403 |
-
$theme_features = self
|
| 404 |
break;
|
| 405 |
}
|
| 406 |
}
|
|
@@ -1030,6 +1073,12 @@ class AMP_Core_Theme_Sanitizer extends AMP_Base_Sanitizer {
|
|
| 1030 |
}
|
| 1031 |
}
|
| 1032 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1033 |
}
|
| 1034 |
<?php elseif ( 'twentyseventeen' === get_template() ) : ?>
|
| 1035 |
/* Show the button*/
|
| 45 |
protected $xpath;
|
| 46 |
|
| 47 |
/**
|
| 48 |
+
* Array of themes that are supported.
|
| 49 |
*
|
|
|
|
| 50 |
* @var array
|
| 51 |
*/
|
| 52 |
+
protected static $supported_themes = [
|
| 53 |
+
'twentytwenty',
|
| 54 |
+
'twentynineteen',
|
| 55 |
+
'twentyseventeen',
|
| 56 |
+
'twentysixteen',
|
| 57 |
+
'twentyfifteen',
|
| 58 |
+
'twentyfourteen',
|
| 59 |
+
'twentythirteen',
|
| 60 |
+
'twentytwelve',
|
| 61 |
+
'twentyeleven',
|
| 62 |
+
'twentyten',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
];
|
| 64 |
|
| 65 |
+
/**
|
| 66 |
+
* Retrieve the config for features needed by a theme.
|
| 67 |
+
*
|
| 68 |
+
* @since 1.0
|
| 69 |
+
* @since 1.5.0 Converted `theme_features` variable into `get_theme_config` function.
|
| 70 |
+
*
|
| 71 |
+
* @param string $theme_slug Theme slug.
|
| 72 |
+
* @return array|null Array comprising of the theme config if its slug is found, null if it is not.
|
| 73 |
+
*/
|
| 74 |
+
protected static function get_theme_features_config( $theme_slug ) {
|
| 75 |
+
switch ( $theme_slug ) {
|
| 76 |
+
// Twenty Twenty.
|
| 77 |
+
case 'twentytwenty':
|
| 78 |
+
$config = [
|
| 79 |
+
'dequeue_scripts' => [
|
| 80 |
+
'twentytwenty-js',
|
| 81 |
+
],
|
| 82 |
+
'remove_actions' => [
|
| 83 |
+
'wp_head' => [
|
| 84 |
+
'twentytwenty_no_js_class', // AMP is essentially no-js, with any interactivity added explicitly via amp-bind.
|
| 85 |
+
],
|
| 86 |
+
'wp_print_footer_scripts' => [
|
| 87 |
+
'twentytwenty_skip_link_focus_fix', // See <https://github.com/WordPress/twentynineteen/pull/47>.
|
| 88 |
+
],
|
| 89 |
+
],
|
| 90 |
+
'add_twentytwenty_modals' => [],
|
| 91 |
+
'add_twentytwenty_toggles' => [],
|
| 92 |
+
'add_nav_menu_styles' => [],
|
| 93 |
+
'add_twentytwenty_masthead_styles' => [],
|
| 94 |
+
'add_twentytwenty_current_page_awareness' => [],
|
| 95 |
+
];
|
| 96 |
+
|
| 97 |
+
$theme = wp_get_theme( 'twentytwenty' );
|
| 98 |
+
|
| 99 |
+
if ( $theme->exists() && version_compare( $theme->get( 'Version' ), '1.0.0', '<=' ) ) {
|
| 100 |
+
$config['add_smooth_scrolling'] = [
|
| 101 |
+
'//a[ starts-with( @href, "#" ) and not( @href = "#" )and not( @href = "#0" ) and not( contains( @class, "do-not-scroll" ) ) and not( contains( @class, "skip-link" ) ) ]',
|
| 102 |
+
];
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
return $config;
|
| 106 |
+
|
| 107 |
+
// Twenty Nineteen.
|
| 108 |
+
case 'twentynineteen':
|
| 109 |
+
return [
|
| 110 |
+
'dequeue_scripts' => [
|
| 111 |
+
'twentynineteen-skip-link-focus-fix', // This is part of AMP. See <https://github.com/ampproject/amphtml/issues/18671>.
|
| 112 |
+
'twentynineteen-priority-menu',
|
| 113 |
+
'twentynineteen-touch-navigation', // @todo There could be an AMP implementation of this, similar to what is implemented on ampproject.org.
|
| 114 |
+
],
|
| 115 |
+
'remove_actions' => [
|
| 116 |
+
'wp_print_footer_scripts' => [
|
| 117 |
+
'twentynineteen_skip_link_focus_fix', // See <https://github.com/WordPress/twentynineteen/pull/47>.
|
| 118 |
+
],
|
| 119 |
+
],
|
| 120 |
+
'add_twentynineteen_masthead_styles' => [],
|
| 121 |
+
'adjust_twentynineteen_images' => [],
|
| 122 |
+
];
|
| 123 |
+
|
| 124 |
+
// Twenty Seventeen.
|
| 125 |
+
case 'twentyseventeen':
|
| 126 |
+
return [
|
| 127 |
+
// @todo Try to implement belowEntryMetaClass().
|
| 128 |
+
'dequeue_scripts' => [
|
| 129 |
+
'twentyseventeen-html5', // Only relevant for IE<9.
|
| 130 |
+
'twentyseventeen-global', // There are somethings not yet implemented in AMP. See todos below.
|
| 131 |
+
'jquery-scrollto', // Implemented via add_smooth_scrolling().
|
| 132 |
+
'twentyseventeen-navigation', // Handled by add_nav_menu_styles, add_nav_menu_toggle, add_nav_sub_menu_buttons.
|
| 133 |
+
'twentyseventeen-skip-link-focus-fix', // Unnecessary since part of the AMP runtime.
|
| 134 |
+
],
|
| 135 |
+
'remove_actions' => [
|
| 136 |
+
'wp_head' => [
|
| 137 |
+
'twentyseventeen_javascript_detection', // AMP is essentially no-js, with any interactivity added explicitly via amp-bind.
|
| 138 |
+
],
|
| 139 |
+
],
|
| 140 |
+
'force_fixed_background_support' => [],
|
| 141 |
+
'add_twentyseventeen_masthead_styles' => [],
|
| 142 |
+
'add_twentyseventeen_image_styles' => [],
|
| 143 |
+
'add_twentyseventeen_sticky_nav_menu' => [],
|
| 144 |
+
'add_has_header_video_body_class' => [],
|
| 145 |
+
'add_nav_menu_styles' => [
|
| 146 |
+
'sub_menu_button_toggle_class' => 'toggled-on',
|
| 147 |
+
'no_js_submenu_visible' => true,
|
| 148 |
+
],
|
| 149 |
+
'add_smooth_scrolling' => [
|
| 150 |
+
'//header[@id = "masthead"]//a[ contains( @class, "menu-scroll-down" ) ]',
|
| 151 |
+
],
|
| 152 |
+
'set_twentyseventeen_quotes_icon' => [],
|
| 153 |
+
'add_twentyseventeen_attachment_image_attributes' => [],
|
| 154 |
+
];
|
| 155 |
+
|
| 156 |
+
// Twenty Sixteen.
|
| 157 |
+
case 'twentysixteen':
|
| 158 |
+
return [
|
| 159 |
+
// @todo Figure out an AMP solution for onResizeARIA().
|
| 160 |
+
// @todo Try to implement belowEntryMetaClass().
|
| 161 |
+
'dequeue_scripts' => [
|
| 162 |
+
'twentysixteen-script',
|
| 163 |
+
'twentysixteen-html5', // Only relevant for IE<9.
|
| 164 |
+
'twentysixteen-keyboard-image-navigation', // AMP does not yet allow for listening to keydown events.
|
| 165 |
+
'twentysixteen-skip-link-focus-fix', // Unnecessary since part of the AMP runtime.
|
| 166 |
+
],
|
| 167 |
+
'remove_actions' => [
|
| 168 |
+
'wp_head' => [
|
| 169 |
+
'twentysixteen_javascript_detection', // AMP is essentially no-js, with any interactivity added explicitly via amp-bind.
|
| 170 |
+
],
|
| 171 |
+
],
|
| 172 |
+
'add_nav_menu_styles' => [
|
| 173 |
+
'sub_menu_button_toggle_class' => 'toggled-on',
|
| 174 |
+
'no_js_submenu_visible' => true,
|
| 175 |
+
],
|
| 176 |
+
];
|
| 177 |
+
|
| 178 |
+
// Twenty Fifteen.
|
| 179 |
+
case 'twentyfifteen':
|
| 180 |
+
return [
|
| 181 |
+
// @todo Figure out an AMP solution for onResizeARIA().
|
| 182 |
+
'dequeue_scripts' => [
|
| 183 |
+
'twentyfifteen-script',
|
| 184 |
+
'twentyfifteen-keyboard-image-navigation', // AMP does not yet allow for listening to keydown events.
|
| 185 |
+
'twentyfifteen-skip-link-focus-fix', // Unnecessary since part of the AMP runtime.
|
| 186 |
+
],
|
| 187 |
+
'remove_actions' => [
|
| 188 |
+
'wp_head' => [
|
| 189 |
+
'twentyfifteen_javascript_detection', // AMP is essentially no-js, with any interactivity added explicitly via amp-bind.
|
| 190 |
+
],
|
| 191 |
+
],
|
| 192 |
+
'add_nav_menu_styles' => [
|
| 193 |
+
'sub_menu_button_toggle_class' => 'toggle-on',
|
| 194 |
+
'no_js_submenu_visible' => true,
|
| 195 |
+
],
|
| 196 |
+
];
|
| 197 |
+
|
| 198 |
+
// Twenty Fourteen.
|
| 199 |
+
case 'twentyfourteen':
|
| 200 |
+
return [
|
| 201 |
+
// @todo Figure out an AMP solution for onResizeARIA().
|
| 202 |
+
'dequeue_scripts' => [
|
| 203 |
+
'twentyfourteen-script',
|
| 204 |
+
'twentyfourteen-keyboard-image-navigation', // AMP does not yet allow for listening to keydown events.
|
| 205 |
+
'jquery-masonry', // Masonry style layout is not supported in AMP.
|
| 206 |
+
'twentyfourteen-slider',
|
| 207 |
+
],
|
| 208 |
+
'add_nav_menu_styles' => [],
|
| 209 |
+
'add_twentyfourteen_masthead_styles' => [],
|
| 210 |
+
'add_twentyfourteen_slider_carousel' => [],
|
| 211 |
+
'add_twentyfourteen_search' => [],
|
| 212 |
+
];
|
| 213 |
+
|
| 214 |
+
// Twenty Thirteen.
|
| 215 |
+
case 'twentythirteen':
|
| 216 |
+
return [
|
| 217 |
+
'dequeue_scripts' => [
|
| 218 |
+
'jquery-masonry', // Masonry style layout is not supported in AMP.
|
| 219 |
+
'twentythirteen-script',
|
| 220 |
+
],
|
| 221 |
+
'add_nav_menu_toggle' => [],
|
| 222 |
+
'add_nav_sub_menu_buttons' => [],
|
| 223 |
+
'add_nav_menu_styles' => [],
|
| 224 |
+
];
|
| 225 |
+
|
| 226 |
+
// Twenty Twelve.
|
| 227 |
+
case 'twentytwelve':
|
| 228 |
+
return [
|
| 229 |
+
'dequeue_scripts' => [
|
| 230 |
+
'twentytwelve-navigation',
|
| 231 |
+
],
|
| 232 |
+
'add_nav_menu_styles' => [],
|
| 233 |
+
];
|
| 234 |
+
|
| 235 |
+
// Twenty Eleven.
|
| 236 |
+
case 'twentyeleven':
|
| 237 |
+
// Twenty Ten.
|
| 238 |
+
case 'twentyten':
|
| 239 |
+
return [];
|
| 240 |
+
|
| 241 |
+
default:
|
| 242 |
+
return null;
|
| 243 |
+
}
|
| 244 |
+
}
|
| 245 |
+
|
| 246 |
/**
|
| 247 |
* Get list of supported core themes.
|
| 248 |
*
|
| 251 |
* @return string[] Slugs for supported themes.
|
| 252 |
*/
|
| 253 |
public static function get_supported_themes() {
|
| 254 |
+
return self::$supported_themes;
|
| 255 |
}
|
| 256 |
|
| 257 |
/**
|
| 263 |
* @return array Acceptable errors.
|
| 264 |
*/
|
| 265 |
public static function get_acceptable_errors( $template ) {
|
| 266 |
+
if ( in_array( $template, self::$supported_themes, true ) ) {
|
| 267 |
return [
|
| 268 |
'illegal_css_at_rule' => [
|
| 269 |
[
|
| 442 |
$theme_features = [];
|
| 443 |
$theme_candidates = wp_array_slice_assoc( $args, [ 'stylesheet', 'template' ] );
|
| 444 |
foreach ( $theme_candidates as $theme_candidate ) {
|
| 445 |
+
if ( in_array( $theme_candidate, self::$supported_themes, true ) ) {
|
| 446 |
+
$theme_features = self::get_theme_features_config( $theme_candidate );
|
| 447 |
break;
|
| 448 |
}
|
| 449 |
}
|
| 1073 |
}
|
| 1074 |
}
|
| 1075 |
|
| 1076 |
+
@media (max-width: 999px) {
|
| 1077 |
+
amp-lightbox.cover-modal.show-modal {
|
| 1078 |
+
display: unset;
|
| 1079 |
+
}
|
| 1080 |
+
}
|
| 1081 |
+
|
| 1082 |
}
|
| 1083 |
<?php elseif ( 'twentyseventeen' === get_template() ) : ?>
|
| 1084 |
/* Show the button*/
|
includes/sanitizers/class-amp-style-sanitizer.php
CHANGED
|
@@ -1393,7 +1393,7 @@ class AMP_Style_Sanitizer extends AMP_Base_Sanitizer {
|
|
| 1393 |
private function process_stylesheet( $stylesheet, $options = [] ) {
|
| 1394 |
$parsed = null;
|
| 1395 |
$cache_key = null;
|
| 1396 |
-
$cache_group = 'amp-parsed-stylesheet-
|
| 1397 |
|
| 1398 |
$cache_impacting_options = array_merge(
|
| 1399 |
wp_array_slice_assoc(
|
|
@@ -2268,9 +2268,21 @@ class AMP_Style_Sanitizer extends AMP_Base_Sanitizer {
|
|
| 2268 |
if ( ! is_wp_error( $path ) ) {
|
| 2269 |
$data_url->getURL()->setString( $guessed_url );
|
| 2270 |
$converted_count++;
|
| 2271 |
-
|
| 2272 |
}
|
| 2273 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2274 |
} // End foreach $source_data_url_objects.
|
| 2275 |
} // End foreach $src_properties.
|
| 2276 |
|
| 1393 |
private function process_stylesheet( $stylesheet, $options = [] ) {
|
| 1394 |
$parsed = null;
|
| 1395 |
$cache_key = null;
|
| 1396 |
+
$cache_group = 'amp-parsed-stylesheet-v22'; // This should be bumped whenever the PHP-CSS-Parser is updated or parsed format is updated.
|
| 1397 |
|
| 1398 |
$cache_impacting_options = array_merge(
|
| 1399 |
wp_array_slice_assoc(
|
| 2268 |
if ( ! is_wp_error( $path ) ) {
|
| 2269 |
$data_url->getURL()->setString( $guessed_url );
|
| 2270 |
$converted_count++;
|
| 2271 |
+
continue 2;
|
| 2272 |
}
|
| 2273 |
}
|
| 2274 |
+
|
| 2275 |
+
// As fallback, look for fonts bundled with the AMP plugin.
|
| 2276 |
+
$font_filename = sprintf( '%s.%s', strtolower( $font_basename ), $extension );
|
| 2277 |
+
$bundled_fonts = [
|
| 2278 |
+
'nonbreakingspaceoverride.woff',
|
| 2279 |
+
'nonbreakingspaceoverride.woff2',
|
| 2280 |
+
'genericons.woff',
|
| 2281 |
+
];
|
| 2282 |
+
if ( in_array( $font_filename, $bundled_fonts, true ) ) {
|
| 2283 |
+
$data_url->getURL()->setString( plugin_dir_url( AMP__FILE__ ) . "assets/fonts/$font_filename" );
|
| 2284 |
+
$converted_count++;
|
| 2285 |
+
}
|
| 2286 |
} // End foreach $source_data_url_objects.
|
| 2287 |
} // End foreach $src_properties.
|
| 2288 |
|
includes/sanitizers/class-amp-tag-and-attribute-sanitizer.php
CHANGED
|
@@ -1695,18 +1695,16 @@ class AMP_Tag_And_Attribute_Sanitizer extends AMP_Base_Sanitizer {
|
|
| 1695 |
* https://github.com/ampproject/amphtml/blob/1526498116488/extensions/amp-selector/validator-amp-selector.protoascii#L81-L91
|
| 1696 |
*/
|
| 1697 |
$descendant_reference_points = [
|
| 1698 |
-
'amp-selector' =>
|
| 1699 |
-
'amp-story-grid-layer' =>
|
| 1700 |
];
|
| 1701 |
-
foreach ( $descendant_reference_points as $ancestor_name => $
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1702 |
if ( isset( $reference_point_spec[ AMP_Rule_Spec::ATTR_SPEC_LIST ][ $attr_name ] ) ) {
|
| 1703 |
-
|
| 1704 |
-
while ( $parent ) {
|
| 1705 |
-
if ( $ancestor_name === $parent->nodeName ) {
|
| 1706 |
-
return true;
|
| 1707 |
-
}
|
| 1708 |
-
$parent = $parent->parentNode;
|
| 1709 |
-
}
|
| 1710 |
}
|
| 1711 |
}
|
| 1712 |
|
| 1695 |
* https://github.com/ampproject/amphtml/blob/1526498116488/extensions/amp-selector/validator-amp-selector.protoascii#L81-L91
|
| 1696 |
*/
|
| 1697 |
$descendant_reference_points = [
|
| 1698 |
+
'amp-selector' => 'AMP-SELECTOR option',
|
| 1699 |
+
'amp-story-grid-layer' => 'AMP-STORY-GRID-LAYER default', // @todo Consider the more restrictive 'AMP-STORY-GRID-LAYER animate-in'.
|
| 1700 |
];
|
| 1701 |
+
foreach ( $descendant_reference_points as $ancestor_name => $reference_point_spec_name ) {
|
| 1702 |
+
if ( empty( $this->open_elements[ $ancestor_name ] ) ) {
|
| 1703 |
+
continue;
|
| 1704 |
+
}
|
| 1705 |
+
$reference_point_spec = AMP_Allowed_Tags_Generated::get_reference_point_spec( $reference_point_spec_name );
|
| 1706 |
if ( isset( $reference_point_spec[ AMP_Rule_Spec::ATTR_SPEC_LIST ][ $attr_name ] ) ) {
|
| 1707 |
+
return true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1708 |
}
|
| 1709 |
}
|
| 1710 |
|
includes/validation/class-amp-validated-url-post-type.php
CHANGED
|
@@ -631,17 +631,13 @@ class AMP_Validated_URL_Post_Type {
|
|
| 631 |
/**
|
| 632 |
* Normalize a URL for storage.
|
| 633 |
*
|
| 634 |
-
* This ensures that query vars like utm_* and the like will not cause duplicates.
|
| 635 |
* The AMP query param is removed to facilitate switching between standard and transitional.
|
| 636 |
* The URL scheme is also normalized to HTTPS to help with transition from HTTP to HTTPS.
|
| 637 |
*
|
| 638 |
* @param string $url URL.
|
| 639 |
* @return string Normalized URL.
|
| 640 |
-
* @global WP $wp
|
| 641 |
*/
|
| 642 |
protected static function normalize_url_for_storage( $url ) {
|
| 643 |
-
global $wp;
|
| 644 |
-
|
| 645 |
// Only ever store the canonical version.
|
| 646 |
$url = amp_remove_endpoint( $url );
|
| 647 |
|
|
@@ -651,12 +647,11 @@ class AMP_Validated_URL_Post_Type {
|
|
| 651 |
// Normalize query args, removing all that are not recognized or which are removable.
|
| 652 |
$url_parts = explode( '?', $url, 2 );
|
| 653 |
if ( 2 === count( $url_parts ) ) {
|
| 654 |
-
|
| 655 |
foreach ( wp_removable_query_args() as $removable_query_arg ) {
|
| 656 |
unset( $args[ $removable_query_arg ] );
|
| 657 |
}
|
| 658 |
-
$
|
| 659 |
-
$url = $url_parts[0];
|
| 660 |
if ( ! empty( $args ) ) {
|
| 661 |
$url = $url_parts[0] . '?' . build_query( $args );
|
| 662 |
}
|
|
@@ -1231,7 +1226,7 @@ class AMP_Validated_URL_Post_Type {
|
|
| 1231 |
|
| 1232 |
$validity = AMP_Validation_Manager::validate_url( $url );
|
| 1233 |
if ( is_wp_error( $validity ) ) {
|
| 1234 |
-
$errors[] = $validity->get_error_code();
|
| 1235 |
continue;
|
| 1236 |
}
|
| 1237 |
|
|
@@ -1259,13 +1254,13 @@ class AMP_Validated_URL_Post_Type {
|
|
| 1259 |
self::URLS_TESTED => count( $items ),
|
| 1260 |
];
|
| 1261 |
if ( ! empty( $errors ) ) {
|
| 1262 |
-
$args['amp_validate_error'] = $errors;
|
| 1263 |
} else {
|
| 1264 |
$args[ self::REMAINING_ERRORS ] = count( $remaining_invalid_urls );
|
| 1265 |
}
|
| 1266 |
|
| 1267 |
$redirect = remove_query_arg( wp_removable_query_args(), $redirect );
|
| 1268 |
-
return add_query_arg( $args, $redirect );
|
| 1269 |
}
|
| 1270 |
|
| 1271 |
/**
|
|
@@ -1278,14 +1273,23 @@ class AMP_Validated_URL_Post_Type {
|
|
| 1278 |
return;
|
| 1279 |
}
|
| 1280 |
|
| 1281 |
-
if ( isset( $_GET['amp_validate_error'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
|
| 1282 |
-
|
| 1283 |
-
|
| 1284 |
-
|
| 1285 |
-
|
| 1286 |
-
|
| 1287 |
-
|
| 1288 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1289 |
}
|
| 1290 |
}
|
| 1291 |
|
|
@@ -1487,7 +1491,7 @@ class AMP_Validated_URL_Post_Type {
|
|
| 1487 |
|
| 1488 |
$validity = AMP_Validation_Manager::validate_url( $url );
|
| 1489 |
if ( is_wp_error( $validity ) ) {
|
| 1490 |
-
throw new Exception(
|
| 1491 |
}
|
| 1492 |
|
| 1493 |
$errors = wp_list_pluck( $validity['results'], 'error' );
|
|
@@ -1502,7 +1506,7 @@ class AMP_Validated_URL_Post_Type {
|
|
| 1502 |
)
|
| 1503 |
);
|
| 1504 |
if ( is_wp_error( $stored ) ) {
|
| 1505 |
-
throw new Exception(
|
| 1506 |
}
|
| 1507 |
$redirect = get_edit_post_link( $stored, 'raw' );
|
| 1508 |
|
|
@@ -1518,7 +1522,9 @@ class AMP_Validated_URL_Post_Type {
|
|
| 1518 |
$args[ self::URLS_TESTED ] = '1';
|
| 1519 |
$args[ self::REMAINING_ERRORS ] = $error_count;
|
| 1520 |
} catch ( Exception $e ) {
|
| 1521 |
-
$args['amp_validate_error'] =
|
|
|
|
|
|
|
| 1522 |
$args[ self::URLS_TESTED ] = '0';
|
| 1523 |
|
| 1524 |
if ( $post && self::POST_TYPE_SLUG === $post->post_type ) {
|
|
@@ -1533,7 +1539,7 @@ class AMP_Validated_URL_Post_Type {
|
|
| 1533 |
}
|
| 1534 |
}
|
| 1535 |
|
| 1536 |
-
wp_safe_redirect( add_query_arg( $args, $redirect ) );
|
| 1537 |
exit();
|
| 1538 |
}
|
| 1539 |
|
|
@@ -2073,7 +2079,7 @@ class AMP_Validated_URL_Post_Type {
|
|
| 2073 |
}
|
| 2074 |
|
| 2075 |
return wp_nonce_url(
|
| 2076 |
-
add_query_arg( $args, admin_url() ),
|
| 2077 |
self::NONCE_ACTION
|
| 2078 |
);
|
| 2079 |
}
|
| 631 |
/**
|
| 632 |
* Normalize a URL for storage.
|
| 633 |
*
|
|
|
|
| 634 |
* The AMP query param is removed to facilitate switching between standard and transitional.
|
| 635 |
* The URL scheme is also normalized to HTTPS to help with transition from HTTP to HTTPS.
|
| 636 |
*
|
| 637 |
* @param string $url URL.
|
| 638 |
* @return string Normalized URL.
|
|
|
|
| 639 |
*/
|
| 640 |
protected static function normalize_url_for_storage( $url ) {
|
|
|
|
|
|
|
| 641 |
// Only ever store the canonical version.
|
| 642 |
$url = amp_remove_endpoint( $url );
|
| 643 |
|
| 647 |
// Normalize query args, removing all that are not recognized or which are removable.
|
| 648 |
$url_parts = explode( '?', $url, 2 );
|
| 649 |
if ( 2 === count( $url_parts ) ) {
|
| 650 |
+
$args = wp_parse_args( $url_parts[1] );
|
| 651 |
foreach ( wp_removable_query_args() as $removable_query_arg ) {
|
| 652 |
unset( $args[ $removable_query_arg ] );
|
| 653 |
}
|
| 654 |
+
$url = $url_parts[0];
|
|
|
|
| 655 |
if ( ! empty( $args ) ) {
|
| 656 |
$url = $url_parts[0] . '?' . build_query( $args );
|
| 657 |
}
|
| 1226 |
|
| 1227 |
$validity = AMP_Validation_Manager::validate_url( $url );
|
| 1228 |
if ( is_wp_error( $validity ) ) {
|
| 1229 |
+
$errors[] = AMP_Validation_Manager::get_validate_url_error_message( $validity->get_error_code(), $validity->get_error_message() );
|
| 1230 |
continue;
|
| 1231 |
}
|
| 1232 |
|
| 1254 |
self::URLS_TESTED => count( $items ),
|
| 1255 |
];
|
| 1256 |
if ( ! empty( $errors ) ) {
|
| 1257 |
+
$args['amp_validate_error'] = AMP_Validation_Manager::serialize_validation_error_messages( $errors );
|
| 1258 |
} else {
|
| 1259 |
$args[ self::REMAINING_ERRORS ] = count( $remaining_invalid_urls );
|
| 1260 |
}
|
| 1261 |
|
| 1262 |
$redirect = remove_query_arg( wp_removable_query_args(), $redirect );
|
| 1263 |
+
return add_query_arg( rawurlencode_deep( $args ), $redirect );
|
| 1264 |
}
|
| 1265 |
|
| 1266 |
/**
|
| 1273 |
return;
|
| 1274 |
}
|
| 1275 |
|
| 1276 |
+
if ( isset( $_GET['amp_validate_error'] ) && is_string( $_GET['amp_validate_error'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
|
| 1277 |
+
// Note: The input var is validated by the unserialize_validation_error_messages method.
|
| 1278 |
+
$errors = AMP_Validation_Manager::unserialize_validation_error_messages( wp_unslash( $_GET['amp_validate_error'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
|
| 1279 |
+
if ( $errors ) {
|
| 1280 |
+
foreach ( array_unique( $errors ) as $error_message ) {
|
| 1281 |
+
printf(
|
| 1282 |
+
'<div class="notice is-dismissible error"><p>%s</p><button type="button" class="notice-dismiss"><span class="screen-reader-text">%s</span></button></div>',
|
| 1283 |
+
wp_kses(
|
| 1284 |
+
$error_message,
|
| 1285 |
+
[
|
| 1286 |
+
'a' => array_fill_keys( [ 'href', 'target' ], true ),
|
| 1287 |
+
'code' => [],
|
| 1288 |
+
]
|
| 1289 |
+
),
|
| 1290 |
+
esc_html__( 'Dismiss this notice.', 'amp' )
|
| 1291 |
+
);
|
| 1292 |
+
}
|
| 1293 |
}
|
| 1294 |
}
|
| 1295 |
|
| 1491 |
|
| 1492 |
$validity = AMP_Validation_Manager::validate_url( $url );
|
| 1493 |
if ( is_wp_error( $validity ) ) {
|
| 1494 |
+
throw new Exception( AMP_Validation_Manager::get_validate_url_error_message( $validity->get_error_code(), $validity->get_error_message() ) );
|
| 1495 |
}
|
| 1496 |
|
| 1497 |
$errors = wp_list_pluck( $validity['results'], 'error' );
|
| 1506 |
)
|
| 1507 |
);
|
| 1508 |
if ( is_wp_error( $stored ) ) {
|
| 1509 |
+
throw new Exception( AMP_Validation_Manager::get_validate_url_error_message( $stored->get_error_code(), $stored->get_error_message() ) );
|
| 1510 |
}
|
| 1511 |
$redirect = get_edit_post_link( $stored, 'raw' );
|
| 1512 |
|
| 1522 |
$args[ self::URLS_TESTED ] = '1';
|
| 1523 |
$args[ self::REMAINING_ERRORS ] = $error_count;
|
| 1524 |
} catch ( Exception $e ) {
|
| 1525 |
+
$args['amp_validate_error'] = AMP_Validation_Manager::serialize_validation_error_messages(
|
| 1526 |
+
[ $e->getMessage() ]
|
| 1527 |
+
);
|
| 1528 |
$args[ self::URLS_TESTED ] = '0';
|
| 1529 |
|
| 1530 |
if ( $post && self::POST_TYPE_SLUG === $post->post_type ) {
|
| 1539 |
}
|
| 1540 |
}
|
| 1541 |
|
| 1542 |
+
wp_safe_redirect( add_query_arg( rawurlencode_deep( $args ), $redirect ) );
|
| 1543 |
exit();
|
| 1544 |
}
|
| 1545 |
|
| 2079 |
}
|
| 2080 |
|
| 2081 |
return wp_nonce_url(
|
| 2082 |
+
add_query_arg( rawurlencode_deep( $args ), admin_url() ),
|
| 2083 |
self::NONCE_ACTION
|
| 2084 |
);
|
| 2085 |
}
|
includes/validation/class-amp-validation-manager.php
CHANGED
|
@@ -1874,17 +1874,14 @@ class AMP_Validation_Manager {
|
|
| 1874 |
|
| 1875 |
$response = wp_remote_retrieve_body( $r );
|
| 1876 |
if ( trim( $response ) === '' ) {
|
| 1877 |
-
|
| 1878 |
-
return new WP_Error( $error_code, self::get_validate_url_error_message( $error_code ) );
|
| 1879 |
}
|
| 1880 |
if ( ! preg_match( '#</body>.*?<!--\s*AMP_VALIDATION\s*:\s*(\{.*?\})\s*-->#s', $response, $matches ) ) {
|
| 1881 |
-
|
| 1882 |
-
return new WP_Error( $error_code, self::get_validate_url_error_message( $error_code ) );
|
| 1883 |
}
|
| 1884 |
$validation = json_decode( $matches[1], true );
|
| 1885 |
if ( json_last_error() || ! isset( $validation['results'] ) || ! is_array( $validation['results'] ) ) {
|
| 1886 |
-
|
| 1887 |
-
return new WP_Error( $error_code, self::get_validate_url_error_message( $error_code ) );
|
| 1888 |
}
|
| 1889 |
|
| 1890 |
return array_merge(
|
|
@@ -1893,38 +1890,105 @@ class AMP_Validation_Manager {
|
|
| 1893 |
);
|
| 1894 |
}
|
| 1895 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1896 |
/**
|
| 1897 |
* Get error message for a validate URL failure.
|
| 1898 |
*
|
| 1899 |
-
* @param string $error_code
|
| 1900 |
-
* @
|
|
|
|
| 1901 |
*/
|
| 1902 |
-
public static function get_validate_url_error_message( $error_code ) {
|
| 1903 |
-
$check_error_log =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1904 |
switch ( $error_code ) {
|
| 1905 |
case 'http_request_failed':
|
| 1906 |
-
return __( 'Failed to fetch URL
|
| 1907 |
case 'white_screen_of_death':
|
| 1908 |
-
return __( 'Unable to validate URL. Encountered a white screen of death likely due to a fatal error.', 'amp' ) .
|
| 1909 |
case '404':
|
| 1910 |
-
return __( 'The fetched URL was not found. It may have been deleted. If so, you can trash this.', 'amp' );
|
| 1911 |
case '500':
|
| 1912 |
-
return __( 'An internal server error occurred when fetching the URL for validation.', 'amp' ) .
|
| 1913 |
case 'response_comment_absent':
|
| 1914 |
return sprintf(
|
| 1915 |
-
/* translators: %s: AMP_VALIDATION */
|
| 1916 |
-
__( 'URL validation failed to due to the absence of the expected JSON-containing %s comment after
|
| 1917 |
-
'AMP_VALIDATION'
|
| 1918 |
-
|
|
|
|
| 1919 |
case 'malformed_json_validation_errors':
|
| 1920 |
return sprintf(
|
| 1921 |
-
/* translators: %s: AMP_VALIDATION */
|
| 1922 |
-
__( 'URL validation failed to due to unexpected JSON in the %s comment after
|
| 1923 |
-
'AMP_VALIDATION'
|
| 1924 |
-
|
|
|
|
| 1925 |
default:
|
| 1926 |
/* translators: %s is error code */
|
| 1927 |
-
return sprintf( __( 'URL validation failed. Error code: %s.', 'amp' ), $error_code )
|
| 1928 |
}
|
| 1929 |
}
|
| 1930 |
|
| 1874 |
|
| 1875 |
$response = wp_remote_retrieve_body( $r );
|
| 1876 |
if ( trim( $response ) === '' ) {
|
| 1877 |
+
return new WP_Error( 'white_screen_of_death' );
|
|
|
|
| 1878 |
}
|
| 1879 |
if ( ! preg_match( '#</body>.*?<!--\s*AMP_VALIDATION\s*:\s*(\{.*?\})\s*-->#s', $response, $matches ) ) {
|
| 1880 |
+
return new WP_Error( 'response_comment_absent' );
|
|
|
|
| 1881 |
}
|
| 1882 |
$validation = json_decode( $matches[1], true );
|
| 1883 |
if ( json_last_error() || ! isset( $validation['results'] ) || ! is_array( $validation['results'] ) ) {
|
| 1884 |
+
return new WP_Error( 'malformed_json_validation_errors' );
|
|
|
|
| 1885 |
}
|
| 1886 |
|
| 1887 |
return array_merge(
|
| 1890 |
);
|
| 1891 |
}
|
| 1892 |
|
| 1893 |
+
/**
|
| 1894 |
+
* Serialize validation error messages.
|
| 1895 |
+
*
|
| 1896 |
+
* In order to safely pass validation error messages through redirects with query parameters, they must be serialized
|
| 1897 |
+
* with a HMAC for security. The messages contain markup so the HMAC prevents tampering.
|
| 1898 |
+
*
|
| 1899 |
+
* @since 1.4.2
|
| 1900 |
+
* @see AMP_Validation_Manager::unserialize_validation_error_messages()
|
| 1901 |
+
*
|
| 1902 |
+
* @param string[] $messages Messages.
|
| 1903 |
+
* @return string Serialized.
|
| 1904 |
+
*/
|
| 1905 |
+
public static function serialize_validation_error_messages( $messages ) {
|
| 1906 |
+
$encoded_messages = base64_encode( wp_json_encode( array_unique( $messages ) ) ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
|
| 1907 |
+
return wp_hash( $encoded_messages ) . ':' . $encoded_messages;
|
| 1908 |
+
}
|
| 1909 |
+
|
| 1910 |
+
/**
|
| 1911 |
+
* Unserialize validation error messages.
|
| 1912 |
+
*
|
| 1913 |
+
* @since 1.4.2
|
| 1914 |
+
* @see AMP_Validation_Manager::serialize_validation_error_messages()
|
| 1915 |
+
*
|
| 1916 |
+
* @param string $serialized Serialized messages.
|
| 1917 |
+
* @return string[]|null
|
| 1918 |
+
*/
|
| 1919 |
+
public static function unserialize_validation_error_messages( $serialized ) {
|
| 1920 |
+
$parts = explode( ':', $serialized, 2 );
|
| 1921 |
+
if ( count( $parts ) !== 2 || wp_hash( $parts[1] ) !== $parts[0] ) {
|
| 1922 |
+
return null;
|
| 1923 |
+
}
|
| 1924 |
+
return json_decode( base64_decode( $parts[1] ), true ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode
|
| 1925 |
+
}
|
| 1926 |
+
|
| 1927 |
/**
|
| 1928 |
* Get error message for a validate URL failure.
|
| 1929 |
*
|
| 1930 |
+
* @param string $error_code Error code.
|
| 1931 |
+
* @param string $error_message Error message, typically technical such as from HTTP status text or cURL error message.
|
| 1932 |
+
* @return string Error message with HTML markup.
|
| 1933 |
*/
|
| 1934 |
+
public static function get_validate_url_error_message( $error_code, $error_message = '' ) {
|
| 1935 |
+
$check_error_log = sprintf(
|
| 1936 |
+
/* translators: %s is link to Debugging in WordPress */
|
| 1937 |
+
' ' . __( 'Please check your server PHP error logs; to do this you may need to <a href="%s" target="_blank">enable</a> <code>WP_DEBUG_LOG</code>.', 'amp' ),
|
| 1938 |
+
esc_url( 'https://wordpress.org/support/article/debugging-in-wordpress/' )
|
| 1939 |
+
);
|
| 1940 |
+
|
| 1941 |
+
if ( $error_message ) {
|
| 1942 |
+
$error_message = ' ' . rtrim( $error_message, '.' ) . '.';
|
| 1943 |
+
}
|
| 1944 |
+
|
| 1945 |
+
$support_forum_message = ' ' . sprintf(
|
| 1946 |
+
/* translators: %1$s: Link to support forum. %2$s: Link to new topic form in support forum. */
|
| 1947 |
+
__( 'If you are stuck, please search the <a href="%1$s">support forum</a> for possible related topics, or otherwise start a <a href="%2$s">new support topic</a> including the error message, the URL to your site, and your active theme/plugins.', 'amp' ),
|
| 1948 |
+
esc_url( 'https://wordpress.org/support/plugin/amp/' ),
|
| 1949 |
+
esc_url( 'https://wordpress.org/support/plugin/amp/#new-topic-0' )
|
| 1950 |
+
);
|
| 1951 |
+
|
| 1952 |
+
$site_health_message = '';
|
| 1953 |
+
if ( version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
|
| 1954 |
+
$site_health_message .= ' ' . sprintf(
|
| 1955 |
+
/* translators: %s is link to Site Health */
|
| 1956 |
+
__( 'Please check your <a href="%s">Site Health</a> to verify it can perform loopback requests.', 'amp' ),
|
| 1957 |
+
esc_url( admin_url( 'site-health.php' ) )
|
| 1958 |
+
);
|
| 1959 |
+
$support_forum_message .= ' ' . sprintf(
|
| 1960 |
+
/* translators: %s is the URL to Site Health Info. */
|
| 1961 |
+
__( 'Please include your <a href="%s">Site Health Info</a>.', 'amp' ),
|
| 1962 |
+
esc_url( admin_url( 'site-health.php?tab=debug' ) )
|
| 1963 |
+
);
|
| 1964 |
+
}
|
| 1965 |
+
|
| 1966 |
switch ( $error_code ) {
|
| 1967 |
case 'http_request_failed':
|
| 1968 |
+
return __( 'Failed to fetch URL to validate.', 'amp' ) . $error_message . $site_health_message . $support_forum_message;
|
| 1969 |
case 'white_screen_of_death':
|
| 1970 |
+
return __( 'Unable to validate URL. Encountered a white screen of death likely due to a PHP fatal error.', 'amp' ) . $error_message . $check_error_log . $support_forum_message;
|
| 1971 |
case '404':
|
| 1972 |
+
return __( 'The fetched URL was not found. It may have been deleted. If so, you can trash this.', 'amp' ) . $error_message . $support_forum_message;
|
| 1973 |
case '500':
|
| 1974 |
+
return __( 'An internal server error occurred when fetching the URL for validation.', 'amp' ) . $error_message . $check_error_log . $support_forum_message;
|
| 1975 |
case 'response_comment_absent':
|
| 1976 |
return sprintf(
|
| 1977 |
+
/* translators: %1$s: AMP_VALIDATION, %2$s: </body> */
|
| 1978 |
+
__( 'URL validation failed to due to the absence of the expected JSON-containing %1$s HTML comment after %2$s. This is often due to a PHP fatal error occurring.', 'amp' ),
|
| 1979 |
+
'<code>AMP_VALIDATION</code>',
|
| 1980 |
+
'<code></body></code>'
|
| 1981 |
+
) . $error_message . $check_error_log . $support_forum_message;
|
| 1982 |
case 'malformed_json_validation_errors':
|
| 1983 |
return sprintf(
|
| 1984 |
+
/* translators: %1$s: AMP_VALIDATION, %2$s: </body> */
|
| 1985 |
+
__( 'URL validation failed to due to unexpected JSON in the %1$s HTML comment after %2$s.', 'amp' ),
|
| 1986 |
+
'<code>AMP_VALIDATION</code>',
|
| 1987 |
+
'<code></body></code>'
|
| 1988 |
+
) . $error_message . $support_forum_message;
|
| 1989 |
default:
|
| 1990 |
/* translators: %s is error code */
|
| 1991 |
+
return sprintf( __( 'URL validation failed. Error code: %s.', 'amp' ), $error_code ) . $error_message . $support_forum_message;
|
| 1992 |
}
|
| 1993 |
}
|
| 1994 |
|
readme.txt
CHANGED
|
@@ -2,8 +2,8 @@
|
|
| 2 |
Contributors: google, xwp, automattic, westonruter, swissspidy, miinasikk, ryankienstra, albertomedina, tweetythierry
|
| 3 |
Tags: amp, stories, mobile, optimization, accelerated mobile pages, framework, components, blocks, performance, ux, seo, official
|
| 4 |
Requires at least: 4.9
|
| 5 |
-
Tested up to: 5.3
|
| 6 |
-
Stable tag: 1.4.
|
| 7 |
License: GPLv2 or later
|
| 8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 9 |
Requires PHP: 5.4
|
|
@@ -26,6 +26,10 @@ The plugin can be configured to follow one of three different template modes: St
|
|
| 26 |
|
| 27 |
With the official AMP plugin for WordPress, the WordPress ecosystem is provided with the capabilities and tools it needs to build world-class AMP experiences without deviating from its standard, flexible, and well-known content creation workflow.
|
| 28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
== Installation ==
|
| 30 |
|
| 31 |
1. Upload the folder to the `/wp-content/plugins/` directory.
|
| 2 |
Contributors: google, xwp, automattic, westonruter, swissspidy, miinasikk, ryankienstra, albertomedina, tweetythierry
|
| 3 |
Tags: amp, stories, mobile, optimization, accelerated mobile pages, framework, components, blocks, performance, ux, seo, official
|
| 4 |
Requires at least: 4.9
|
| 5 |
+
Tested up to: 5.3.2
|
| 6 |
+
Stable tag: 1.4.2
|
| 7 |
License: GPLv2 or later
|
| 8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 9 |
Requires PHP: 5.4
|
| 26 |
|
| 27 |
With the official AMP plugin for WordPress, the WordPress ecosystem is provided with the capabilities and tools it needs to build world-class AMP experiences without deviating from its standard, flexible, and well-known content creation workflow.
|
| 28 |
|
| 29 |
+
== Frequently Asked Questions ==
|
| 30 |
+
|
| 31 |
+
Please see the [FAQs on amp-wp.org](https://amp-wp.org/documentation/frequently-asked-questions/). Don't see an answer to your question? Please [search the support forum](https://wordpress.org/support/plugin/amp/) to see if someone has asked your question. Otherwise, please [open a new support topic](https://wordpress.org/support/plugin/amp/#new-post).
|
| 32 |
+
|
| 33 |
== Installation ==
|
| 34 |
|
| 35 |
1. Upload the folder to the `/wp-content/plugins/` directory.
|
vendor/autoload.php
CHANGED
|
@@ -4,4 +4,4 @@
|
|
| 4 |
|
| 5 |
require_once __DIR__ . '/composer/autoload_real.php';
|
| 6 |
|
| 7 |
-
return
|
| 4 |
|
| 5 |
require_once __DIR__ . '/composer/autoload_real.php';
|
| 6 |
|
| 7 |
+
return ComposerAutoloaderInitcb388a4b6a7e40c8dc0a084811af68a2::getLoader();
|
vendor/composer/autoload_real.php
CHANGED
|
@@ -2,7 +2,7 @@
|
|
| 2 |
|
| 3 |
// autoload_real.php @generated by Composer
|
| 4 |
|
| 5 |
-
class
|
| 6 |
{
|
| 7 |
private static $loader;
|
| 8 |
|
|
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit84793736047579e77802f3dcb617545d
|
|
| 19 |
return self::$loader;
|
| 20 |
}
|
| 21 |
|
| 22 |
-
spl_autoload_register(array('
|
| 23 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
| 24 |
-
spl_autoload_unregister(array('
|
| 25 |
|
| 26 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
| 27 |
if ($useStaticLoader) {
|
| 28 |
require_once __DIR__ . '/autoload_static.php';
|
| 29 |
|
| 30 |
-
call_user_func(\Composer\Autoload\
|
| 31 |
} else {
|
| 32 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
| 33 |
foreach ($map as $namespace => $path) {
|
| 2 |
|
| 3 |
// autoload_real.php @generated by Composer
|
| 4 |
|
| 5 |
+
class ComposerAutoloaderInitcb388a4b6a7e40c8dc0a084811af68a2
|
| 6 |
{
|
| 7 |
private static $loader;
|
| 8 |
|
| 19 |
return self::$loader;
|
| 20 |
}
|
| 21 |
|
| 22 |
+
spl_autoload_register(array('ComposerAutoloaderInitcb388a4b6a7e40c8dc0a084811af68a2', 'loadClassLoader'), true, true);
|
| 23 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
| 24 |
+
spl_autoload_unregister(array('ComposerAutoloaderInitcb388a4b6a7e40c8dc0a084811af68a2', 'loadClassLoader'));
|
| 25 |
|
| 26 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
| 27 |
if ($useStaticLoader) {
|
| 28 |
require_once __DIR__ . '/autoload_static.php';
|
| 29 |
|
| 30 |
+
call_user_func(\Composer\Autoload\ComposerStaticInitcb388a4b6a7e40c8dc0a084811af68a2::getInitializer($loader));
|
| 31 |
} else {
|
| 32 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
| 33 |
foreach ($map as $namespace => $path) {
|
vendor/composer/autoload_static.php
CHANGED
|
@@ -4,7 +4,7 @@
|
|
| 4 |
|
| 5 |
namespace Composer\Autoload;
|
| 6 |
|
| 7 |
-
class
|
| 8 |
{
|
| 9 |
public static $prefixLengthsPsr4 = array (
|
| 10 |
'W' =>
|
|
@@ -80,10 +80,10 @@ class ComposerStaticInit84793736047579e77802f3dcb617545d
|
|
| 80 |
public static function getInitializer(ClassLoader $loader)
|
| 81 |
{
|
| 82 |
return \Closure::bind(function () use ($loader) {
|
| 83 |
-
$loader->prefixLengthsPsr4 =
|
| 84 |
-
$loader->prefixDirsPsr4 =
|
| 85 |
-
$loader->prefixesPsr0 =
|
| 86 |
-
$loader->classMap =
|
| 87 |
|
| 88 |
}, null, ClassLoader::class);
|
| 89 |
}
|
| 4 |
|
| 5 |
namespace Composer\Autoload;
|
| 6 |
|
| 7 |
+
class ComposerStaticInitcb388a4b6a7e40c8dc0a084811af68a2
|
| 8 |
{
|
| 9 |
public static $prefixLengthsPsr4 = array (
|
| 10 |
'W' =>
|
| 80 |
public static function getInitializer(ClassLoader $loader)
|
| 81 |
{
|
| 82 |
return \Closure::bind(function () use ($loader) {
|
| 83 |
+
$loader->prefixLengthsPsr4 = ComposerStaticInitcb388a4b6a7e40c8dc0a084811af68a2::$prefixLengthsPsr4;
|
| 84 |
+
$loader->prefixDirsPsr4 = ComposerStaticInitcb388a4b6a7e40c8dc0a084811af68a2::$prefixDirsPsr4;
|
| 85 |
+
$loader->prefixesPsr0 = ComposerStaticInitcb388a4b6a7e40c8dc0a084811af68a2::$prefixesPsr0;
|
| 86 |
+
$loader->classMap = ComposerStaticInitcb388a4b6a7e40c8dc0a084811af68a2::$classMap;
|
| 87 |
|
| 88 |
}, null, ClassLoader::class);
|
| 89 |
}
|
