-
-
Notifications
You must be signed in to change notification settings - Fork 82
/
manifest.php
353 lines (292 loc) · 9.7 KB
/
manifest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
<?php
/**
* Manifest related functions of SuperPWA
*
* @since 1.0
*
* @function superpwa_manifest() Manifest filename, absolute path and link
* @function superpwa_generate_manifest() Generate and write manifest
* @function superpwa_add_manifest_to_wp_head() Add manifest to header (wp_head)
* @function superpwa_register_service_worker() Register service worker in the footer (wp_footer)
* @function superpwa_delete_manifest() Delete manifest
* @function superpwa_get_pwa_icons() Get PWA Icons
* @function superpwa_get_scope() Get navigation scope of PWA
* @function superpwa_get_orientation() Get orientation of PWA
* @function superpwa_get_display() Get display of PWA
*/
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) exit;
/**
* Returns the Manifest filename.
*
* @since 2.0
*
* @return string
*/
function superpwa_get_manifest_filename() {
return 'superpwa-manifest' . superpwa_multisite_filename_postfix() . '.json';
}
/**
* Manifest filename, absolute path and link
*
* For Multisite compatibility. Used to be constants defined in superpwa.php
* On a multisite, each sub-site needs a different manifest file.
*
* @uses superpwa_get_manifest_filename()
*
* @param $arg filename for manifest filename (replaces SUPERPWA_MANIFEST_FILENAME)
* abs for absolute path to manifest (replaces SUPERPWA_MANIFEST_ABS)
* src for link to manifest (replaces SUPERPWA_MANIFEST_SRC). Default value
*
* @return String filename, absolute path or link to manifest.
*
* @since 1.6
* @since 2.0 src uses home_url instead of network_site_url since manifest is no longer in the root folder.
*/
function superpwa_manifest( $arg = 'src' ) {
$manifest_filename = superpwa_get_manifest_filename();
switch ( $arg ) {
// TODO: Case `filename` can be deprecated in favor of @see superpwa_get_manifest_filename().
// Name of Manifest file
case 'filename':
return $manifest_filename;
break;
/**
* Absolute path to manifest.
*
* Note: @since 2.0 manifest is no longer a physical file and absolute path doesn't make sense.
* Also using home_url instead of network_site_url in "src" in 2.0 changes the apparent location of the file.
* However, absolute path is preserved at the "old" location, so that phyiscal files can be deleted when upgrading from pre-2.0 versions.
*
* Since static files are being used in conditions where dynamic files are not possible, this path
* pointing to the root folder of WordPress is still useful.
*/
case 'abs':
return trailingslashit( ABSPATH ) . $manifest_filename;
break;
// Link to manifest
case 'src':
default:
// Get Settings
$settings = superpwa_get_settings();
/**
* For static file, return site_url and network_site_url
*
* Static files are generated in the root directory.
* The site_url template tag retrieves the site url for the
* current site (where the WordPress core files reside).
*/
if ( $settings['is_static_manifest'] === 1 ) {
return trailingslashit( network_site_url() ) . $manifest_filename;
}
// For dynamic files, return the home_url
return home_url( '/' ) . $manifest_filename;
break;
}
}
/**
* Returns the Manifest template.
*
* @author Maria Daniel Deepak <daniel@danieldeepak.com>
*
* @return array
*
* @since 2.0 Replaces superpwa_generate_manifest()
* @since 2.0 Added display
*/
function superpwa_manifest_template() {
// Get Settings
$settings = superpwa_get_settings();
$manifest = array();
$manifest['name'] = $settings['app_name'];
$manifest['short_name'] = $settings['app_short_name'];
// Description
if ( isset( $settings['description'] ) && ! empty( $settings['description'] ) ) {
$manifest['description'] = $settings['description'];
}
$manifest['icons'] = superpwa_get_pwa_icons();
$manifest['background_color'] = $settings['background_color'];
$manifest['theme_color'] = $settings['theme_color'];
$manifest['display'] = superpwa_get_display();
$manifest['orientation'] = superpwa_get_orientation();
$manifest['start_url'] = superpwa_get_start_url( true );
$manifest['scope'] = superpwa_get_scope();
/**
* Values that go in to Manifest JSON.
*
* The Web app manifest is a simple JSON file that tells the browser about your web application.
*
* @param array $manifest
*/
return apply_filters( 'superpwa_manifest', $manifest );
}
/**
* Generate and write manifest into WordPress root folder
*
* Starting with 2.0, files are only generated if dynamic files are not possible.
* Some webserver configurations does not load WordPress and attempts to server files directly
* from the server. This returns 404 when files do not exist physically.
*
* @return (boolean) true on success, false on failure.
*
* @author Arun Basil Lal
* @author Maria Daniel Deepak <daniel@danieldeepak.com>
*
* @since 1.0
* @since 1.3 Added support for 512x512 icon.
* @since 1.4 Added orientation and scope.
* @since 1.5 Added gcm_sender_id
* @since 1.6 Added description
* @since 1.8 Removed gcm_sender_id and introduced filter superpwa_manifest. gcm_sender_id is added in /3rd-party/onesignal.php
* @since 2.0 Deprecated since Manifest is generated on the fly {@see superpwa_generate_sw_and_manifest_on_fly()}.
* @since 2.0.1 No longer deprecated since physical files are now generated in certain cases. See funtion description.
*/
function superpwa_generate_manifest() {
// Delete manifest if it exists.
superpwa_delete_manifest();
// Get Settings
$settings = superpwa_get_settings();
// Return true if dynamic file returns a 200 response.
if ( superpwa_file_exists( home_url( '/' ) . superpwa_get_manifest_filename() ) && defined( 'WP_CACHE' ) && ! WP_CACHE ) {
// set file status as dynamic file in database.
$settings['is_static_manifest'] = 0;
// Write settings back to database.
update_option( 'superpwa_settings', $settings );
return true;
}
// Write the manfiest to disk.
if ( superpwa_put_contents( superpwa_manifest( 'abs' ), json_encode( superpwa_manifest_template() ) ) ) {
// set file status as satic file in database.
$settings['is_static_manifest'] = 1;
// Write settings back to database.
update_option( 'superpwa_settings', $settings );
return true;
}
return false;
}
/**
* Add manifest to header (wp_head)
*
* @since 1.0
* @since 1.8 Introduced filter superpwa_wp_head_tags
* @since 1.9 Introduced filter superpwa_add_theme_color
*/
function superpwa_add_manifest_to_wp_head() {
$tags = '<!-- Manifest added by SuperPWA - Progressive Web Apps Plugin For WordPress -->' . PHP_EOL;
$tags .= '<link rel="manifest" href="'. parse_url( superpwa_manifest( 'src' ), PHP_URL_PATH ) . '">' . PHP_EOL;
// theme-color meta tag
if ( apply_filters( 'superpwa_add_theme_color', true ) ) {
// Get Settings
$settings = superpwa_get_settings();
$tags .= '<meta name="theme-color" content="'. $settings['theme_color'] .'">' . PHP_EOL;
}
$tags = apply_filters( 'superpwa_wp_head_tags', $tags );
$tags .= '<!-- / SuperPWA.com -->' . PHP_EOL;
echo $tags;
}
add_action( 'wp_head', 'superpwa_add_manifest_to_wp_head', 0 );
/**
* Delete manifest
*
* @return (boolean) true on success, false on failure
*
* @author Arun Basil Lal
*
* @since 1.0
*/
function superpwa_delete_manifest() {
return superpwa_delete( superpwa_manifest( 'abs' ) );
}
/**
* Get PWA Icons
*
* @return array An array of icons to be used as the application icons and splash screen icons
*
* @author Jose Varghese
* @since 1.3
* @since 2.1.1 Added support for Maskable Icons
*
*/
function superpwa_get_pwa_icons() {
// Get settings
$settings = superpwa_get_settings();
// Application icon
$icons_array[] = array(
'src' => $settings['icon'],
'sizes' => '192x192', // must be 192x192. Todo: use getimagesize($settings['icon'])[0].'x'.getimagesize($settings['icon'])[1] in the future
'type' => 'image/png', // must be image/png. Todo: use getimagesize($settings['icon'])['mime']
'purpose'=> 'any maskable', // any maskable to support adaptive icons
);
// Splash screen icon - Added since 1.3
if ( @$settings['splash_icon'] != '' ) {
$icons_array[] = array(
'src' => $settings['splash_icon'],
'sizes' => '512x512', // must be 512x512.
'type' => 'image/png', // must be image/png
);
}
return $icons_array;
}
/**
* Get navigation scope of PWA
*
* @return string Relative path to the folder where WordPress is installed. Same folder as manifest and wp-config.php
* @since 1.4
*/
function superpwa_get_scope() {
return parse_url( trailingslashit( superpwa_get_bloginfo( 'sw' ) ), PHP_URL_PATH );
}
/**
* Get orientation of PWA
*
* @return string Orientation of PWA as set in the plugin settings.
* @since 1.4
*/
function superpwa_get_orientation() {
// Get Settings
$settings = superpwa_get_settings();
$orientation = isset( $settings['orientation'] ) ? $settings['orientation'] : 0;
switch ( $orientation ) {
case 0:
return 'any';
break;
case 1:
return 'portrait';
break;
case 2:
return 'landscape';
break;
default:
return 'any';
}
}
/**
* Get display of PWA
*
* @return (string) Display of PWA as set in the plugin settings.
*
* @author Jose Varghese
*
* @since 2.0
*/
function superpwa_get_display() {
// Get Settings
$settings = superpwa_get_settings();
$display = isset( $settings['display'] ) ? $settings['display'] : 1;
switch ( $display ) {
case 0:
return 'fullscreen';
break;
case 1:
return 'standalone';
break;
case 2:
return 'minimal-ui';
break;
case 3:
return 'browser';
break;
default:
return 'standalone';
}
}