site_oueb_2/wp-content/themes/oceanwp/inc/third/class-amp.php

462 lines
14 KiB
PHP
Executable File

<?php
/**
* AMP support for Theme
*
* @package OceanWP WordPress theme
*
* @author Amit Singh (apprimit@gmail.com)
* @since 1.8.7
*/
// Start and run class.
if ( ! class_exists( 'OceanWP_AMP' ) ) {
/**
* OceanWP AMP Setup
*/
class OceanWP_AMP {
/**
* Main Class Constructor
*/
public function __construct() {
add_action( 'wp', array( $this, 'oceanwp_amp_config' ) );
}
/**
* It will add required functions to enable AMP support if AMP endpoinnt is detected.
*
* @return void
*/
public function oceanwp_amp_config() {
if ( ! OCEANWP_Theme_Class::oceanwp_is_amp() ) {
return;
}
add_filter( 'oceanwp_schema_location_html', array( $this, 'oceanwp_body_id' ) );
add_filter( 'oceanwp_menu_toggle_data_attrs', array( $this, 'oceanwp_menu_taggle_attrs' ) );
add_action( 'wp_footer', array( $this, 'render_amp_states' ) );
add_filter( 'oceanwp_attrs_mobile_dropdown', array( $this, 'oceanwp_dropdown_menu_wrapper' ) );
add_filter( 'oceanwp_attrs_mobile_fullscreen', array( $this, 'oceanwp_fullscreen_menu_wrapper' ) );
add_filter( 'oceanwp_attrs_mobile_fullscreen_close', array( $this, 'oceanwp_fullscreen_menu_close' ) );
add_filter( 'walker_nav_menu_start_el', array( $this, 'mobile_submenu_icon' ), 20, 4 );
add_filter( 'oceanwp_toggle_submenu_icon', array( $this, 'toggle_submenu_icon' ), 20, 2 );
add_filter( 'owp_attr_submenu-toggle', array( $this, 'menu_toggle_button' ), 20, 3 );
add_filter( 'oceanwp_attrs_search_bar', array( $this, 'oceanwp_menu_search_bar' ) );
add_filter( 'oceanwp_attrs_overlay_search_bar', array( $this, 'oceanwp_menu_overlay_search_bar' ) );
add_filter( 'oceanwp_attrs_nav_search_bar', array( $this, 'oceanwp_nav_item_search_bar' ) );
add_filter( 'oceanwp_attrs_main_nav', array( $this, 'oceanwp_attrs_nav_wrapper' ) );
add_filter( 'oceanwp_attrs_vertical_header_style', array( $this, 'oceanwp_attrs_vertical_header_toggle' ) );
add_filter( 'ocean_head_css', array( $this, 'oceanwp_amp_css' ) );
// Woocommerce AMP.
if ( OCEANWP_WOOCOMMERCE_ACTIVE ) {
add_filter( 'ocean_menu_cart_style', array( $this, 'oceanwp_amp_mini_cart_style' ) );
}
}
/**
* Show body attrs.
*
* @since 1.8.7
* @param String $schema markup returned from theme.
* @return String
*/
public function oceanwp_body_id( $schema ) {
return $schema . 'id="oceanwp-body"';
}
/**
* Get CSS
*
* @param obj $output css output.
*/
public function oceanwp_amp_css( $output ) {
$css = '';
$css .= '#mobile-dropdown.opened {
display: block;
}
.menu-item {
display: flex;
position: relative;
align-item: center;
-webkit-box-pack: center;
-webkit-justify-content: center;
-moz-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-webkit-flex-direction: column;
-moz-box-orient: vertical;
-moz-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
.menu-item-has-children > button.submenu-toggle {
display: inline-block;
position: absolute;
background-color: transparent;
color: #555;
border: 0;
font-size: 20px;
top: .3em;
right: 20px;
cursor: pointer;
padding: 0 1em;
font-weight: normal;
line-height: inherit;
}
.menu-item-has-children > button.submenu-toggle::before {
content: "+";
display: inline-block;
}
.menu-item-has-children > button.submenu-toggle.submenu-open+ul.sub-menu {
display: block !important;
}
.menu-item-has-children > button.submenu-toggle.submenu-open::before {
content: "-";
}
.menu-item-has-children:hover > ul.sub-menu {
opacity: 1;
display: block;
visibility: visible;
}';
$amp_menu_breakpoint = get_theme_mod( 'ocean_mobile_menu_breakpoints', '959' );
$amp_menu_custom_breakpoint = get_theme_mod( 'ocean_mobile_menu_custom_breakpoint' );
$amp_vheader_style_width = get_theme_mod( 'ocean_vertical_header_width', '300' );
if ( 'custom' === $amp_menu_breakpoint && ! empty( $amp_menu_custom_breakpoint ) ) {
$amp_menu_breakpoint = $amp_menu_custom_breakpoint;
}
if ( ! empty( $amp_menu_breakpoint ) ) {
$css .= '@media (min-width: ' . $amp_menu_breakpoint . 'px) {
#site-header:not(.vertical-header) .menu-item-has-children > button.submenu-toggle {
display: none;
}
body.vertical-header-style.default-collapse.left-header #site-header.vertical-header {
left: -' . ( $amp_vheader_style_width - 36 ) . 'px;
}
body.vertical-header-style.default-collapse.left-header.amp-vertical-header #site-header.vertical-header {
left: 0;
}
body.vertical-header-style.default-collapse.right-header #site-header.vertical-header {
right: -' . ( $amp_vheader_style_width - 36 ) . 'px;
}
body.vertical-header-style.default-collapse.right-header.amp-vertical-header #site-header.vertical-header {
right: 0;
}
}';
}
$css .= '#mobile-fullscreen.opened {
display: block;
}
#mobile-fullscreen {
overflow-y: auto;
}
.fullscreen-mobile .oceanwp-mobile-menu-icon a.mobile-menu.opened .oceanwp-text {
display: inherit;
}';
$css .= '#searchform-overlay.active {
display: block;
}';
if ( OCEANWP_WOOCOMMERCE_ACTIVE ) {
$css .= '.woocommerce ul.products li.product:not(.product-category) .woo-entry-buttons li a.owp-quick-view,
.owp-quick-view {
display: none;
}
.woocommerce .oceanwp-grid-list {
display: none;
}
@media only screen and (max-width: 480px) {
.woocommerce .oceanwp-grid-list {
display: none;
}
}
';
}
// Return CSS.
if ( ! empty( $css ) ) {
$output .= '/* OceanWP AMP CSS */' . $css;
}
// Return output css.
return $output;
}
/**
* Menu Toggle attributes
*
* @param string $input the data attrs already existing in nav toggle.
* @return string
*/
public function oceanwp_menu_taggle_attrs( $input ) {
$input .= ' on="tap:AMP.setState( { owpAmpMenuExpanded: ! owpAmpMenuExpanded } ),oceanwp-body.toggleClass(class=mobile-dropdown)" ';
$input .= ' [class]="\'mobile-menu\' + ( owpAmpMenuExpanded ? \' opened\' : \'\' )" ';
$input .= ' aria-expanded="false" ';
$input .= ' [aria-expanded]="owpAmpMenuExpanded ? \'true\' : \'false\'" ';
return $input;
}
/**
* Add AMP attributes to the mobile dropdown menu wrapper.
*
* @param string $input the data attrs already existing in nav toggle.
* @return string
*/
public function oceanwp_dropdown_menu_wrapper( $input ) {
$input .= ' [class]="\'clr\' + ( owpAmpMenuExpanded ? \' opened\' : \'\' )" ';
$input .= ' aria-expanded="false" ';
$input .= ' [aria-expanded]="owpAmpMenuExpanded ? \'true\' : \'false\'" ';
return $input;
}
/**
* Add AMP attributes to the fullscreen menu wrapper.
*
* @param string $input the data attrs already existing in nav toggle.
* @return string
*/
public function oceanwp_fullscreen_menu_wrapper( $input ) {
$input .= ' [class]="\'clr\' + ( owpAmpMenuExpanded ? \' opened\' : \'\' )" ';
$input .= ' aria-expanded="false" ';
$input .= ' [aria-expanded]="owpAmpMenuExpanded ? \'true\' : \'false\'" ';
return $input;
}
/**
* Add AMP attributes to the fullscreen menu close wrapper.
*
* @param string $input the data attrs already existing in nav toggle.
* @return string
*/
public function oceanwp_fullscreen_menu_close( $input ) {
$input .= ' on="tap:AMP.setState( { owpAmpMenuExpanded: ! owpAmpMenuExpanded } ),oceanwp-body.toggleClass(class=clr)" ';
$input .= ' [class]="\'close\' + ( owpAmpMenuExpanded ? \' false\' : \'\' )" ';
return $input;
}
/**
* Add AMP attributes to the Vertical header toggle.
*
* @param string $input the data attrs already existing in nav toggle.
* @return string
*/
public function oceanwp_attrs_vertical_header_toggle( $input ) {
$input .= ' on="tap:AMP.setState( { owpAmpVhMenuExpanded: ! owpAmpVhMenuExpanded } ),oceanwp-body.toggleClass(class=amp-vertical-header)" ';
$input .= ' [class]="\'hamburger hamburger--spin\' + ( owpAmpVhMenuExpanded ? \' is-active\' : \'\' )" ';
$input .= ' aria-expanded="false" ';
$input .= ' [aria-expanded]="owpAmpVhMenuExpanded ? \'true\' : \'false\'" ';
return $input;
}
/**
* Add amp states to the dom.
*/
public function render_amp_states() {
echo '<amp-state id="owpAmpMenuExpanded">';
echo '<script type="application/json">false</script>';
echo '</amp-state>';
}
/**
* Set AMP State for eeach sub menu toggle.
*
* @param String $item_output HTML markup for the menu item.
* @param WP_Post $item Post object for the navigation menu.
*
* @return String HTML MArkup for the menu including the AML State.
*/
public function toggle_submenu_icon( $item_output, $item ) {
$item_output .= '<amp-state id="owpNavMenuItemExpanded' . esc_attr( $item->ID ) . '"><script type="application/json">false</script></amp-state>';
return $item_output;
}
/**
* Add AMP attribites to the toggle button.
*
* @param array $attr Attribute to load default.
* @param string $context The context, to build filter name.
* @param array $args Optional. Custom data to pass to filter.
*
* @return Array updated HTML attributes.
*/
public function menu_toggle_button( $attr, $context, $args ) {
$attr['[class]'] = '( owpNavMenuItemExpanded' . $args->ID . ' ? \' submenu-toggle submenu-open\' : \'submenu-toggle\')';
$attr['on'] = 'tap:AMP.setState( { owpNavMenuItemExpanded' . $args->ID . ': ! owpNavMenuItemExpanded' . $args->ID . ' } )';
return $attr;
}
/**
* Add submenu toggle icon for AMP version.
*
* @param string $item_output Menu item's HTML output.
* @param WP_Post $item Menu item data object.
* @param int $depth Depth of menu item.
* @param stdClass $args An object of wp_nav_menu() arguments.
*
* @return String Menu item's starting markup.
*/
public function mobile_submenu_icon( $item_output, $item, $depth, $args ) {
if ( true === is_object( $args ) ) {
if ( isset( $args->theme_location ) &&
( 'main_menu' === $args->theme_location ||
'mobile_menu' === $args->theme_location )
) {
if ( isset( $item->classes ) && in_array( 'menu-item-has-children', $item->classes, true ) ) {
$item_output = $this->menu_arrow_button_markup( $item_output, $item );
}
}
} else {
if ( isset( $item->post_parent ) && 0 === $item->post_parent ) {
$item_output = $this->menu_arrow_button_markup( $item_output, $item );
}
}
return $item_output;
}
/**
* Submenu item's toggle icon HTML markup
*
* @param string $item_output Menu item's HTML output.
* @param WP_Post $item Menu item data object.
*
* @return string Submenu toggle icon.
*/
public function menu_arrow_button_markup( $item_output, $item ) {
$item_output = apply_filters( 'oceanwp_toggle_submenu_icon', $item_output, $item );
$item_output .= '<button ' . owp_attr(
'submenu-toggle',
array(
'aria-expanded' => 'false',
),
$item
) . '><span class="screen-reader-text">' . __( 'Menu Toggle', 'oceanwp' ) . '</span></button>';
return $item_output;
}
/**
* Add AMP attributes to the nav search item.
*
* @param string $input the data attrs already existing in search toggle.
* @return string
*/
public function oceanwp_nav_item_search_bar( $input ) {
$input .= ' on="tap:AMP.setState( { owpAmpSearchExpanded: ! owpAmpSearchExpanded } )" ';
$input .= ' [class]="( owpAmpSearchExpanded ? \'search-toggle-li active\' : \'search-toggle-li\' )" ';
$input .= ' aria-expanded="false" [aria-expanded]="owpAmpSearchExpanded ? \'true\' : \'false\'" ';
return $input;
}
/**
* Add AMP attributes to the search bar wrapper.
*
* @param string $input the data attrs already existing in search toggle.
* @return string
*/
public function oceanwp_menu_search_bar( $input ) {
$input .= ' on="tap:AMP.setState( { owpAmpSearchExpanded: ! owpAmpSearchExpanded } )" ';
$input .= ' [class]="\'header-searchform-wrap clr\' + ( owpAmpSearchExpanded ? \' show\' : \'\' )" ';
$input .= ' aria-expanded="false" ';
$input .= ' [aria-expanded]="owpAmpSearchExpanded ? \'true\' : \'false\'" ';
return $input;
}
/**
* Add AMP attributes to the overlay search bar wrapper.
*
* @param string $input the data attrs already existing in search toggle.
* @return string
*/
public function oceanwp_menu_overlay_search_bar( $input ) {
$input .= ' on="tap:AMP.setState( { owpAmpSearchExpanded: ! owpAmpSearchExpanded } )" ';
$input .= ' [class]="\'header-searchform-wrap clr\' + ( owpAmpSearchExpanded ? \' active\' : \'\' )" ';
$input .= ' aria-expanded="false" ';
$input .= ' [aria-expanded]="owpAmpSearchExpanded ? \'true\' : \'false\'" ';
return $input;
}
/**
* Add AMP attributes to the oceanwp nav wrapper.
*
* @param string $input the data attrs already existing in search toggle.
* @return string
*/
public function oceanwp_attrs_nav_wrapper( $input ) {
if ( 'header_replace' !== get_theme_mod( 'ocean_menu_search_style', 'drop_down' ) ) {
return;
}
$inner_classes = oceanwp_header_menu_classes( 'inner' );
$input .= ' [class]="\'' . $inner_classes . '\' + ( owpAmpSearchExpanded ? \' hide\' : \'\' )" ';
$input .= ' aria-expanded="false" ';
$input .= ' [aria-expanded]="owpAmpSearchExpanded ? \'true\' : \'false\'" ';
return $input;
}
/**
* Woocommerce mini cart amp style
*
* @param obj $style Return mini cart style.
*/
public function oceanwp_amp_mini_cart_style( $style ) {
$style = 'custom_link';
return $style;
}
}
}
return new OceanWP_AMP();