Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
<?php
/**
* AMP Query Monitor Compat
*
* @package AMP_Query_Monitor_Compat
* @author Weston Ruter, Google
* @license GPL-2.0-or-later
* @copyright 2019 Google LLC
*
* @wordpress-plugin
* Plugin Name: AMP Query Monitor Compat
* Description: Integrate Query Monitor with AMP dev mode so that its scripts/styles are not removed in the sanitization process. Depends on <a href="https://wordpress.org/plugins/amp/">AMP plugin</a> <a href="https://github.com/ampproject/amp-wp/releases/tag/1.3-beta1">v1.3-beta1</a>+.
* Plugin URI: https://gist.github.com/westonruter/621137b5a5ae1caaaee48c63f61ce7b7
* Version: 0.1.0
* Author: Weston Ruter, Google
* Author URI: https://weston.ruter.net/
* License: GNU General Public License v2 (or later)
* License URI: http://www.gnu.org/licenses/gpl-2.0.html
* Gist Plugin URI: https://gist.github.com/westonruter/621137b5a5ae1caaaee48c63f61ce7b7
*/
namespace AMP_Query_Monitor_Compat;
/**
* Determine whether it is an AMP request.
*
* @return bool Whether AMP.
*/
function is_amp() {
return function_exists( 'is_amp_endpoint' ) && is_amp_endpoint();
}
/**
* Add inline scripts added by Query Monitor to AMP dev mode.
*
* @param string[] $xpaths XPaths.
* @return string[] XPaths.
*/
function add_dev_mode_attributes( $xpaths ) {
$xpaths[] = '//script[ contains( text(), "qm_number_format" ) ]';
$xpaths[] = '//script[ contains( text(), "QM_i18n" ) ]';
$xpaths[] = '//script[ contains( text(), "query-monitor-" ) ]';
return $xpaths;
}
add_filter( 'amp_dev_mode_element_xpaths', __NAMESPACE__ . '\add_dev_mode_attributes' );
/**
* Get all dependency handles for the supplied handles.
*
* @see \WP_Dependencies::all_deps()
*
* @param \WP_Dependencies $dependencies Dependencies.
* @param string[] $handles Handles.
* @return string[] Dependency handles.
*/
function get_all_deps( \WP_Dependencies $dependencies, $handles ) {
$dependency_handles = [];
foreach ( $handles as $handle ) {
if ( isset( $dependencies->registered[ $handle ] ) ) {
$dependency_handles = array_merge(
$dependency_handles,
$dependencies->registered[ $handle ]->deps,
get_all_deps( $dependencies, $dependencies->registered[ $handle ]->deps )
);
}
}
return $dependency_handles;
}
/**
* Mark Query Monitor assets as being part of AMP dev mode.
*/
function make_query_monitor_scripts_dependent_on_admin_bar() {
if ( ! is_amp() ) {
return;
}
$qm_handle = 'query-monitor';
if ( wp_script_is( $qm_handle, 'enqueued' ) ) {
$script_dependencies = array_merge( [ $qm_handle ], get_all_deps( wp_scripts(), [ $qm_handle ] ) );
add_filter(
'script_loader_tag',
function ( $tag, $handle ) use ( $script_dependencies ) {
if ( in_array( $handle, $script_dependencies, true ) ) {
$tag = preg_replace( '/(?<=<script)(?=\s|>)/i', ' data-ampdevmode', $tag );
}
return $tag;
},
10,
2
);
}
if ( wp_style_is( $qm_handle, 'enqueued' ) ) {
$style_dependencies = array_merge( [ $qm_handle ], get_all_deps( wp_styles(), [ $qm_handle ] ) );
add_filter(
'style_loader_tag',
function ( $tag, $handle ) use ( $style_dependencies ) {
if ( in_array( $handle, $style_dependencies, true ) ) {
$tag = preg_replace( '/(?<=<link)(?=\s|>)/i', ' data-ampdevmode', $tag );
}
return $tag;
},
10,
2
);
}
}
add_action( 'wp_enqueue_scripts', __NAMESPACE__ . '\make_query_monitor_scripts_dependent_on_admin_bar' );
@westonruter

This comment has been minimized.

Copy link
Owner Author

westonruter commented Apr 4, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.