AMP for WordPress - Version 0.3.2

Version Description

(Mar 4, 2016) =

  • Jetpack Stats support.
  • Better version of Merriweather and use system fonts for sans-serif (props mattmiklic).
  • Move font to stylesheet so it can be more easily overridden (props mattmiklic).
  • Fix: Template loading issues on Windows. (Thanks to everyone who reported this, especially w33zy for pointing out the validate_file issue.)
  • Fix: don't run AMP on post comment feeds (props kraftbj).
  • Fix: un-break pagination when using a static home page with multiple pages.
  • Fix: force amp-iframe to use https to validate correctly (props mister-ben).
  • Fix: validation for target and video/audio attributes.
  • Fix: clipped images in galleries (thanks tobaco).
Download this release

Release Info

Developer batmoo
Plugin Icon 128x128 AMP for WordPress
Version 0.3.2
Comparing to
See all releases

Code changes from version 0.3.1 to 0.3.2

amp.php CHANGED
@@ -5,7 +5,7 @@
5
  * Plugin URI: https://github.com/automattic/amp-wp
6
  * Author: Automattic
7
  * Author URI: https://automattic.com
8
- * Version: 0.3.1
9
  * Text Domain: amp
10
  * Domain Path: /languages/
11
  * License: GPLv2 or later
@@ -44,19 +44,22 @@ function amp_init() {
44
 
45
  add_action( 'wp', 'amp_maybe_add_actions' );
46
 
47
- if ( class_exists( 'Jetpack' ) ) {
48
  require_once( AMP__DIR__ . '/jetpack-helper.php' );
49
  }
50
  }
51
 
52
  function amp_maybe_add_actions() {
53
- if ( ! is_singular() ) {
54
  return;
55
  }
56
 
57
  $is_amp_endpoint = is_amp_endpoint();
58
 
59
- $post = get_queried_object();
 
 
 
60
  $supports = post_supports_amp( $post );
61
 
62
  if ( ! $supports ) {
5
  * Plugin URI: https://github.com/automattic/amp-wp
6
  * Author: Automattic
7
  * Author URI: https://automattic.com
8
+ * Version: 0.3.2
9
  * Text Domain: amp
10
  * Domain Path: /languages/
11
  * License: GPLv2 or later
44
 
45
  add_action( 'wp', 'amp_maybe_add_actions' );
46
 
47
+ if ( class_exists( 'Jetpack' ) && ! ( defined( 'IS_WPCOM' ) && IS_WPCOM ) ) {
48
  require_once( AMP__DIR__ . '/jetpack-helper.php' );
49
  }
50
  }
51
 
52
  function amp_maybe_add_actions() {
53
+ if ( ! is_singular() || is_feed() ) {
54
  return;
55
  }
56
 
57
  $is_amp_endpoint = is_amp_endpoint();
58
 
59
+ // Cannot use `get_queried_object` before canonical redirect; see https://core.trac.wordpress.org/ticket/35344
60
+ global $wp_query;
61
+ $post = $wp_query->post;
62
+
63
  $supports = post_supports_amp( $post );
64
 
65
  if ( ! $supports ) {
includes/amp-post-template-actions.php CHANGED
@@ -42,3 +42,37 @@ function amp_post_template_add_schemaorg_metadata( $amp_template ) {
42
  <script type="application/ld+json"><?php echo json_encode( $metadata ); ?></script>
43
  <?php
44
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  <script type="application/ld+json"><?php echo json_encode( $metadata ); ?></script>
43
  <?php
44
  }
45
+
46
+ add_action( 'amp_post_template_data', 'amp_post_template_add_analytics_script' );
47
+ function amp_post_template_add_analytics_script( $data ) {
48
+ if ( ! empty( $data['amp_analytics'] ) ) {
49
+ $data['amp_component_scripts']['amp-analytics'] = 'https://cdn.ampproject.org/v0/amp-analytics-0.1.js';
50
+ }
51
+ return $data;
52
+ }
53
+
54
+ add_action( 'amp_post_template_footer', 'amp_post_template_add_analytics_data' );
55
+ function amp_post_template_add_analytics_data( $amp_template ) {
56
+ $analytics_entries = $amp_template->get( 'amp_analytics' );
57
+ if ( empty( $analytics_entries ) ) {
58
+ return;
59
+ }
60
+
61
+ foreach ( $analytics_entries as $id => $analytics_entry ) {
62
+ if ( ! isset( $analytics_entry['type'], $analytics_entry['attributes'], $analytics_entry['config_data'] ) ) {
63
+ _doing_it_wrong( __FUNCTION__, sprintf( __( 'Analytics entry for %s is missing one of the following keys: `type`, `attributes`, or `config_data` (array keys: %s)', 'amp' ), esc_html( $id ), esc_html( implode( ', ', array_keys( $analytics_entry ) ) ) ), '0.3.2' );
64
+ continue;
65
+ }
66
+
67
+ $script_element = AMP_HTML_Utils::build_tag( 'script', array(
68
+ 'type' => 'application/json',
69
+ ), json_encode( $analytics_entry['config_data'] ) );
70
+
71
+ $amp_analytics_attr = array_merge( array(
72
+ 'id' => $id,
73
+ 'type' => $analytics_entry['type'],
74
+ ), $analytics_entry['attributes'] );
75
+
76
+ echo AMP_HTML_Utils::build_tag( 'amp-analytics', $amp_analytics_attr, $script_element );
77
+ }
78
+ }
includes/class-amp-post-template.php CHANGED
@@ -1,5 +1,8 @@
1
  <?php
2
 
 
 
 
3
  require_once( AMP__DIR__ . '/includes/class-amp-content.php' );
4
 
5
  require_once( AMP__DIR__ . '/includes/sanitizers/class-amp-blacklist-sanitizer.php' );
@@ -47,6 +50,18 @@ class AMP_Post_Template {
47
 
48
  'amp_runtime_script' => 'https://cdn.ampproject.org/v0.js',
49
  'amp_component_scripts' => array(),
 
 
 
 
 
 
 
 
 
 
 
 
50
  );
51
 
52
  $this->build_post_content();
@@ -242,13 +257,11 @@ class AMP_Post_Template {
242
  }
243
 
244
  private function is_valid_template( $template ) {
245
- $template = $this->normalize_path( $template );
246
- $content_dir = $this->normalize_path( WP_CONTENT_DIR );
247
- if ( 0 !== strpos( $template, $content_dir ) ) {
248
  return false;
249
  }
250
 
251
- if ( 0 !== validate_file( $template ) ) {
252
  return false;
253
  }
254
 
@@ -258,8 +271,4 @@ class AMP_Post_Template {
258
 
259
  return true;
260
  }
261
-
262
- private function normalize_path( $path ) {
263
- return str_replace( array( '/', '\\' ), DIRECTORY_SEPARATOR, $path );
264
- }
265
  }
1
  <?php
2
 
3
+ require_once( AMP__DIR__ . '/includes/utils/class-amp-dom-utils.php' );
4
+ require_once( AMP__DIR__ . '/includes/utils/class-amp-html-utils.php' );
5
+
6
  require_once( AMP__DIR__ . '/includes/class-amp-content.php' );
7
 
8
  require_once( AMP__DIR__ . '/includes/sanitizers/class-amp-blacklist-sanitizer.php' );
50
 
51
  'amp_runtime_script' => 'https://cdn.ampproject.org/v0.js',
52
  'amp_component_scripts' => array(),
53
+
54
+ /**
55
+ * Add amp-analytics tags.
56
+ *
57
+ * This filter allows you to easily insert any amp-analytics tags without needing much heavy lifting.
58
+ *
59
+ * @since 0.4
60
+ *.
61
+ * @param array $analytics An associative array of the analytics entries we want to output. Each array entry must have a unique key, and the value should be an array with the following keys: `type`, `attributes`, `script_data`. See readme for more details.
62
+ * @param object $post The current post.
63
+ */
64
+ 'amp_analytics' => apply_filters( 'amp_post_template_analytics', array(), $this->post ),
65
  );
66
 
67
  $this->build_post_content();
257
  }
258
 
259
  private function is_valid_template( $template ) {
260
+ if ( false !== strpos( $template, '..' ) ) {
 
 
261
  return false;
262
  }
263
 
264
+ if ( false !== strpos( $template, './' ) ) {
265
  return false;
266
  }
267
 
271
 
272
  return true;
273
  }
 
 
 
 
274
  }
includes/embeds/class-amp-gallery-embed.php CHANGED
@@ -120,6 +120,7 @@ class AMP_Gallery_Embed_Handler extends AMP_Base_Embed_Handler {
120
  'src' => $image['url'],
121
  'width' => $image['width'],
122
  'height' => $image['height'],
 
123
  )
124
  );
125
  }
120
  'src' => $image['url'],
121
  'width' => $image['width'],
122
  'height' => $image['height'],
123
+ 'layout' => 'responsive',
124
  )
125
  );
126
  }
includes/sanitizers/class-amp-audio-sanitizer.php CHANGED
@@ -58,7 +58,7 @@ class AMP_Audio_Sanitizer extends AMP_Base_Sanitizer {
58
  case 'loop':
59
  case 'muted':
60
  if ( 'false' !== $value ) {
61
- $out[ $name ] = 'true';
62
  }
63
  break;
64
  case 'autoplay':
58
  case 'loop':
59
  case 'muted':
60
  if ( 'false' !== $value ) {
61
+ $out[ $name ] = '';
62
  }
63
  break;
64
  case 'autoplay':
includes/sanitizers/class-amp-blacklist-sanitizer.php CHANGED
@@ -92,9 +92,14 @@ class AMP_Blacklist_Sanitizer extends AMP_Base_Sanitizer {
92
  } elseif ( 'rev' === $attribute_name ) {
93
  // rev removed from HTML5 spec, which was used by Jetpack Markdown.
94
  $node->removeAttribute( $attribute_name );
95
- } elseif ( 'target' === $attribute_name && '_new' === $attribute->value ) {
96
- // _new is not allowed; swap with _blank
97
- $node->setAttribute( $attribute_name, '_blank' );
 
 
 
 
 
98
  }
99
  }
100
 
92
  } elseif ( 'rev' === $attribute_name ) {
93
  // rev removed from HTML5 spec, which was used by Jetpack Markdown.
94
  $node->removeAttribute( $attribute_name );
95
+ } elseif ( 'target' === $attribute_name ) {
96
+ if ( '_blank' === $attribute->value || '_new' === $attribute->value ) {
97
+ // _new is not allowed; swap with _blank
98
+ $node->setAttribute( $attribute_name, '_blank' );
99
+ } else {
100
+ // only _blank is allowed
101
+ $node->removeAttribute( $attribute_name );
102
+ }
103
  }
104
  }
105
 
includes/sanitizers/class-amp-iframe-sanitizer.php CHANGED
@@ -83,7 +83,6 @@ class AMP_Iframe_Sanitizer extends AMP_Base_Sanitizer {
83
 
84
  foreach ( $attributes as $name => $value ) {
85
  switch ( $name ) {
86
- case 'src':
87
  case 'sandbox':
88
  case 'height':
89
  case 'class':
@@ -91,6 +90,10 @@ class AMP_Iframe_Sanitizer extends AMP_Base_Sanitizer {
91
  $out[ $name ] = $value;
92
  break;
93
 
 
 
 
 
94
  case 'width':
95
  if ( $value === '100%' ) {
96
  continue;
83
 
84
  foreach ( $attributes as $name => $value ) {
85
  switch ( $name ) {
 
86
  case 'sandbox':
87
  case 'height':
88
  case 'class':
90
  $out[ $name ] = $value;
91
  break;
92
 
93
+ case 'src':
94
+ $out[ $name ] = set_url_scheme( $value, 'https' );
95
+ break;
96
+
97
  case 'width':
98
  if ( $value === '100%' ) {
99
  continue;
includes/sanitizers/class-amp-video-sanitizer.php CHANGED
@@ -58,7 +58,7 @@ class AMP_Video_Sanitizer extends AMP_Base_Sanitizer {
58
  case 'loop':
59
  case 'muted':
60
  if ( 'false' !== $value ) {
61
- $out[ $name ] = 'true';
62
  }
63
  break;
64
  case 'autoplay':
58
  case 'loop':
59
  case 'muted':
60
  if ( 'false' !== $value ) {
61
+ $out[ $name ] = '';
62
  }
63
  break;
64
  case 'autoplay':
jetpack-helper.php CHANGED
@@ -9,6 +9,9 @@ add_action( 'pre_amp_render_post', 'amp_jetpack_mods' );
9
  *
10
  **/
11
  function amp_jetpack_mods() {
 
 
 
12
  amp_jetpack_disable_sharing();
13
  amp_jetpack_disable_related_posts();
14
  }
@@ -29,3 +32,40 @@ function amp_jetpack_disable_related_posts() {
29
  remove_filter( 'the_content', array( $jprp, 'filter_add_target_to_dom' ), 40 );
30
  }
31
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  *
10
  **/
11
  function amp_jetpack_mods() {
12
+ if ( Jetpack::is_module_active( 'stats' ) ) {
13
+ add_action( 'amp_post_template_footer', 'jetpack_amp_add_stats_pixel' );
14
+ }
15
  amp_jetpack_disable_sharing();
16
  amp_jetpack_disable_related_posts();
17
  }
32
  remove_filter( 'the_content', array( $jprp, 'filter_add_target_to_dom' ), 40 );
33
  }
34
  }
35
+
36
+ function jetpack_amp_add_stats_pixel( $amp_template ) {
37
+ if ( ! has_action( 'wp_footer', 'stats_footer' ) ) {
38
+ return;
39
+ }
40
+ ?>
41
+ <amp-pixel src="<?php echo esc_url( jetpack_amp_build_stats_pixel_url() ); ?>"></amp-pixel>
42
+ <?php
43
+ }
44
+
45
+ /**
46
+ * Generate the stats pixel.
47
+ *
48
+ * Looks something like:
49
+ * https://pixel.wp.com/g.gif?v=ext&j=1%3A3.9.1&blog=1234&post=5678&tz=-4&srv=example.com&host=example.com&ref=&rand=0.4107963021218808
50
+ */
51
+ function jetpack_amp_build_stats_pixel_url() {
52
+ global $wp_the_query;
53
+ if ( function_exists( 'stats_build_view_data' ) ) { // added in https://github.com/Automattic/jetpack/pull/3445
54
+ $data = stats_build_view_data();
55
+ } else {
56
+ $blog = Jetpack_Options::get_option( 'id' );
57
+ $tz = get_option( 'gmt_offset' );
58
+ $v = 'ext';
59
+ $blog_url = parse_url( site_url() );
60
+ $srv = $blog_url['host'];
61
+ $j = sprintf( '%s:%s', JETPACK__API_VERSION, JETPACK__VERSION );
62
+ $post = $wp_the_query->get_queried_object_id();
63
+ $data = compact( 'v', 'j', 'blog', 'post', 'tz', 'srv' );
64
+ }
65
+
66
+ $data['host'] = rawurlencode( $_SERVER['HTTP_HOST'] );
67
+ $data['rand'] = 'RANDOM'; // amp placeholder
68
+ $data['ref'] = 'DOCUMENT_REFERRER'; // amp placeholder
69
+ $data = array_map( 'rawurlencode' , $data );
70
+ return add_query_arg( $data, 'https://pixel.wp.com/g.gif' );
71
+ }
readme.md CHANGED
@@ -28,12 +28,12 @@ If you're using an off-the-shelf theme (like from the WordPress.org Theme Direct
28
 
29
  If you're using a custom theme:
30
 
31
- - `functions.php` (or a file `require`-ed by `functions.php`).
32
  - Any of the options above.
33
 
34
  ### Theme Mods
35
 
36
- The default template will attempt to draw from various theme mods, such as site icon and background and header color/image, if supported by the active theme.
37
 
38
  #### Site Icon
39
 
@@ -51,18 +51,14 @@ function xyz_amp_set_site_icon_url( $data ) {
51
  }
52
  ```
53
 
54
- #### Custom Header
55
-
56
- This needs to be implemented.
57
-
58
  #### Logo Only
59
 
60
  If you want to hide the site text and just show a logo, use the `amp_post_template_css` action. The following colours the title bar black, hides the site title, and replaces it with a centered logo:
61
 
62
  ```
63
  add_action( 'amp_post_template_css', 'xyz_amp_additional_css_styles' );
64
-
65
- function discover_fp_amp_additional_css_styles( $amp_template ) {
66
  // only CSS here please...
67
  ?>
68
  nav.amp-wp-title-bar {
@@ -152,6 +148,7 @@ function xyz_amp_modify_json_metadata( $metadata, $post ) {
152
  'height' => 60,
153
  'width' => 600,
154
  );
 
155
  return $metadata;
156
  }
157
  ```
@@ -276,23 +273,12 @@ Note: the file should only include CSS, not the `<style>` opening and closing ta
276
  If you want to add stuff to the head or footer of the default AMP template, use the `amp_post_template_head` and `amp_post_template_footer` actions.
277
 
278
  ```php
279
- add_action( 'amp_post_template_footer', 'xyz_amp_add_analytics' );
280
 
281
  function xyz_amp_add_analytics( $amp_template ) {
282
  $post_id = $amp_template->get( 'post_id' );
283
- // see https://github.com/ampproject/amphtml/blob/master/extensions/amp-analytics/amp-analytics.md for more on amp-analytics
284
  ?>
285
- <amp-analytics>
286
- <script type="application/json">
287
- {
288
- "requests": {
289
- "pageview": "https://example.com/analytics?url=${canonicalUrl}&title=${title}&acct=${account}",
290
- "event": "https://example.com/analytics?eid=${eventId}&elab=${eventLabel}&acct=${account}"
291
- }
292
- // ...
293
- }
294
- </script>
295
- </amp-analytics>
296
  <?php
297
  }
298
  ```
@@ -484,7 +470,7 @@ class XYZ_AMP_Ad_Injection_Sanitizer extends AMP_Base_Sanitizer {
484
  // Otherwise, add it to the end.
485
  $p_nodes = $body->getElementsByTagName( 'p' );
486
  if ( $p_nodes->length > 6 ) {
487
- $p_nodes->item( 4 )->insertBefore( $ad_node );
488
  } else {
489
  $body->appendChild( $ad_node );
490
  }
@@ -504,9 +490,60 @@ function xyz_amp_add_ad_sanitizer( $sanitizer_classes, $post ) {
504
  }
505
  ```
506
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
  ## Custom Post Type Support
508
 
509
- By default, the plugin only creates AMP content for posts. You can add support for other post_types like so (assume our post_type slug is `xyz-review`):
510
 
511
  ```php
512
  add_action( 'amp_init', 'xyz_amp_add_review_cpt' );
@@ -528,13 +565,22 @@ function xyz_amp_set_custom_template( $file, $type, $post ) {
528
  }
529
  return $file;
530
  }
531
-
532
  ```
533
 
534
  We may provide better ways to handle this in the future.
535
 
536
  ## Plugin integrations
537
 
 
 
 
 
538
  ### Yoast SEO
539
 
540
  If you're using [Yoast SEO](https://wordpress.org/plugins/wordpress-seo/), check out the companion plugin here: https://github.com/Yoast/yoastseo-amp
 
 
 
 
 
 
28
 
29
  If you're using a custom theme:
30
 
31
+ - `functions.php` (or via a 'require' call to files that load from `functions.php`).
32
  - Any of the options above.
33
 
34
  ### Theme Mods
35
 
36
+ The default template will attempt to draw from various theme mods, such as site icon, if supported by the active theme.
37
 
38
  #### Site Icon
39
 
51
  }
52
  ```
53
 
 
 
 
 
54
  #### Logo Only
55
 
56
  If you want to hide the site text and just show a logo, use the `amp_post_template_css` action. The following colours the title bar black, hides the site title, and replaces it with a centered logo:
57
 
58
  ```
59
  add_action( 'amp_post_template_css', 'xyz_amp_additional_css_styles' );
60
+
61
+ function xyz_amp_additional_css_styles( $amp_template ) {
62
  // only CSS here please...
63
  ?>
64
  nav.amp-wp-title-bar {
148
  'height' => 60,
149
  'width' => 600,
150
  );
151
+
152
  return $metadata;
153
  }
154
  ```
273
  If you want to add stuff to the head or footer of the default AMP template, use the `amp_post_template_head` and `amp_post_template_footer` actions.
274
 
275
  ```php
276
+ add_action( 'amp_post_template_footer', 'xyz_amp_add_pixel' );
277
 
278
  function xyz_amp_add_analytics( $amp_template ) {
279
  $post_id = $amp_template->get( 'post_id' );
 
280
  ?>
281
+ <amp-pixel src="https://example.com/hi.gif?x=RANDOM"></amp-pixel>
 
 
 
 
 
 
 
 
 
 
282
  <?php
283
  }
284
  ```
470
  // Otherwise, add it to the end.
471
  $p_nodes = $body->getElementsByTagName( 'p' );
472
  if ( $p_nodes->length > 6 ) {
473
+ $p_nodes->item( 4 )->parentNode->insertBefore( $ad_node, $p_nodes->item( 4 ));
474
  } else {
475
  $body->appendChild( $ad_node );
476
  }
490
  }
491
  ```
492
 
493
+ ## Analytics
494
+
495
+ To output proper analytics tags, you can use the `amp_post_template_analytics` filter:
496
+
497
+ ```
498
+ add_filter( 'amp_post_template_analytics', 'xyz_amp_add_custom_analytics' );
499
+ function xyz_amp_add_custom_analytics( $analytics ) {
500
+ if ( ! is_array( $analytics ) ) {
501
+ $analytics = array();
502
+ }
503
+
504
+ // https://developers.google.com/analytics/devguides/collection/amp-analytics/
505
+ $analytics['xyz-googleanalytics'] = array(
506
+ 'type' => 'googleanalytics',
507
+ 'attributes' => array(
508
+ // 'data-credentials' => 'include',
509
+ ),
510
+ 'config_data' => array(
511
+ 'vars' => array(
512
+ 'account' => "UA-XXXXX-Y"
513
+ ),
514
+ 'triggers' => array(
515
+ 'trackPageview' => array(
516
+ 'on' => 'visible',
517
+ 'request' => 'pageview',
518
+ ),
519
+ ),
520
+ ),
521
+ );
522
+
523
+ // https://www.parsely.com/docs/integration/tracking/google-amp.html
524
+ $analytics['xyz-parsely'] = array(
525
+ 'type' => 'parsely',
526
+ 'attributes' => array(),
527
+ 'config_data' => array(
528
+ 'vars' => array(
529
+ 'apikey' => 'YOUR APIKEY GOES HERE',
530
+ )
531
+ ),
532
+ );
533
+
534
+ return $analytics;
535
+ }
536
+ ```
537
+
538
+ Each analytics entry must include a unique array key and the following attributes:
539
+
540
+ - `type`: `(string)` one of the [valid vendors](https://github.com/ampproject/amphtml/blob/master/extensions/amp-analytics/amp-analytics.md#analytics-vendors) for amp-analytics.
541
+ - `attributes`: `(array)` any [additional valid attributes](https://github.com/ampproject/amphtml/blob/master/extensions/amp-analytics/amp-analytics.md#attributes) to add to the `amp-analytics` element.
542
+ - `config_data`: `(array)` the [config data](https://github.com/ampproject/amphtml/blob/master/extensions/amp-analytics/amp-analytics.md#configuration) to include in the `amp-analytics` script tag. This is `json_encode`-d on output.
543
+
544
  ## Custom Post Type Support
545
 
546
+ By default, the plugin only creates AMP content for posts. You can add support for other post_types using the post_type parameter used when registering the custom post type (assume our post_type is `xyz-review`):
547
 
548
  ```php
549
  add_action( 'amp_init', 'xyz_amp_add_review_cpt' );
565
  }
566
  return $file;
567
  }
 
568
  ```
569
 
570
  We may provide better ways to handle this in the future.
571
 
572
  ## Plugin integrations
573
 
574
+ ### Jetpack
575
+
576
+ Jetpack integration is baked in. More support for things like Related Posts to come.
577
+
578
  ### Yoast SEO
579
 
580
  If you're using [Yoast SEO](https://wordpress.org/plugins/wordpress-seo/), check out the companion plugin here: https://github.com/Yoast/yoastseo-amp
581
+
582
+ ## Compatibility Issues
583
+
584
+ The following plugins have been known to cause issues with this plugin:
585
+
586
+ - Cloudflare Rocket Loader (modifies the output of the AMP page, which breaks validation.)
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: batmoo, joen, automattic
3
  Tags: amp, mobile
4
  Requires at least: 4.4
5
- Tested up to: 4.4
6
- Stable tag: 0.3.1
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -34,15 +34,28 @@ You can find details about customization options at https://github.com/Automatti
34
 
35
  == Changelog ==
36
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  = 0.3.1 (Feb 24, 2016) =
38
 
39
- * Fix AMP URLs for non-pretty permalinks.
 
40
  * Fix for password-protected posts.
41
  * Fix dimension extraction for schema-less or relative image URLs.
42
  * Better fallback for images with no dimensions.
43
- * Validation fixes for `a` tags.
44
  * Updated AMP boilerplate.
45
- * Allow `on` tags for elements.
46
  * Prefixed class names.
47
 
48
  = 0.3 (Feb 18, 2016) =
2
  Contributors: batmoo, joen, automattic
3
  Tags: amp, mobile
4
  Requires at least: 4.4
5
+ Tested up to: 4.5
6
+ Stable tag: 0.3.2
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
34
 
35
  == Changelog ==
36
 
37
+ = 0.3.2 (Mar 4, 2016) =
38
+
39
+ * Jetpack Stats support.
40
+ * Better version of Merriweather and use system fonts for sans-serif (props mattmiklic).
41
+ * Move font to stylesheet so it can be more easily overridden (props mattmiklic).
42
+ * Fix: Template loading issues on Windows. (Thanks to everyone who reported this, especially w33zy for pointing out the `validate_file` issue.)
43
+ * Fix: don't run AMP on post comment feeds (props kraftbj).
44
+ * Fix: un-break pagination when using a static home page with multiple pages.
45
+ * Fix: force amp-iframe to use https to validate correctly (props mister-ben).
46
+ * Fix: validation for `target` and `video`/`audio` attributes.
47
+ * Fix: clipped images in galleries (thanks tobaco).
48
+
49
  = 0.3.1 (Feb 24, 2016) =
50
 
51
+ * Allow custom query var (props vaurdan).
52
+ * Fix AMP URLs for non-pretty permalinks (props rakuishi).
53
  * Fix for password-protected posts.
54
  * Fix dimension extraction for schema-less or relative image URLs.
55
  * Better fallback for images with no dimensions.
56
+ * Validation fixes for `a` tags (props kraftbj).
57
  * Updated AMP boilerplate.
58
+ * Allow `on` tags for elements (props Steven Evatt).
59
  * Prefixed class names.
60
 
61
  = 0.3 (Feb 18, 2016) =
templates/single.php CHANGED
@@ -3,7 +3,6 @@
3
  <head>
4
  <meta charset="utf-8">
5
  <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
6
- <link href="https://fonts.googleapis.com/css?family=Merriweather:400,400italic,700,700italic|Open+Sans:400,700,400italic,700italic" rel="stylesheet" type="text/css">
7
  <?php do_action( 'amp_post_template_head', $this ); ?>
8
 
9
  <style amp-custom>
@@ -24,7 +23,7 @@
24
  </div>
25
  </nav>
26
  <div class="amp-wp-content">
27
- <h1 class="amp-wp-title"><?php echo esc_html( $this->get( 'post_title' ) ); ?></h1>
28
  <ul class="amp-wp-meta">
29
  <?php $this->load_parts( apply_filters( 'amp_post_template_meta_parts', array( 'meta-author', 'meta-time', 'meta-taxonomy' ) ) ); ?>
30
  </ul>
3
  <head>
4
  <meta charset="utf-8">
5
  <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
 
6
  <?php do_action( 'amp_post_template_head', $this ); ?>
7
 
8
  <style amp-custom>
23
  </div>
24
  </nav>
25
  <div class="amp-wp-content">
26
+ <h1 class="amp-wp-title"><?php echo wp_kses_data( $this->get( 'post_title' ) ); ?></h1>
27
  <ul class="amp-wp-meta">
28
  <?php $this->load_parts( apply_filters( 'amp_post_template_meta_parts', array( 'meta-author', 'meta-time', 'meta-taxonomy' ) ) ); ?>
29
  </ul>
templates/style.php CHANGED
@@ -1,3 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  /* Generic WP styling */
2
  amp-img.alignright { float: right; margin: 0 0 1em 1em; }
3
  amp-img.alignleft { float: left; margin: 0 1em 1em 0; }
@@ -77,11 +118,11 @@ a:focus {
77
  }
78
 
79
 
80
- /* Open Sans */
81
  .amp-wp-meta,
82
  nav.amp-wp-title-bar,
83
  .wp-caption-text {
84
- font-family: "Open Sans", sans-serif;
85
  font-size: 15px;
86
  }
87
 
@@ -192,6 +233,10 @@ amp-vine {
192
  background: #f3f6f8;
193
  }
194
 
 
 
 
 
195
  .amp-wp-iframe-placeholder {
196
  background: #f3f6f8 url( <?php echo esc_url( $this->get( 'placeholder_image_url' ) ); ?> ) no-repeat center 40%;
197
  background-size: 48px 48px;
1
+ /* Merriweather fonts */
2
+ @font-face {
3
+ font-family:'Merriweather';
4
+ src:url('https://s1.wp.com/i/fonts/merriweather/merriweather-regular-webfont.woff2') format('woff2'),
5
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-regular-webfont.woff') format('woff'),
6
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-regular-webfont.ttf') format('truetype'),
7
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-regular-webfont.svg#merriweatherregular') format('svg');
8
+ font-weight:400;
9
+ font-style:normal;
10
+ }
11
+
12
+ @font-face {
13
+ font-family:'Merriweather';
14
+ src:url('https://s1.wp.com/i/fonts/merriweather/merriweather-italic-webfont.woff2') format('woff2'),
15
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-italic-webfont.woff') format('woff'),
16
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-italic-webfont.ttf') format('truetype'),
17
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-italic-webfont.svg#merriweatheritalic') format('svg');
18
+ font-weight:400;
19
+ font-style:italic;
20
+ }
21
+
22
+ @font-face {
23
+ font-family:'Merriweather';
24
+ src:url('https://s1.wp.com/i/fonts/merriweather/merriweather-bold-webfont.woff2') format('woff2'),
25
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-bold-webfont.woff') format('woff'),
26
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-bold-webfont.ttf') format('truetype'),
27
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-bold-webfont.svg#merriweatherbold') format('svg');
28
+ font-weight:700;
29
+ font-style:normal;
30
+ }
31
+
32
+ @font-face {
33
+ font-family:'Merriweather';
34
+ src:url('https://s1.wp.com/i/fonts/merriweather/merriweather-bolditalic-webfont.woff2') format('woff2'),
35
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-bolditalic-webfont.woff') format('woff'),
36
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-bolditalic-webfont.ttf') format('truetype'),
37
+ url('https://s1.wp.com/i/fonts/merriweather/merriweather-bolditalic-webfont.svg#merriweatherbold_italic') format('svg');
38
+ font-weight:700;
39
+ font-style:italic;
40
+ }
41
+
42
  /* Generic WP styling */
43
  amp-img.alignright { float: right; margin: 0 0 1em 1em; }
44
  amp-img.alignleft { float: left; margin: 0 1em 1em 0; }
118
  }
119
 
120
 
121
+ /* UI Fonts */
122
  .amp-wp-meta,
123
  nav.amp-wp-title-bar,
124
  .wp-caption-text {
125
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen-Sans", "Ubuntu", "Cantarell", "Helvetica Neue", sans-serif;
126
  font-size: 15px;
127
  }
128
 
233
  background: #f3f6f8;
234
  }
235
 
236
+ amp-carousel > amp-img > img {
237
+ object-fit: contain;
238
+ }
239
+
240
  .amp-wp-iframe-placeholder {
241
  background: #f3f6f8 url( <?php echo esc_url( $this->get( 'placeholder_image_url' ) ); ?> ) no-repeat center 40%;
242
  background-size: 48px 48px;