|
Server : LiteSpeed System : Linux server51.dnsbootclub.com 4.18.0-553.62.1.lve.el8.x86_64 #1 SMP Mon Jul 21 17:50:35 UTC 2025 x86_64 User : nandedex ( 1060) PHP Version : 8.1.33 Disable Function : NONE Directory : /home/nandedex/public_html/wp-content/plugins11/better-amp/ |
<?php
/*
Plugin Name: Better AMP - WordPress Complete AMP
Plugin URI: https://betterstudio.com/wp-plugins/better-amp/
Description: Add FULL AMP support to your WordPress site.
Author: Better Studio
Version: 1.10.0
Author URI: http://betterstudio.com
*/
/***
* BetterAMP is BetterStudio solution for implementing Google AMP completely in WordPress.
*
* ______ _ _ ___ ___ ________
* | ___ \ | | | | / _ \| \/ | ___ \
* | |_/ / ___| |_| |_ ___ _ __/ /_\ \ . . | |_/ /
* | ___ \/ _ \ __| __/ _ \ '__| _ | |\/| | __/
* | |_/ / __/ |_| || __/ | | | | | | | | |
* \____/ \___|\__|\__\___|_| \_| |_|_| |_|_|
*
* Copyright © 2017 Better Studio
*
*
* Our portfolio is here: http://themeforest.net/user/Better-Studio/portfolio
*
* \--> BetterStudio, 2017 <--/
*/
// Fire up!
Better_AMP::get_instance();
/**
* Main class for BetterAMP
*
* @since 1.0.0
*/
class Better_AMP {
/**
* Main Better AMP instance
*
* @since 1.0.0
*
* @var self
*/
private static $instance;
/**
* Better AMP version number
*
* @since 1.0.0
*/
const VERSION = '1.10.0';
/**
* Default endpoint for AMP URL of site.
*
* @since 1.9.0
*/
const SLUG = 'amp';
/**
* @since 1.0.0
*/
const STARTPOINT = self::SLUG;
/**
* Default template directory
* This can be overridden by filter
*
* @since 1.0.0
*/
const TEMPLATE_DIR = 'better-amp';
/**
* pre_get_posts hook priority
*
* @since 1.1
*/
const ISOLATE_QUERY_HOOK_PRIORITY = 100;
/**
* Store array of posts id to exlucde transform permalinks to amp
*
* Array structure: array {
* 'post id' => dont care,
* ...
* }
*
* @see transform_post_link_to_amp
*
* @var array
*/
public $excluded_posts_id = array();
/**
* Get live instance of Better AMP
*
* @since 1.1
* @return self
*/
public static function get_instance() {
if ( ! self::$instance instanceof self ) {
self::$instance = new self();
self::$instance->init();
}
return self::$instance;
} // get_instance
/**
* Cloning is forbidden.
*
* @since 1.0.0
*/
public function __clone() {
_doing_it_wrong( __FUNCTION__, __( 'Cloning Better_AMP is forbidden', 'better-amp' ), '' );
}
/**
* Unserializing is forbidden.
*
* @since 1.0.0
*/
public function __wakeup() {
_doing_it_wrong( __FUNCTION__, __( 'Unserializing Better_AMP is forbidden', 'better-amp' ), '' );
}
/**
* Initialize
*
* @since 1.0.0
*/
public function init() {
$this->initial_constants();
$this->load_text_domain();
$this->register_autoload();
$this->include_files();
$this->apply_hooks();
$this->admin_hooks();
$this->metaboxes();
$this->admin_init();
}
/**
* Define core constants
*
* @since 1.0.0
*/
protected function initial_constants() {
define( 'BETTER_AMP_PATH', dirname( __FILE__ ) . '/' );
define( 'BETTER_AMP_INC', dirname( __FILE__ ) . '/includes/' );
define( '__BETTER_AMP_FILE__', __FILE__ );
define( 'BETTER_AMP_OVERRIDE_TPL_DIR', apply_filters( 'better-amp/template/dir-name', Better_AMP::TEMPLATE_DIR ) );
define( 'BETTER_AMP_TPL_COMPAT_ABSPATH', BETTER_AMP_PATH . 'theme-compat/' );
}
/**
* Load plugin textdomain file
*
* @since 1.0.0
*/
protected function load_text_domain() {
load_plugin_textdomain( 'better-amp', false, plugin_basename( BETTER_AMP_PATH ) . '/languages' );
}
/**
* Include Dependencies
*
* @since 1.0.0
*/
protected function include_files() {
require_once BETTER_AMP_PATH . 'bootstrap.php';
}
/**
* Register WP filters and actions
*
* @since 1.0.0
*/
protected function apply_hooks() {
// Registers the AMP rewrite rules
add_action( 'init', array( $this, 'add_rewrite' ) );
add_action( 'init', array( $this, 'append_index_rewrite_rule' ) );
add_action( 'template_redirect', array( $this, 'plugins_compatibility' ) );
// Initialize AMP components
add_action( 'init', array( $this, 'include_components' ) );
// Changes page template file with AMP template file
add_filter( 'template_include', array( $this, 'include_template_file' ), 9999 );
// override template file
add_filter( 'comments_template', array( $this, 'override_comments_template' ), 9999 );
// Initialize AMP theme and it's functionality
add_action( 'after_setup_theme', array( $this, 'include_template_functions_php' ), 1 );
// Register the AMP special shortcode ports
add_filter( 'the_content', array( $this, 'register_components_shortcodes' ), 1 );
// Replace all links inside contents to AMP version.
// Stops user to go outside of AMP version.
add_action( 'wp', array( $this, 'replace_internal_links_with_amp_version' ) );
// Registers all components scripts into the header style and scripts
add_action( 'better-amp/template/enqueue-scripts', array( $this, 'enqueue_components_scripts' ) );
// Let the components to do their functionality in head
add_action( 'better-amp/template/head', array( $this, 'trigger_component_head' ), 0 );
// Collect all output to can enqueue only needed scripts and styles in pages.
add_filter( 'template_include', array( $this, 'buffer_better_amp_start' ), 1 );
add_action( 'better-amp/template/footer', array( $this, 'buffer_better_amp_end' ), 999 );
// Collect and rollback all main query posts to disable thirdparty codes to change main query!
// action after 1000 priority can work
add_action( 'pre_get_posts', array( $this, 'isolate_pre_get_posts_start' ), 1 );
add_action( 'pre_get_posts', array( $this, 'isolate_pre_get_posts_end' ), self::ISOLATE_QUERY_HOOK_PRIORITY );
add_action( 'pre_get_posts', array( $this, 'compatible_plugins_themes' ), 0 );
register_activation_hook( __FILE__, array( $this, 'install' ) );
add_filter( 'request', array( $this, 'fix_search_page_queries' ) );
add_filter( 'redirect_canonical', array( $this, '_fix_prevent_extra_redirect_single_pagination' ) );
// Auto Redirect Mobile Users
add_action( 'template_redirect', array( $this, 'auto_redirect_to_amp' ), 1 );
// Init BF JSON-LD
add_action( 'template_redirect', 'Better_AMP::init_json_ld', 1 );
$this->fix_front_page_display_options();
// Fire the modules
Better_Amp_Redirect_Router::Run();
} // apply_hooks
/**
* Get WordPress option
*
* @param string $option
* @param mixed $default
*
* @since 1.3.0
* @return mixed
*/
public static function get_option( $option, $default = false ) {
$tmp = isset( $GLOBALS['_amp_bypass_option'] ) ? $GLOBALS['_amp_bypass_option'] : false;
$GLOBALS['_amp_bypass_option'] = true;
$results = get_option( $option, $default );
$GLOBALS['_amp_bypass_option'] = $tmp;
return $results;
}
/**
* Fix front page display option to detect homepage
*/
public function fix_front_page_display_options() {
add_filter( 'pre_option_page_on_front', array( $this, '_return_zero_in_amp' ) );
add_filter( 'pre_option_show_on_front', array( $this, '_fix_show_on_front' ) );
}
/**
* Prevent redirect pages within single post
*
* @param $redirect
*
* @since 1.1
* @return bool
*/
public function _fix_prevent_extra_redirect_single_pagination( $redirect ) {
if ( $redirect && is_better_amp() && get_query_var( 'page' ) > 1 ) {
return false;
}
return $redirect;
}
public function admin_hooks() {
if ( ! is_admin() ) {
return;
}
if ( get_transient( 'better-amp-flush-rules' ) ) {
add_action( 'admin_init', 'flush_rewrite_rules' );
delete_transient( 'better-amp-flush-rules' );
}
add_action( 'admin_head', array( $this, 'admin_styles' ) );
add_action( 'admin_menu', array( $this, 'fix_admin_sub_menu' ), 999 );
}
/**
* Register rewrite rules and flush permalink in installation
*
* @since 1.0.0
*/
public function install() {
$this->add_rewrite();
set_transient( 'better-amp-flush-rules', true );
}
/**
* Check AMP version of the posts exists
*
* @since 1.1
* @return bool of exists
*/
public function amp_version_exists() {
static $filters;
if ( $this->is_amp_excluded_by_url() ) {
return apply_filters( 'better-amp/amp-version-exists', false );
}
if ( ! isset( $filters ) ) {
$filters = wp_parse_args(
apply_filters( 'better-amp/filter/config', array() ),
array(
'disabled_post_types' => array(),
'disabled_taxonomies' => array(),
'disabled_homepage' => false,
'disabled_search' => false,
)
);
}
if ( is_singular() ) {
$post_id = get_queried_object_id();
} elseif ( is_home() && better_amp_is_static_home_page() ) {
$post_id = intval( apply_filters( 'better-amp/template/page-on-front', 0 ) );
} else {
$post_id = 0;
}
if ( $post_id ) {
if ( get_post_meta( $post_id, 'disable-better-amp', true ) || isset( $this->excluded_posts_id[ $post_id ] ) ) {
return apply_filters( 'better-amp/amp-version-exists', false );
}
}
if ( empty( $filters ) ) {
return apply_filters( 'better-amp/amp-version-exists', true );
}
if ( is_home() || is_front_page() ) {
return apply_filters( 'better-amp/amp-version-exists', ! $filters['disabled_homepage'] );
}
if ( is_search() ) {
return apply_filters( 'better-amp/amp-version-exists', ! $filters['disabled_search'] );
}
if ( is_singular() ) {
return apply_filters( 'better-amp/amp-version-exists', ! in_array( get_queried_object()->post_type, $filters['disabled_post_types'] ) );
}
if ( is_post_type_archive() ) {
$queried_object = get_queried_object();
if ( $queried_object instanceof WP_Post_Type ) { # WP >= 4.6.0
$post_type = $queried_object->name;
} elseif ( $queried_object instanceof WP_Post ) { # WP < 4.6.0
$post_type = $queried_object->post_type;
} else {
return apply_filters( 'better-amp/amp-version-exists', false );
}
return apply_filters( 'better-amp/amp-version-exists', ! in_array( $post_type, $filters['disabled_post_types'] ) );
}
if ( is_tax() || is_category() || is_tag() ) {
return apply_filters( 'better-amp/amp-version-exists', ! in_array( get_queried_object()->taxonomy, $filters['disabled_taxonomies'] ) );
}
return apply_filters( 'better-amp/amp-version-exists', true );
}
/**
* Whether to check if current page has been marked as none-AMP version?
*
* @since 1.9.8
*
* @return bool
*/
protected function is_amp_excluded_by_url() {
if ( ! $excluded_patterns = better_amp_excluded_urls_format() ) {
return false;
}
// Get current page
$current_path = trim( str_replace( home_url(), '', better_amp_guess_none_amp_url() ), '/' );
foreach ( $excluded_patterns as $url_format ) {
if ( empty( $url_format ) ) {
continue;
}
$url_format = trim( $url_format, '/' ); // throw surrounded slash away
// Format given url to valid PCRE regex
$pattern = better_amp_transpile_text_to_pattern( $url_format, '#' );
$pattern = '#^/?' . $pattern . '/*$#i';
// Check if the given url is match with current page url path
if ( preg_match( $pattern, $current_path ) ) {
return true;
}
}
return false;
}
/**
* Callback: Prevent third party codes to change the main query on AMP version
*
* You can add action to 'pre_get_posts' with priority grater than 1000 to change it.
*
* Action: pre_get_posts
*
* @see isolate_pre_get_posts_end
*
* @since 1.0.0
*
* @param WP_Query $wp_query
*/
public function isolate_pre_get_posts_start( $wp_query ) {
global $better_amp_isolate_pre_get_posts;
if ( is_better_amp( $wp_query ) && ! is_admin() && $wp_query->is_main_query() ) {
$better_amp_isolate_pre_get_posts = $wp_query->query_vars;
}
}
/**
* Rollback the main query vars.
*
* @param WP_Query $wp_query
*
* @since 1.0.0
*
* @see isolate_pre_get_posts_end for more documentation
*
* Action: pre_get_posts
*/
public function isolate_pre_get_posts_end( &$wp_query ) {
global $better_amp_isolate_pre_get_posts;
if ( is_better_amp( $wp_query ) && ! is_admin() && $wp_query->is_main_query() ) {
if ( $better_amp_isolate_pre_get_posts ) {
$wp_query->query_vars = $better_amp_isolate_pre_get_posts;
unset( $better_amp_isolate_pre_get_posts );
}
}
}
/**
* Register missed hooks for supported plugins/themes to bypass isolation
*
* @see isolate_pre_get_posts_start
* @see isolate_pre_get_posts_end
*
* @since 1.1
*/
public function compatible_plugins_themes() {
if ( ! is_better_amp() ) {
return;
}
$priority = self::ISOLATE_QUERY_HOOK_PRIORITY + 1;
// WooCommerce compatibility
if ( class_exists( 'WooCommerce' ) ) {
$callback = array( WooCommerce::instance()->query, 'pre_get_posts' );
if ( is_callable( $callback ) ) {
add_action( 'pre_get_posts', $callback, $priority );
}
// WooCommerce didn't change main query in "shop" page
add_action( 'pre_get_posts', array( $this, '_fix_woocommerce_shop_page_query' ), $priority + 1 );
$this->excluded_posts_id[ wc_get_page_id( 'checkout' ) ] = true;
}
// BetterStudio themes compatibility
add_action( 'better-framework/menu/walker/init', array( $this, 'disable_bf_mega_menu' ) );
}
/**
* Fixes global WP_Query for shop pages in AMP!
*
* @param $q
*/
function _fix_woocommerce_shop_page_query( $q ) {
// We only want to affect the main query
if ( ! $q->is_main_query() ) {
return;
}
if ( isset( $q->queried_object->ID ) && $q->queried_object->ID === wc_get_page_id( 'shop' ) ) {
$q->set( 'post_type', 'product' );
$q->set( 'posts_per_page', 8 );
$q->set( 'page', '' );
$q->set( 'pagename', '' );
// Fix conditional Functions
$q->is_archive = true;
$q->is_post_type_archive = true;
$q->is_singular = false;
$q->is_page = false;
}
}
/**
* Disable BetterStudio themes mega menu in AMP pages
*
* @param BF_Menu_Walker $walker
*
* @since 1.1
*/
public function disable_bf_mega_menu( &$walker ) {
$fields = $walker->get_mega_menu_fields_id();
unset( $fields['mega_menu'] );
$walker->set_mega_menu_fields_id( $fields );
}
/**
* Callback: Add rewrite rules
* Action: init
*
* @since 1.0.0
*/
public function add_rewrite() {
better_amp_add_rewrite_startpoint( self::STARTPOINT, EP_ALL );
/**
* Automattic amp compatibility
*/
$amp_qv = defined( 'AMP_QUERY_VAR' ) ? AMP_QUERY_VAR : self::STARTPOINT;
better_amp_add_rewrite_endpoint( $amp_qv, EP_ALL );
}
/**
* Add a rewrite rule to detect site.com/amp/ requests
*
* @since 1.0.0
*
* @return array
*/
public function append_index_rewrite_rule() {
add_rewrite_rule( self::STARTPOINT . '/?$', "index.php?amp=index", 'top' );
}
/**
* Callback: Include AMP template file in AMP pages
* Action : template_include
*
* @param string $template_file_path original template file path
*
* @since 1.0.0
*
* @return string
*/
public function include_template_file( $template_file_path ) {
if ( ! is_better_amp() ) {
return $template_file_path;
}
$include = $this->template_loader();
if ( $include = apply_filters( 'better-amp/template/include', $include ) ) {
return $include;
} elseif ( current_user_can( 'switch_themes' ) ) {
wp_die( __( 'Better-AMP Theme Was Not Found!', 'better-amp' ) );
} else {
return BETTER_AMP_TPL_COMPAT_ABSPATH . '/no-template.php';
}
}
/**
* Include WooCommerce AMP templates in AMP pages
*
* @param string $located
* @param string $template_name
*
* @since 1.1
* @return string
*/
public function include_wc_template_file( $located, $template_name ) {
$template_name = 'woocommerce/' . ltrim( $template_name, '/' );
if ( $new_path = better_amp_locate_template( $template_name, false, false ) ) {
return $new_path;
}
return $located;
}
/**
* Replace amp comment file with theme file
*
* @param string $file
*
* @since 1.1
* @return string
*/
public function override_comments_template( $file ) {
if ( is_better_amp() ) {
if ( $path = better_amp_locate_template( basename( $file ) ) ) {
return $path;
}
}
return $file;
}
/**
* Get AMP template file base on page of WordPress
*
* @link https://developer.wordpress.org/themes/basics/template-hierarchy/
* @copyright credit goes to WordPress team @see wp-includes/template-loader.php
* @access private
*
* @since 1.0.0
*
* @return string
*/
protected function template_loader() {
if ( function_exists( 'is_embed' ) && is_embed() && $template = better_amp_embed_template() ) :
elseif ( function_exists( 'is_woocommerce' ) && is_woocommerce() && is_page( wc_get_page_id( 'shop' ) ) && $template = better_amp_locate_template( 'woocommerce.php' ) ) :
elseif ( is_404() && $template = better_amp_404_template() ) :
elseif ( is_search() && $template = better_amp_search_template() ) :
elseif ( better_amp_is_static_home_page() && $template = better_amp_static_home_page_template() ) :
$this->set_page_query( apply_filters( 'better-amp/template/page-on-front', 0 ) );
elseif ( is_front_page() && $template = better_amp_front_page_template() ) :
elseif ( is_home() && $template = better_amp_home_template() ) :
elseif ( is_post_type_archive() && $template = better_amp_post_type_archive_template() ) :
elseif ( is_tax() && $template = better_amp_taxonomy_template() ) :
elseif ( is_attachment() && $template = better_amp_attachment_template() ) :
remove_filter( 'the_content', 'prepend_attachment' );
elseif ( is_single() && $template = better_amp_single_template() ) :
elseif ( is_page() && $template = better_amp_page_template() ) :
elseif ( is_singular() && $template = better_amp_singular_template() ) :
elseif ( is_category() && $template = better_amp_category_template() ) :
elseif ( is_tag() && $template = better_amp_tag_template() ) :
elseif ( is_author() && $template = better_amp_author_template() ) :
elseif ( is_date() && $template = better_amp_date_template() ) :
elseif ( is_archive() && $template = better_amp_archive_template() ) :
elseif ( is_paged() && $template = better_amp_paged_template() ) :
else :
$template = better_amp_index_template();
endif;
return $template;
}
/**
* Include active template functions.php file if exits
*
* Callback: include
* action : after_setup_theme
*
* @since 1.0.0
*/
public function include_template_functions_php() {
if ( $theme_root = better_amp_get_template_directory() ) {
if ( file_exists( $theme_root . '/functions.php' ) ) {
include $theme_root . '/functions.php';
}
apply_filters( 'better-amp/template/init', $theme_root );
}
}
/**
* Callback: Include registered AMP components
* Action: init
*
* @since 1.0.0
*/
public function include_components() {
include BETTER_AMP_INC . 'components/class-better-amp-img-component.php';
include BETTER_AMP_INC . 'components/class-better-amp-iframe-component.php';
include BETTER_AMP_INC . 'components/class-better-amp-instagram-component.php';
include BETTER_AMP_INC . 'components/class-better-amp-carousel-component.php';
include BETTER_AMP_INC . 'components/class-better-amp-playbuzz-component.php';
}
/**
* Transforms HTML content to AMP content
*
* todo: Add file caching
*
* @param Better_AMP_HTML_Util $instance
* @param boolean $sanitize
*
* @since 1.0.0
*/
public function render_content( Better_AMP_HTML_Util $instance, $sanitize = false ) {
$this->call_components_method( 'render', $instance );
if ( $sanitize ) {
$sanitizer = new Better_AMP_Content_Sanitizer( $instance );
$sanitizer->sanitize();
}
} // render_content
/**
* Register an autoloader for Better AMP classes
*
* @since 1.0.0
*/
public function register_autoload() {
spl_autoload_register( array( __CLASS__, 'autoload_amp_classes' ) );
}
/**
* Autoload handler for better AMP classes only
*
* @param string $class_name class to include
*
* @since 1.0.0
*/
public static function autoload_amp_classes( $class_name ) {
if ( substr( $class_name, 0, 11 ) !== 'Better_AMP_' ) {
return;
}
$is_interface = substr( $class_name, - 10 ) === '_Interface';
$class_name_prefix = $is_interface ? 'interface-' : 'class-';
$sanitized_class_name = strtolower( $class_name );
$sanitized_class_name = str_replace( '_', '-', $sanitized_class_name );
// Remove interface suffix
if ( $is_interface ) {
$sanitized_class_name = substr( $sanitized_class_name, 0, - 10 );
}
$class_file = BETTER_AMP_INC . 'classes/' . $class_name_prefix . $sanitized_class_name . '.php';
if ( file_exists( $class_file ) ) {
require_once $class_file;
}
}
/**
* Transform HTML content to AMP version when AMP version requested
*
* @param string $content html
*
* @since 1.0.0
*
* @return string
*/
public function convert_content_to_amp( $content ) {
if ( is_better_amp() ) {
$content = $this->render_content( $content );
}
return $content;
} // convert_content_to_amp
/**
* Determines that method exists and is callable on object instance
*
* @param Better_AMP_Component $instance Live object of Better_AMP_Component
* @param string $method_name Method of object
* @param array $args
*
* @since 1.0.0
*
* @return bool
*/
private function _can_call_component_method( &$instance, &$method_name, &$args ) {
$return = is_callable( array( $instance, $method_name ) );
switch ( $method_name ) {
case 'enqueue_amp_scripts':
$return = $return && $instance->can_enqueue_scripts();
break;
}
return $return;
}
/**
* Fire specific method of all components
*
* @param string $method_name component method
*
* @param mixed $param
*
* @return mixed
* @since 1.0.0
*
*/
public function call_components_method( $method_name, $param = null ) {
global $better_amp_registered_components;
if ( ! $better_amp_registered_components ) {
return $param;
}
// collect and prepare method arguments
$args = func_get_args();
$args = array_slice( $args, 1 );
if ( ! isset( $args[0] ) ) {
$args[0] = null;
}
// iterate registered components and call method on them
foreach ( $better_amp_registered_components as $component ) {
$instance = Better_AMP_Component::instance( $component['component_class'] );
if ( $this->_can_call_component_method( $instance, $method_name, $args ) ) {
$args[0] = call_user_func_array( array( $instance, $method_name ), $args );
}
}
return $args[0];
}
/**
* Add components shortcode before do_shortcodes
*
* @param string $content
*
* @since 1.0.0
*
* @return string
*/
public function register_components_shortcodes( $content = '' ) {
if ( ! is_better_amp() ) {
return $content;
}
$this->call_components_method( 'register_shortcodes' );
return $content;
}
/**
* Callback: Fire head method of component for following purpose:
* 1) Component able to add_filter or add_action if needed
* 2) Create fresh instance of each component and cache
*
* Action : better-amp/template/head
*
* @since 1.0.0
*/
public function trigger_component_head() {
$this->call_components_method( 'head' );
}
/**
* Clean components instances and free up the memory
*
* @param string $content
*
* @since 1.0.0
*
* @return string
*/
public function component_actions_finished( $content = '' ) {
Better_AMP_Component::flush_instances();
return $content;
}
/**
* Append AMP components javascript if AMP version requested
*
* @since 1.0.0
*/
public function enqueue_components_scripts() {
$deps = array( 'ampproject' );
better_amp_enqueue_script( $deps[0], 'https://cdn.ampproject.org/v0.js' );
// Enqueues all needed scripts of components with 'ampproject' dependency
$this->call_components_method( 'enqueue_amp_scripts', $deps );
if ( current_theme_supports( 'better-amp-navigation' ) && current_theme_supports( 'better-amp-has-nav-child' ) ) {
better_amp_enqueue_script( 'amp-accordion', 'https://cdn.ampproject.org/v0/amp-accordion-0.1.js' );
}
if ( current_theme_supports( 'better-amp-form' ) ) {
better_amp_enqueue_script( 'amp-form', 'https://cdn.ampproject.org/v0/amp-form-0.1.js' );
}
}
/**
* Replaces all website internal links with AMP version
*
* @hooked wp
*
* @param WP $wp
*
* @since 1.0.0
* @return string
*/
public function replace_internal_links_with_amp_version( $wp ) {
if ( ! isset( $wp->query_vars['amp'] ) ) {
return;
}
add_filter( 'nav_menu_link_attributes', array( 'Better_AMP_Content_Sanitizer', 'replace_href_with_amp' ) );
add_filter( 'the_content', array( 'Better_AMP_Content_Sanitizer', 'transform_all_links_to_amp' ) );
add_filter( 'author_link', array( 'Better_AMP_Content_Sanitizer', 'transform_to_amp_url' ) );
add_filter( 'term_link', array( 'Better_AMP_Content_Sanitizer', 'transform_to_amp_url' ) );
add_filter( 'post_link', array( $this, 'transform_post_link_to_amp' ), 20, 2 );
add_filter( 'page_link', array( $this, 'transform_post_link_to_amp' ), 20, 2 );
add_filter( 'attachment_link', array( 'Better_AMP_Content_Sanitizer', 'transform_to_amp_url' ) );
add_filter( 'post_type_link', array( 'Better_AMP_Content_Sanitizer', 'transform_to_amp_url' ) );
}
/**
* Callback: Starts the collecting output to enable components to add style into head
* Print theme completely then fire better_amp_head() callbacks and append it before </head>
*
* Action : template_include
*
* @param string $template
*
* @since 1.0.0
* @return string
* @see buffer_better_amp_end
*
*/
public function buffer_better_amp_start( $template ) {
if ( is_better_amp() ) {
ob_start();
}
return $template;
}
/**
* Callback: Fire better_amp_head() and print buffered output
* Action : better-amp/template/footer
*
* @since 1.0.0
* @see buffer_better_amp_start
*
*/
public function buffer_better_amp_end() {
$content = ob_get_clean();
if ( ! better_amp_is_customize_preview() ) {
/**
* Convert output to valid amp html
*/
$instance = new Better_AMP_HTML_Util();
$instance->loadHTML( $content . '</body></html>', null, false );
$this->render_content( $instance, true ); // Convert HTML top amp html
// @see Better_AMP_Component::enqueue_amp_tags_script
$this->call_components_method( 'enqueue_amp_tags_script', $instance );
$content = $instance->saveHTML();
$instance = null;
}
if ( ! preg_match( '#^(.*?)(<\s*\/\s*head[^>]*> .+) $#isx', $content, $match ) ) {
echo $content;
return;
}
$content = null;
echo $match[1]; // markup upto </head> tag
do_action( 'better-amp/template/head-deferred' );
echo $match[2]; // markup </head> and <body>
}
/**
* Init metaboxes
*
* @since 1.0.0
*/
public function metaboxes() {
if ( is_admin() ) {
add_action( 'add_meta_boxes', array( $this, 'append_metaboxes' ) );
add_action( 'save_post', array( $this, 'save_metaboxes' ) );
}
}
/**
* Adds meta box for posts
*
* @since 1.0.0
*/
public function append_metaboxes() {
add_meta_box(
'better-amp-settings',
esc_html__( 'Better AMP Settings', 'better-amp' ),
array( $this, 'metabox_output' ),
array(
'post',
'page'
),
'side',
'low'
);
}
/**
* Prints post metabox
*
* @since 1.0.0
*
* @param $post
*/
public function metabox_output( $post ) {
?>
<div class="inside">
<p>
<label for="better-amp-enable">
<?php _e( 'Disable amp version', 'better-amp' ) ?>
</label>
<input type="checkbox" name="better-amp-enable" id="better-amp-enable"
value="1" <?php checked( true, get_post_meta( $post->ID, 'disable-better-amp', true ) ) ?>>
</p>
</div>
<?php
}
/**
* Callback to save post metabox
*
* @since 1.0.0
*
* @param $post_id
*/
public function save_metaboxes( $post_id ) {
if ( $_SERVER['REQUEST_METHOD'] !== 'POST' ) {
return;
}
if ( empty( $_POST['better-amp-enable'] ) ) {
delete_post_meta( $post_id, 'disable-better-amp' );
} else {
update_post_meta( $post_id, 'disable-better-amp', '1' );
}
}
/**
* Admin functionality
*
* @since 1.0.0
*/
public function admin_init() {
if ( ! is_admin() ) {
return;
}
if ( ! class_exists( 'Redux' ) ) {
require_once BETTER_AMP_INC . 'redux/redux-framework.php';
}
require_once BETTER_AMP_INC . 'admin-fields.php';
}
/**
* Fix to change first menu name!
*
* @since 1.0.0
*/
public function fix_admin_sub_menu() {
global $submenu;
if ( isset( $submenu['better-amp-translation'][0] ) ) {
$submenu['better-amp-translation'][0][0] = __( 'Translation', 'better-amp' );
} elseif ( isset( $submenu['better-amp-translation'][1] ) ) {
$submenu['better-amp-translation'][1][0] = __( 'Translation', 'better-amp' );
}
}
/**
* Handy fix for changing search query
*
* @param $q
*
* @since 1.0.0
* @return mixed
*/
public function fix_search_page_queries( $q ) {
if ( ! empty( $q['amp'] ) && ! empty( $q['s'] ) ) {
$q['post_type'] = array( 'post' );
}
return $q;
}
/**
* Change most popular cache plugins in amp version to compatible with it
*
* @since 1.0.0
*/
public function plugins_compatibility() {
if ( ! is_better_amp() ) {
return;
}
// Override WooCommerce template files
add_action( 'wc_get_template', array( $this, 'include_wc_template_file' ), 9999, 2 );
/**
* W3 total cache
*/
add_filter( 'w3tc_minify_js_enable', '__return_false' );
add_filter( 'w3tc_minify_css_enable', '__return_false' );
/**
* WP Rocket
*/
if ( defined( 'WP_ROCKET_VERSION' ) ) {
if ( ! defined( 'DONOTMINIFYCSS' ) ) {
define( 'DONOTMINIFYCSS', true );
}
if ( ! defined( 'DONOTMINIFYJS' ) ) {
define( 'DONOTMINIFYJS', true );
}
// Disable WP Rocket lazy load
add_filter( 'do_rocket_lazyload', '__return_false', PHP_INT_MAX );
add_filter( 'do_rocket_lazyload_iframes', '__return_false', PHP_INT_MAX );
// Disable HTTP protocol removing on script, link, img, srcset and form tags.
remove_filter( 'rocket_buffer', '__rocket_protocol_rewrite', PHP_INT_MAX );
remove_filter( 'wp_calculate_image_srcset', '__rocket_protocol_rewrite_srcset', PHP_INT_MAX );
// Disable Concatenate Google Fonts
add_filter( 'get_rocket_option_minify_google_fonts', '__return_false', PHP_INT_MAX );
// Disable CSS & JS magnification
add_filter( 'get_rocket_option_minify_js', '__return_false', PHP_INT_MAX );
add_filter( 'get_rocket_option_minify_css', '__return_false', PHP_INT_MAX );
}
/**
* WP Speed of Light
*
* https://wordpress.org/plugins-wp/wp-speed-of-light/
*/
if ( defined( 'WPSOL_VERSION' ) ) {
add_filter( 'wpsol_filter_js_noptimize', '__return_true', PHP_INT_MAX );
add_filter( 'wpsol_filter_css_noptimize', '__return_true', PHP_INT_MAX );
}
/**
* Lazy Load
* https://wordpress.org/plugins/lazy-load/
*/
if ( class_exists( 'LazyLoad_Images' ) ) {
add_filter( 'lazyload_is_enabled', '__return_false', PHP_INT_MAX );
}
/**
* Lazy Load XT
* https://wordpress.org/plugins/lazy-load-xt/
*/
if ( class_exists( 'Image_Lazy_Load' ) ) {
global $lazyloadxt;
if ( is_object( $lazyloadxt ) ) {
remove_filter( 'the_content', array( $lazyloadxt, 'filter_html' ) );
remove_filter( 'widget_text', array( $lazyloadxt, 'filter_html' ) );
remove_filter( 'post_thumbnail_html', array( $lazyloadxt, 'filter_html' ) );
remove_filter( 'get_avatar', array( $lazyloadxt, 'filter_html' ) );
}
}
/***
* Facebook Comments Plugin
* https://wordpress.org/plugins/facebook-comments-plugin/
*/
if ( function_exists( 'fbcommentshortcode' ) ) {
remove_action( 'wp_footer', 'fbmlsetup', 100 );
remove_filter( 'the_content', 'fbcommentbox', 100 );
remove_filter( 'widget_text', 'do_shortcode' );
}
/***
* Ultimate Tweaker
* https://ultimate-tweaker.com/
*/
if ( class_exists( 'ultimate_tweaker_Plugin_File' ) && defined( 'UT_VERSION' ) ) {
bf_remove_class_filter( 'post_thumbnail_html', 'OT_media_image_no_width_height_Tweak', '_do', 10 );
bf_remove_class_filter( 'image_send_to_editor', 'OT_media_image_no_width_height_Tweak', '_do', 10 );
}
/**
* WPO Tweaks
*
* https://servicios.ayudawp.com/
*/
if ( function_exists( 'wpo_tweaks_init' ) ) {
remove_filter( 'script_loader_tag', 'wpo_defer_parsing_of_js' );
}
}
/**
* Just return false in amp version
*
* @param bool $current
*
* @since 1.0.0
* @return bool
*/
public function _return_false_in_amp( $current ) {
if ( is_better_amp() ) {
return false;
}
return $current;
}
/**
* Just return zero in amp version
*
* @param mixed $current
*
* @return mixed
*/
public function _return_zero_in_amp( $current ) {
if ( is_better_amp() && empty( $GLOBALS['_amp_bypass_option'] ) ) {
return 0;
}
return $current;
}
/**
* Just return 'posts' string in amp version
*
* @param mixed $current
*
* @return mixed
*/
public function _fix_show_on_front( $current ) {
if ( is_better_amp() && empty( $GLOBALS['_amp_bypass_option'] ) ) {
return 'posts';
}
return $current;
}
/**
* Setup page query
*
* @param $page_id
*/
public function set_page_query( $page_id ) {
query_posts( 'page_id=' . $page_id . '&=' . get_query_var( 'amp' ) );
}
/**
* Transform allowed posts url to amp
*
* @param string $url The post's permalink.
* @param WP_Post|int $post The post object/id of the post.
*
* @since 1.1
* @return string
*/
public function transform_post_link_to_amp( $url, $post ) {
$post_id = isset( $post->ID ) ? $post->ID : $post;
if ( 'page' == $this->get_option( 'show_on_front' ) && $post_id == $this->get_option( 'page_on_front' ) ) {
$url = home_url( '/' );
}
if ( isset( $this->excluded_posts_id[ $post_id ] ) ) {
return $url;
}
return Better_AMP_Content_Sanitizer::transform_to_amp_url( $url );
}
/**
* Fix admin menu margins for better UX
*/
public function admin_styles() {
?>
<style>
.toplevel_page_better-amp-translation .wp-menu-image img {
width: 12px;
padding-top: 7px !important;
}
#adminmenu li#toplevel_page_better-studio-better-ads-manager,
#adminmenu .toplevel_page_better-amp-translation {
margin-top: 10px;
margin-bottom: 10px;
}
#adminmenu li[id^="toplevel_page_better-studio"] + li#toplevel_page_better-studio-better-ads-manager,
#adminmenu li[id^="toplevel_page_better-studio"] + .toplevel_page_better-amp-translation {
margin-top: -10px;
margin-bottom: 10px;
}
</style>
<?php
}
/**
* Get requested page url
*
* @since 1.6.0
* @return string
*/
public static function get_requested_page_url() {
if ( isset( $_SERVER['HTTP_HOST'] ) ) {
$requested_url = is_ssl() ? 'https://' : 'http://';
$requested_url .= $_SERVER['HTTP_HOST'];
$requested_url .= $_SERVER['REQUEST_URI'];
return $requested_url;
}
return '';
}
/**
* Print script to redirect mobile devices to amp version
*
* @since 1.6.0
*/
public function print_mobile_redirect_script() {
$requested_url = self::get_requested_page_url();
$amp_permalink = Better_AMP_Content_Sanitizer::transform_to_amp_url( $requested_url );
if ( ! $requested_url || ! $amp_permalink || $amp_permalink === $requested_url ) {
return;
}
$script = file_get_contents( better_amp_min_suffix( BETTER_AMP_PATH . 'js/mobile_redirect', '.js' ) );
$script = str_replace( '%%amp_permalink%%', $amp_permalink, $script );
?>
<script><?php echo $script; ?></script><?php
}
/**
* is any caching plugin install on this WordPress installation
*
* @since 1.6.0
* @return bool
*/
public function have_cache_plugin() {
if ( defined( 'WP_CACHE' ) && WP_CACHE ) {
return true;
}
// Fix for "WP Fastest Cache" plugin
if ( $plugins = array_flip( wp_get_active_and_valid_plugins() ) ) {
return isset( $plugins[ WP_PLUGIN_DIR . '/wp-fastest-cache/wpFastestCache.php' ] );
}
return false;
}
/**
* Redirect users to amp version of the page automatically
*
* @since 1.6.0
*/
public function auto_redirect_to_amp() {
if ( is_better_amp() ) {
return;
}
if ( ! apply_filters( 'better-amp/template/auto-redirect', false ) ) {
return;
}
if ( ! empty( $_GET['bamp-skip-redirect'] ) || ! empty( $_COOKIE['bamp-skip-redirect'] ) ) {
if ( ! isset( $_COOKIE['bamp-skip-redirect'] ) ) {
setcookie( 'bamp-skip-redirect', true, time() + DAY_IN_SECONDS, '/' );
}
return;
} else {
if ( isset( $_COOKIE['bamp-skip-redirect'] ) ) {
unset( $_COOKIE['bamp-skip-redirect'] );
}
}
// if post have not AMP version
if ( ! $this->amp_version_exists() ) {
return;
}
if ( wp_is_mobile() ) {
$requested_url = self::get_requested_page_url();
$amp_permalink = Better_AMP_Content_Sanitizer::transform_to_amp_url( $requested_url );
if ( $requested_url && $amp_permalink && $amp_permalink !== $requested_url ) {
wp_redirect( $amp_permalink );
exit;
}
} elseif ( Better_AMP::have_cache_plugin() ) {
// Adds advanced javascript code to page to redirect page in front end!
// Last and safest way to redirect but it will have a little delay!
add_action( 'wp_print_scripts', array( $this, 'print_mobile_redirect_script' ) );
}
}
/**
* Initialize BF JSON-LD
*/
public static function init_json_ld() {
if ( ! is_better_amp() ) {
return;
}
//
// Include BF_Json_LD_Generator if was not included inside BF
//
if ( ! class_exists( 'BF_Json_LD_Generator' ) ) {
include BETTER_AMP_PATH . 'includes/libs/class-bf-json-ld-generator.php';
}
// Config BF JSON-LD
add_filter( 'better-framework/json-ld/config', 'Better_AMP::config_json_ld', 15 );
}
/**
* Configurations of JSON-LD
*
* @param $config
*
* @return mixed
*/
public static function config_json_ld( $config ) {
$branding = better_amp_get_branding_info();
if ( ! empty( $branding['logo']['src'] ) ) {
$config['logo'] = $branding['logo']['src'];
}
return $config;
}
}