diff options
Diffstat (limited to 'plugins/jetpack/modules/pwa/class.jetpack-pwa-manifest.php')
-rw-r--r-- | plugins/jetpack/modules/pwa/class.jetpack-pwa-manifest.php | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/pwa/class.jetpack-pwa-manifest.php b/plugins/jetpack/modules/pwa/class.jetpack-pwa-manifest.php new file mode 100644 index 00000000..c294c2d0 --- /dev/null +++ b/plugins/jetpack/modules/pwa/class.jetpack-pwa-manifest.php @@ -0,0 +1,95 @@ +<?php + +class Jetpack_PWA_Manifest { + /** + * @var Jetpack_PWA_Manifest + */ + private static $__instance = null; + + /** + * When this query var is present, display the PWA manifest. + * + * @var string + */ + const PWA_MANIFEST_QUERY_VAR = 'jetpack_app_manifest'; + + /** + * Singleton implementation + * + * @return Jetpack_PWA_Manifest + */ + public static function instance() { + if ( is_null( self::$__instance ) ) { + self::$__instance = new Jetpack_PWA_Manifest; + } + + return self::$__instance; + } + + /** + * Registers actions the first time that instance() is called. + */ + private function __construct() { + add_action( 'wp_head', array( $this, 'render_manifest_link' ) ); + add_action( 'amp_post_template_head', array( $this, 'render_manifest_link' ) ); + add_action( 'template_redirect', array( $this, 'render_manifest_json' ), 2 ); + } + + function render_manifest_link() { + ?> + <link rel="manifest" href="<?php echo esc_url_raw( $this->get_manifest_url() ); ?>"> + <meta name="theme-color" content="<?php echo esc_attr( Jetpack_PWA_Helpers::get_theme_color() ); ?>"> + <?php + } + + public function get_manifest_url() { + return add_query_arg( + self::PWA_MANIFEST_QUERY_VAR, '1', home_url() + ); + } + + function render_manifest_json() { + // Do not load manifest in multiple locations + if ( is_front_page() && isset( $_GET[ self::PWA_MANIFEST_QUERY_VAR ] ) && $_GET[ self::PWA_MANIFEST_QUERY_VAR ] ) { + @ini_set( 'display_errors', false ); // Display errors can cause the XML to be not well formed. + + $theme_color = Jetpack_PWA_Helpers::get_theme_color(); + + $manifest = array( + 'name' => get_bloginfo( 'name' ), + 'start_url' => get_home_url(), + 'short_name' => substr( get_bloginfo( 'name' ), 0, 12 ), + 'display' => 'standalone', + 'background_color' => $theme_color, + 'theme_color' => $theme_color, + ); + + if ( $description = get_bloginfo( 'description' ) ) { + $manifest['description'] = $description; + } + + $manifest['icons'] = array_map( + array( $this, 'build_icon_object' ), + Jetpack_PWA_Helpers::get_default_manifest_icon_sizes() + ); + + /** + * Allow overriding the manifest. + * + * @since 5.6.0 + * + * @param array $manifest + */ + $manifest = apply_filters( 'jetpack_pwa_manifest', $manifest ); + + wp_send_json( $manifest ); + } + } + + function build_icon_object( $size ) { + return array( + 'src' => Jetpack_PWA_Helpers::site_icon_url( $size ), + 'sizes' => sprintf( '%1$dx%1$d', $size ), + ); + } +} |