godaddy-wordpress/go

View on GitHub
includes/amp.php

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
<?php
/**
 * AMP Compatibility.
 *
 * @package Go\AMP
 */

namespace Go\AMP;

/**
 * Set up theme defaults and register supported WordPress features.
 *
 * @return void
 */
function setup() {

    $n = function( $function ) {
        return __NAMESPACE__ . "\\$function";
    };

    add_filter( 'walker_nav_menu_start_el', $n( 'amp_nav_sub_menu_buttons' ), 10, 4 );

    add_filter( 'body_class', $n( 'amp_body_class' ) );

}

/**
 * Append amp to the body classes.
 *
 * @param array $classes Body classes array.
 *
 * @return array Filtered body classes array.
 */
function amp_body_class( $classes ) {

    if ( ! is_amp() ) {

        return $classes;

    }

    $classes[] = 'amp';

    return $classes;

}

// phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter -- Parameters are coming from a hook.
/**
 * Filter the HTML output of a nav menu item to add the AMP dropdown button to reveal the sub-menu.
 *
 * This is only used for AMP since in JS it is added via initMainNavigation() in navigation.js.
 *
 * @param string   $item_output The menu item's starting HTML output.
 * @param WP_Post  $item        Menu item data object.
 * @param int      $depth       Depth of menu item. Used for padding.
 * @param stdClass $args        An object of wp_nav_menu() arguments.
 *
 * @return string Modified nav menu item HTML.
 */
function amp_nav_sub_menu_buttons( $item_output, $item, $depth, $args ) {

    if ( ! is_amp() || 'primary' !== $args->theme_location || ! in_array( 'menu-item-has-children', $item->classes, true ) ) {

        return $item_output;

    }

    $expanded = in_array( 'current-menu-ancestor', $item->classes, true );

    static $nav_menu_item_number = 0;
    $nav_menu_item_number++;
    $expanded_state_id = 'navMenuItemExpanded' . $nav_menu_item_number;

    $item_output .= sprintf(
        '<amp-state id="%s">
            <script type="application/json">%s</script>
        </amp-state>',
        esc_attr( $expanded_state_id ),
        wp_json_encode( $expanded )
    );

    $dropdown_button = sprintf(
        '<button class="dropdown-toggle%1$s" [class]="%2$s" aria-expanded="%3$s" [aria-expanded]="%4$s" on="%5$s">
            <span class="screen-reader-text" [text]="%6$s">%7$s</span>
        </button>',
        esc_attr( $expanded ? ' toggled-on' : '' ),
        esc_attr(
            sprintf(
                "%s + ( $expanded_state_id ? %s : '' )",
                wp_json_encode( 'dropdown-toggle' ),
                wp_json_encode( ' toggled-on' )
            )
        ),
        esc_attr( wp_json_encode( $expanded ) ),
        esc_attr( "$expanded_state_id ? 'true' : 'false'" ),
        esc_attr( "tap:AMP.setState( { $expanded_state_id: ! $expanded_state_id } )" ),
        esc_attr(
            sprintf(
                "$expanded_state_id ? %s : %s",
                wp_json_encode( __( 'collapse child menu', 'go' ) ),
                wp_json_encode( __( 'expand child menu', 'go' ) )
            )
        ),
        esc_html( $expanded ? __( 'collapse child menu', 'go' ) : __( 'expand child menu', 'go' ) )
    );

    return $dropdown_button . $item_output;

}
// phpcs:enable Generic.CodeAnalysis.UnusedFunctionParameter

/**
 * Determine whether it is an AMP response.
 *
 * This function is used as a "Conditional Tag" in WordPress. It can only be used at the `wp` action or later.
 *
 * @link https://developer.wordpress.org/themes/references/list-of-conditional-tags/
 * @see amp_is_request()
 *
 * @return bool Is AMP response.
 */
function is_amp() {

    /**
     * Filter whether or not this is an AMP request.
     *
     * @var bool
     */
    return (bool) apply_filters( 'go_is_amp', ( function_exists( 'amp_is_request' ) && amp_is_request() ) );

}