1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* This is Calypso skin of the wp-admin interface that is conditionally triggered via the ?calypsoify=1 param. |
4
|
|
|
* Ported from an internal Automattic plugin. |
5
|
|
|
*/ |
6
|
|
|
class Jetpack_Calypsoify { |
7
|
|
|
|
8
|
|
|
/** |
9
|
|
|
* Singleton instance of `Jetpack_Calypsoify`. |
10
|
|
|
* |
11
|
|
|
* @var object |
12
|
|
|
*/ |
13
|
|
|
public static $instance = false; |
14
|
|
|
|
15
|
|
|
/** |
16
|
|
|
* Is Calypsoify enabled, based on any value of `calypsoify` user meta. |
17
|
|
|
* |
18
|
|
|
* @var bool |
19
|
|
|
*/ |
20
|
|
|
public $is_calypsoify_enabled = false; |
21
|
|
|
|
22
|
|
|
private function __construct() { |
23
|
|
|
add_action( 'wp_loaded', array( $this, 'setup' ) ); |
24
|
|
|
} |
25
|
|
|
|
26
|
|
|
public static function getInstance() { |
27
|
|
|
if ( ! self::$instance ) { |
28
|
|
|
self::$instance = new self(); |
29
|
|
|
} |
30
|
|
|
|
31
|
|
|
return self::$instance; |
32
|
|
|
} |
33
|
|
|
|
34
|
|
|
public function setup() { |
35
|
|
|
$this->is_calypsoify_enabled = 1 == (int) get_user_meta( get_current_user_id(), 'calypsoify', true ); |
36
|
|
|
add_action( 'admin_init', array( $this, 'check_param' ), 4 ); |
37
|
|
|
|
38
|
|
|
if ( $this->is_calypsoify_enabled ) { |
39
|
|
|
add_action( 'admin_init', array( $this, 'setup_admin' ), 6 ); |
40
|
|
|
add_action( 'admin_menu', array( $this, 'remove_core_menus' ), 100 ); |
41
|
|
|
add_action( 'admin_menu', array( $this, 'add_custom_menus' ), 101 ); |
42
|
|
|
} |
43
|
|
|
|
44
|
|
|
// Make this always available -- in case calypsoify gets toggled off. |
45
|
|
|
add_action( 'wp_ajax_jetpack_toggle_autoupdate', array( $this, 'jetpack_toggle_autoupdate' ) ); |
46
|
|
|
add_filter( 'handle_bulk_actions-plugins', array( $this, 'handle_bulk_actions_plugins' ), 10, 3 ); |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
public function setup_admin() { |
50
|
|
|
// Masterbar is currently required for this to work properly. Mock the instance of it |
51
|
|
|
if ( ! Jetpack::is_module_active( 'masterbar' ) ) { |
52
|
|
|
$this->mock_masterbar_activation(); |
53
|
|
|
} |
54
|
|
|
|
55
|
|
|
if ( $this->is_page_gutenberg() ) { |
56
|
|
|
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_for_gutenberg' ), 100 ); |
57
|
|
|
return; |
58
|
|
|
} |
59
|
|
|
|
60
|
|
|
add_action( 'admin_init', array( $this, 'check_page' ) ); |
61
|
|
|
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 100 ); |
62
|
|
|
add_action( 'in_admin_header', array( $this, 'insert_sidebar_html' ) ); |
63
|
|
|
add_action( 'wp_before_admin_bar_render', array( $this, 'modify_masterbar' ), 100000 ); |
64
|
|
|
|
65
|
|
|
add_filter( 'get_user_option_admin_color', array( $this, 'admin_color_override' ) ); |
66
|
|
|
|
67
|
|
|
add_action( 'manage_plugins_columns', array( $this, 'manage_plugins_columns_header' ) ); |
68
|
|
|
add_action( 'manage_plugins_custom_column', array( $this, 'manage_plugins_custom_column' ), 10, 2 ); |
69
|
|
|
add_filter( 'bulk_actions-plugins', array( $this, 'bulk_actions_plugins' ) ); |
70
|
|
|
|
71
|
|
|
if ( 'plugins.php' === basename( $_SERVER['PHP_SELF'] ) ) { |
72
|
|
|
add_action( 'admin_notices', array( $this, 'plugins_admin_notices' ) ); |
73
|
|
|
} |
74
|
|
|
} |
75
|
|
|
|
76
|
|
|
public function manage_plugins_columns_header( $columns ) { |
77
|
|
|
if ( current_user_can( 'jetpack_manage_autoupdates' ) ) { |
78
|
|
|
$columns['autoupdate'] = __( 'Automatic Update', 'jetpack' ); |
79
|
|
|
} |
80
|
|
|
return $columns; |
81
|
|
|
} |
82
|
|
|
|
83
|
|
|
public function manage_plugins_custom_column( $column_name, $slug ) { |
84
|
|
|
static $repo_plugins = array(); |
85
|
|
|
|
86
|
|
|
if ( ! current_user_can( 'jetpack_manage_autoupdates' ) ) { |
87
|
|
|
return; |
88
|
|
|
} |
89
|
|
|
|
90
|
|
|
if ( empty( $repo_plugins ) ) { |
91
|
|
|
$repo_plugins = self::get_dotorg_repo_plugins(); |
92
|
|
|
} |
93
|
|
|
|
94
|
|
|
$autoupdating_plugins = Jetpack_Options::get_option( 'autoupdate_plugins', array() ); |
95
|
|
|
// $autoupdating_plugins_translations = Jetpack_Options::get_option( 'autoupdate_plugins_translations', array() ); |
96
|
|
|
if ( 'autoupdate' === $column_name ) { |
97
|
|
|
if ( ! in_array( $slug, $repo_plugins ) ) { |
98
|
|
|
return; |
99
|
|
|
} |
100
|
|
|
// Shamelessly swiped from https://github.com/Automattic/wp-calypso/blob/59bdfeeb97eda4266ad39410cb0a074d2c88dbc8/client/components/forms/form-toggle |
101
|
|
|
?> |
102
|
|
|
|
103
|
|
|
<span class="form-toggle__wrapper"> |
104
|
|
|
<input |
105
|
|
|
id="autoupdate_plugin-toggle-<?php echo esc_attr( $slug ) ?>" |
106
|
|
|
name="autoupdate_plugins[<?php echo esc_attr( $slug ) ?>]" |
107
|
|
|
value="autoupdate" |
108
|
|
|
class="form-toggle autoupdate-toggle" |
109
|
|
|
type="checkbox" |
110
|
|
|
<?php checked( in_array( $slug, $autoupdating_plugins ) ); ?> |
111
|
|
|
readonly |
112
|
|
|
data-slug="<?php echo esc_attr( $slug ); ?>" |
113
|
|
|
/> |
114
|
|
|
<label class="form-toggle__label" for="autoupdate_plugin-toggle-<?php echo esc_attr( $slug ) ?>"> |
115
|
|
|
<span class="form-toggle__switch" role="checkbox"></span> |
116
|
|
|
<span class="form-toggle__label-content"><?php /* */ ?></span> |
117
|
|
|
</label> |
118
|
|
|
</span> |
119
|
|
|
|
120
|
|
|
<?php |
121
|
|
|
} |
122
|
|
|
} |
123
|
|
|
|
124
|
|
|
public static function get_dotorg_repo_plugins() { |
125
|
|
|
$plugins = get_site_transient( 'update_plugins' ); |
126
|
|
|
return array_merge( array_keys( $plugins->response ), array_keys( $plugins->no_update ) ); |
127
|
|
|
} |
128
|
|
|
|
129
|
|
|
public function bulk_actions_plugins( $bulk_actions ) { |
130
|
|
|
$bulk_actions['jetpack_enable_plugin_autoupdates'] = __( 'Enable Automatic Updates', 'jetpack' ); |
131
|
|
|
$bulk_actions['jetpack_disable_plugin_autoupdates'] = __( 'Disable Automatic Updates', 'jetpack' ); |
132
|
|
|
return $bulk_actions; |
133
|
|
|
} |
134
|
|
|
|
135
|
|
|
public function handle_bulk_actions_plugins( $redirect_to, $action, $slugs ) { |
136
|
|
|
$redirect_to = remove_query_arg( array( 'jetpack_enable_plugin_autoupdates', 'jetpack_disable_plugin_autoupdates' ), $redirect_to ); |
137
|
|
|
if ( in_array( $action, array( 'jetpack_enable_plugin_autoupdates', 'jetpack_disable_plugin_autoupdates' ) ) ) { |
138
|
|
|
$list = Jetpack_Options::get_option( 'autoupdate_plugins', array() ); |
139
|
|
|
$initial_qty = sizeof( $list ); |
140
|
|
|
|
141
|
|
|
if ( 'jetpack_enable_plugin_autoupdates' === $action ) { |
142
|
|
|
$list = array_unique( array_merge( $list, $slugs ) ); |
143
|
|
|
} elseif ( 'jetpack_disable_plugin_autoupdates' === $action ) { |
144
|
|
|
$list = array_diff( $list, $slugs ); |
145
|
|
|
} |
146
|
|
|
|
147
|
|
|
Jetpack_Options::update_option( 'autoupdate_plugins', $list ); |
148
|
|
|
$redirect_to = add_query_arg( $action, absint( sizeof( $list ) - $initial_qty ), $redirect_to ); |
149
|
|
|
} |
150
|
|
|
return $redirect_to; |
151
|
|
|
} |
152
|
|
|
|
153
|
|
|
public function plugins_admin_notices() { |
154
|
|
|
if ( ! empty( $_GET['jetpack_enable_plugin_autoupdates'] ) ) { |
155
|
|
|
$qty = (int) $_GET['jetpack_enable_plugin_autoupdates']; |
156
|
|
|
printf( '<div id="message" class="updated fade"><p>' . _n( 'Enabled automatic updates on %d plugin.', 'Enabled automatic updates on %d plugins.', $qty, 'jetpack' ) . '</p></div>', $qty ); |
157
|
|
|
} elseif ( ! empty( $_GET['jetpack_disable_plugin_autoupdates'] ) ) { |
158
|
|
|
$qty = (int) $_GET['jetpack_disable_plugin_autoupdates']; |
159
|
|
|
printf( '<div id="message" class="updated fade"><p>' . _n( 'Disabled automatic updates on %d plugin.', 'Disabled automatic updates on %d plugins.', $qty, 'jetpack' ) . '</p></div>', $qty ); |
160
|
|
|
} |
161
|
|
|
} |
162
|
|
|
|
163
|
|
|
public function jetpack_toggle_autoupdate() { |
164
|
|
|
if ( ! current_user_can( 'jetpack_manage_autoupdates' ) ) { |
165
|
|
|
wp_send_json_error(); |
166
|
|
|
return; |
167
|
|
|
} |
168
|
|
|
|
169
|
|
|
$type = $_POST['type']; |
170
|
|
|
$slug = $_POST['slug']; |
171
|
|
|
$active = 'false' !== $_POST['active']; |
172
|
|
|
|
173
|
|
|
check_ajax_referer( "jetpack_toggle_autoupdate-{$type}" ); |
174
|
|
|
|
175
|
|
|
if ( ! in_array( $type, array( 'plugins', 'plugins_translations' ) ) ) { |
176
|
|
|
wp_send_json_error(); |
177
|
|
|
return; |
178
|
|
|
} |
179
|
|
|
|
180
|
|
|
$jetpack_option_name = "autoupdate_{$type}"; |
181
|
|
|
|
182
|
|
|
$list = Jetpack_Options::get_option( $jetpack_option_name, array() ); |
183
|
|
|
|
184
|
|
|
if ( $active ) { |
185
|
|
|
$list = array_unique( array_merge( $list, (array) $slug ) ); |
186
|
|
|
} else { |
187
|
|
|
$list = array_diff( $list, (array) $slug ); |
188
|
|
|
} |
189
|
|
|
|
190
|
|
|
Jetpack_Options::update_option( $jetpack_option_name, $list ); |
191
|
|
|
|
192
|
|
|
wp_send_json_success( $list ); |
193
|
|
|
} |
194
|
|
|
|
195
|
|
|
public function admin_color_override( $color ) { |
196
|
|
|
return 'fresh'; |
197
|
|
|
} |
198
|
|
|
|
199
|
|
|
public function mock_masterbar_activation() { |
200
|
|
|
include_once JETPACK__PLUGIN_DIR . 'modules/masterbar/masterbar.php'; |
201
|
|
|
new A8C_WPCOM_Masterbar; |
202
|
|
|
} |
203
|
|
|
|
204
|
|
|
public function remove_core_menus() { |
205
|
|
|
remove_menu_page( 'edit.php?post_type=feedback' ); |
206
|
|
|
remove_menu_page( 'options-general.php' ); |
207
|
|
|
remove_menu_page( 'index.php' ); |
208
|
|
|
remove_menu_page( 'jetpack' ); |
209
|
|
|
remove_menu_page( 'edit.php' ); |
210
|
|
|
remove_menu_page( 'upload.php' ); |
211
|
|
|
remove_menu_page( 'edit.php?post_type=page' ); |
212
|
|
|
remove_menu_page( 'edit-comments.php' ); |
213
|
|
|
remove_menu_page( 'themes.php' ); |
214
|
|
|
remove_menu_page( 'plugins.php' ); |
215
|
|
|
remove_menu_page( 'users.php' ); |
216
|
|
|
remove_menu_page( 'tools.php' ); |
217
|
|
|
remove_menu_page( 'link-manager.php' ); |
218
|
|
|
|
219
|
|
|
// Core settings pages |
220
|
|
|
remove_submenu_page( 'options-general.php', 'options-general.php' ); |
221
|
|
|
remove_submenu_page( 'options-general.php', 'options-writing.php' ); |
222
|
|
|
remove_submenu_page( 'options-general.php', 'options-reading.php' ); |
223
|
|
|
remove_submenu_page( 'options-general.php', 'options-discussion.php' ); |
224
|
|
|
remove_submenu_page( 'options-general.php', 'options-media.php' ); |
225
|
|
|
remove_submenu_page( 'options-general.php', 'options-permalink.php' ); |
226
|
|
|
remove_submenu_page( 'options-general.php', 'privacy.php' ); |
227
|
|
|
remove_submenu_page( 'options-general.php', 'sharing' ); |
228
|
|
|
} |
229
|
|
|
|
230
|
|
|
public function add_custom_menus() { |
231
|
|
|
global $menu, $submenu; |
232
|
|
|
|
233
|
|
|
if ( $_GET[ 'post_type' ] == 'feedback' ) { |
234
|
|
|
// there is currently no gridicon for feeback, so using dashicon |
235
|
|
|
add_menu_page( __( 'Feedback', 'jetpack' ), __( 'Feedback', 'jetpack' ), 'edit_pages', 'edit.php?post_type=feedback', '', 'dashicons-feedback', 1 ); |
236
|
|
|
remove_submenu_page( 'edit.php?post_type=feedback', 'feedback-export'); |
237
|
|
|
} else { |
238
|
|
|
add_menu_page( __( 'Manage Plugins', 'jetpack' ), __( 'Manage Plugins', 'jetpack' ), 'activate_plugins', 'plugins.php', '', $this->installed_plugins_icon(), 1 ); |
239
|
|
|
// Count the settings page submenus, if it's zero then don't show this. |
240
|
|
|
if ( empty( $submenu['options-general.php'] ) ) { |
241
|
|
|
remove_menu_page( 'options-general.php' ); |
242
|
|
|
} else { |
243
|
|
|
// Rename and make sure the plugin settings menu is always last. |
244
|
|
|
// Sneaky plugins seem to override this otherwise. |
245
|
|
|
// Settings is always key 80. |
246
|
|
|
$menu[80][0] = __( 'Plugin Settings', 'jetpack' ); |
247
|
|
|
$menu[ max( array_keys( $menu ) ) + 1 ] = $menu[80]; |
248
|
|
|
unset( $menu[80] ); |
249
|
|
|
} |
250
|
|
|
} |
251
|
|
|
} |
252
|
|
|
|
253
|
|
|
public function enqueue() { |
254
|
|
|
wp_enqueue_style( 'calypsoify_wpadminmods_css', plugin_dir_url( __FILE__ ) . 'style.min.css', false, JETPACK__VERSION ); |
255
|
|
|
wp_style_add_data( 'calypsoify_wpadminmods_css', 'rtl', 'replace' ); |
256
|
|
|
wp_style_add_data( 'calypsoify_wpadminmods_css', 'suffix', '.min' ); |
257
|
|
|
|
258
|
|
|
wp_enqueue_script( 'calypsoify_wpadminmods_js', plugin_dir_url( __FILE__ ) . 'mods.js', false, JETPACK__VERSION ); |
259
|
|
|
wp_localize_script( 'calypsoify_wpadminmods_js', 'CalypsoifyOpts', array( |
260
|
|
|
'nonces' => array( |
261
|
|
|
'autoupdate_plugins' => wp_create_nonce( 'jetpack_toggle_autoupdate-plugins' ), |
262
|
|
|
'autoupdate_plugins_translations' => wp_create_nonce( 'jetpack_toggle_autoupdate-plugins_translations' ), |
263
|
|
|
) |
264
|
|
|
) ); |
265
|
|
|
} |
266
|
|
|
|
267
|
|
|
public function enqueue_for_gutenberg() { |
268
|
|
|
wp_enqueue_style( 'calypsoify_wpadminmods_css', plugin_dir_url( __FILE__ ) . 'style-gutenberg.min.css', false, JETPACK__VERSION ); |
269
|
|
|
wp_style_add_data( 'calypsoify_wpadminmods_css', 'rtl', 'replace' ); |
270
|
|
|
wp_style_add_data( 'calypsoify_wpadminmods_css', 'suffix', '.min' ); |
271
|
|
|
|
272
|
|
|
wp_enqueue_script( 'calypsoify_wpadminmods_js', plugin_dir_url( __FILE__ ) . 'mods-gutenberg.js', false, JETPACK__VERSION ); |
273
|
|
|
wp_localize_script( |
274
|
|
|
'calypsoify_wpadminmods_js', |
275
|
|
|
'calypsoifyGutenberg', |
276
|
|
|
array( |
277
|
|
|
'closeUrl' => $this->get_close_gutenberg_url(), |
278
|
|
|
'manageReusableBlocksUrl' => $this->get_calypso_origin() . '/types/wp_block' . $this->get_site_suffix(), |
279
|
|
|
) |
280
|
|
|
); |
281
|
|
|
} |
282
|
|
|
|
283
|
|
|
public function insert_sidebar_html() { |
284
|
|
|
$heading = ( $_GET[ 'post_type' ] == 'feedback' ) ? 'Feedback' : 'Plugins'; |
285
|
|
|
?> |
286
|
|
|
<a href="<?php echo esc_url( 'https://wordpress.com/stats/day/' . Jetpack::build_raw_urls( home_url() ) ); ?>" id="calypso-sidebar-header"> |
287
|
|
|
<svg class="gridicon gridicons-chevron-left" height="24" width="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g><path d="M14 20l-8-8 8-8 1.414 1.414L8.828 12l6.586 6.586"></path></g></svg> |
288
|
|
|
|
289
|
|
|
<ul> |
290
|
|
|
<li id="calypso-sitename"><?php bloginfo( 'name' ); ?></li> |
291
|
|
|
<li id="calypso-plugins"><?php esc_html_e( $heading ); ?></li> |
292
|
|
|
</ul> |
293
|
|
|
</a> |
294
|
|
|
<?php |
295
|
|
|
} |
296
|
|
|
|
297
|
|
|
public function modify_masterbar() { |
298
|
|
|
global $wp_admin_bar; |
299
|
|
|
|
300
|
|
|
// Add proper links to masterbar top sections. |
301
|
|
|
$my_sites_node = (object) $wp_admin_bar->get_node( 'blog' ); |
302
|
|
|
$my_sites_node->href = 'https://wordpress.com/stats/day/' . Jetpack::build_raw_urls( home_url() ); |
303
|
|
|
$wp_admin_bar->add_node( $my_sites_node ); |
304
|
|
|
|
305
|
|
|
$reader_node = (object) $wp_admin_bar->get_node( 'newdash' ); |
306
|
|
|
$reader_node->href = 'https://wordpress.com'; |
307
|
|
|
$wp_admin_bar->add_node( $reader_node ); |
308
|
|
|
|
309
|
|
|
$me_node = (object) $wp_admin_bar->get_node( 'my-account' ); |
310
|
|
|
$me_node->href = 'https://wordpress.com/me'; |
311
|
|
|
$wp_admin_bar->add_node( $me_node ); |
312
|
|
|
} |
313
|
|
|
|
314
|
|
|
private function installed_plugins_icon() { |
315
|
|
|
$svg = '<svg class="gridicon gridicons-plugins" height="24" width="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 24"><g><path d="M16 8V3c0-.552-.448-1-1-1s-1 .448-1 1v5h-4V3c0-.552-.448-1-1-1s-1 .448-1 1v5H5v4c0 2.79 1.637 5.193 4 6.317V22h6v-3.683c2.363-1.124 4-3.527 4-6.317V8h-3z" fill="black"></path></g></svg>'; |
316
|
|
|
|
317
|
|
|
return 'data:image/svg+xml;base64,' . base64_encode( $svg ); |
318
|
|
|
} |
319
|
|
|
|
320
|
|
|
/** |
321
|
|
|
* Returns the Calypso domain that originated the current request. |
322
|
|
|
* |
323
|
|
|
* @return string |
324
|
|
|
*/ |
325
|
|
|
private function get_calypso_origin() { |
326
|
|
|
$origin = ! empty( $_GET['origin'] ) ? $_GET['origin'] : 'https://wordpress.com'; |
327
|
|
|
$whitelist = array( |
328
|
|
|
'http://calypso.localhost:3000', |
329
|
|
|
'http://127.0.0.1:41050', // Desktop App |
330
|
|
|
'https://wpcalypso.wordpress.com', |
331
|
|
|
'https://horizon.wordpress.com', |
332
|
|
|
'https://wordpress.com', |
333
|
|
|
); |
334
|
|
|
return in_array( $origin, $whitelist ) ? $origin : 'https://wordpress.com'; |
335
|
|
|
|
336
|
|
View Code Duplication |
function get_site_suffix() { |
|
|
|
|
337
|
|
|
if ( class_exists( 'Jetpack' ) && method_exists( 'Jetpack', 'build_raw_urls' ) ) { |
338
|
|
|
$site_suffix = Jetpack::build_raw_urls( home_url() ); |
339
|
|
|
} elseif ( class_exists( 'WPCOM_Masterbar' ) && method_exists( 'WPCOM_Masterbar', 'get_calypso_site_slug' ) ) { |
340
|
|
|
$site_suffix = WPCOM_Masterbar::get_calypso_site_slug( get_current_blog_id() ); |
341
|
|
|
} |
342
|
|
|
|
343
|
|
|
if ( $site_suffix ) { |
344
|
|
|
return "/${site_suffix}"; |
345
|
|
|
} |
346
|
|
|
return ''; |
347
|
|
|
} |
348
|
|
|
} |
349
|
|
|
|
350
|
|
|
/** |
351
|
|
|
* Returns the site slug suffix to be used as part of the Calypso URLs. It already |
352
|
|
|
* includes the slash separator at the beginning. |
353
|
|
|
* |
354
|
|
|
* @example "https://wordpress.com/block-editor" . $this->get_site_suffix() |
355
|
|
|
* |
356
|
|
|
* @return string |
357
|
|
|
*/ |
358
|
|
View Code Duplication |
private function get_site_suffix() { |
359
|
|
|
if ( class_exists( 'Jetpack' ) && method_exists( 'Jetpack', 'build_raw_urls' ) ) { |
360
|
|
|
$site_suffix = Jetpack::build_raw_urls( home_url() ); |
361
|
|
|
} elseif ( class_exists( 'WPCOM_Masterbar' ) && method_exists( 'WPCOM_Masterbar', 'get_calypso_site_slug' ) ) { |
362
|
|
|
$site_suffix = WPCOM_Masterbar::get_calypso_site_slug( get_current_blog_id() ); |
363
|
|
|
} |
364
|
|
|
|
365
|
|
|
if ( $site_suffix ) { |
366
|
|
|
return "/${site_suffix}"; |
|
|
|
|
367
|
|
|
} |
368
|
|
|
return ''; |
369
|
|
|
} |
370
|
|
|
|
371
|
|
|
/** |
372
|
|
|
* Returns the Calypso URL that displays either the current post type list (if no args |
373
|
|
|
* are supplied) or the classic editor for the current post (if a post ID is supplied). |
374
|
|
|
* |
375
|
|
|
* @param int|null $post_id |
376
|
|
|
* @return string |
377
|
|
|
*/ |
378
|
|
|
public function get_calypso_url( $post_id = null ) { |
379
|
|
|
$screen = get_current_screen(); |
380
|
|
|
$post_type = $screen->post_type; |
381
|
|
|
if ( is_null( $post_id ) ) { |
382
|
|
|
// E.g. `posts`, `pages`, or `types/some_custom_post_type` |
383
|
|
|
$post_type_suffix = ( 'post' === $post_type || 'page' === $post_type ) |
384
|
|
|
? "/${post_type}s" |
385
|
|
|
: "/types/${post_type}"; |
386
|
|
|
$post_suffix = ''; |
387
|
|
|
} else { |
388
|
|
|
$post_type_suffix = ( 'post' === $post_type || 'page' === $post_type ) |
389
|
|
|
? "/${post_type}" |
390
|
|
|
: "/edit/${post_type}"; |
391
|
|
|
$post_suffix = "/${post_id}"; |
392
|
|
|
} |
393
|
|
|
|
394
|
|
|
return $this->get_calypso_origin() . $post_type_suffix . $this->get_site_suffix() . $post_suffix; |
395
|
|
|
} |
396
|
|
|
|
397
|
|
|
/** |
398
|
|
|
* Returns the URL to be used on the block editor close button for going back to the |
399
|
|
|
* Calypso post list. |
400
|
|
|
* |
401
|
|
|
* @return string |
402
|
|
|
*/ |
403
|
|
|
public function get_close_gutenberg_url() { |
404
|
|
|
return $this->get_calypso_url(); |
405
|
|
|
} |
406
|
|
|
|
407
|
|
|
/** |
408
|
|
|
* Returns the URL for switching the user's editor to the Calypso (WordPress.com Classic) editor. |
409
|
|
|
* |
410
|
|
|
* @return string |
411
|
|
|
*/ |
412
|
|
|
public function get_switch_to_classic_editor_url() { |
413
|
|
|
return add_query_arg( |
414
|
|
|
'set-editor', |
415
|
|
|
'classic', |
416
|
|
|
$this->is_calypsoify_enabled ? $this->get_calypso_url( get_the_ID() ) : false |
417
|
|
|
); |
418
|
|
|
} |
419
|
|
|
|
420
|
|
|
public function check_param() { |
421
|
|
|
if ( isset( $_GET['calypsoify'] ) ) { |
422
|
|
|
if ( 1 == (int) $_GET['calypsoify'] ) { |
423
|
|
|
update_user_meta( get_current_user_id(), 'calypsoify', 1 ); |
424
|
|
|
} else { |
425
|
|
|
update_user_meta( get_current_user_id(), 'calypsoify', 0 ); |
426
|
|
|
} |
427
|
|
|
|
428
|
|
|
$page = remove_query_arg( 'calypsoify', wp_basename( $_SERVER['REQUEST_URI'] ) ); |
429
|
|
|
|
430
|
|
|
wp_safe_redirect( admin_url( $page ) ); |
431
|
|
|
} |
432
|
|
|
} |
433
|
|
|
|
434
|
|
|
public function check_page() { |
435
|
|
|
// If the user hits plain /wp-admin/ then disable Calypso styles. |
436
|
|
|
$page = wp_basename( esc_url( $_SERVER['REQUEST_URI'] ) ); |
437
|
|
|
|
438
|
|
|
if ( false !== strpos( 'index.php', $page ) || false !== strpos( 'wp-admin', $page ) ) { |
439
|
|
|
update_user_meta( get_current_user_id(), 'calypsoify', 0 ); |
440
|
|
|
wp_safe_redirect( admin_url() ); |
441
|
|
|
die; |
442
|
|
|
} |
443
|
|
|
} |
444
|
|
|
|
445
|
|
|
/** |
446
|
|
|
* Return whether a post type should display the Gutenberg/block editor. |
447
|
|
|
* |
448
|
|
|
* @since 6.7.0 |
449
|
|
|
*/ |
450
|
|
|
public function is_post_type_gutenberg( $post_type ) { |
451
|
|
|
return use_block_editor_for_post_type( $post_type ); |
452
|
|
|
} |
453
|
|
|
|
454
|
|
|
public function is_page_gutenberg() { |
455
|
|
|
$page = wp_basename( esc_url( $_SERVER['REQUEST_URI'] ) ); |
456
|
|
|
|
457
|
|
|
if ( false !== strpos( $page, 'post-new.php' ) && empty ( $_GET['post_type'] ) ) { |
458
|
|
|
return true; |
459
|
|
|
} |
460
|
|
|
|
461
|
|
|
if ( false !== strpos( $page, 'post-new.php' ) && isset( $_GET['post_type'] ) && $this->is_post_type_gutenberg( $_GET['post_type'] ) ) { |
462
|
|
|
return true; |
463
|
|
|
} |
464
|
|
|
|
465
|
|
|
if ( false !== strpos( $page, 'post.php' ) ) { |
466
|
|
|
$post = get_post( $_GET['post'] ); |
467
|
|
|
if ( isset( $post ) && isset( $post->post_type ) && $this->is_post_type_gutenberg( $post->post_type ) ) { |
468
|
|
|
return true; |
469
|
|
|
} |
470
|
|
|
} |
471
|
|
|
|
472
|
|
|
if ( false !== strpos( $page, 'revision.php' ) ) { |
473
|
|
|
$post = get_post( $_GET['revision'] ); |
474
|
|
|
$parent = get_post( $post->post_parent ); |
475
|
|
|
if ( isset( $parent ) && isset( $parent->post_type ) && $this->is_post_type_gutenberg( $parent->post_type ) ) { |
476
|
|
|
return true; |
477
|
|
|
} |
478
|
|
|
} |
479
|
|
|
|
480
|
|
|
return false; |
481
|
|
|
} |
482
|
|
|
} |
483
|
|
|
|
484
|
|
|
$Jetpack_Calypsoify = Jetpack_Calypsoify::getInstance(); |
485
|
|
|
|
This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.
Unreachable code is most often the result of
return
,die
orexit
statements that have been added for debug purposes.In the above example, the last
return false
will never be executed, because a return statement has already been met in every possible execution path.