These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * This file is meant to be the home for any generic & reusable functions |
||
4 | * that can be accessed anywhere within Jetpack. |
||
5 | * |
||
6 | * This file is loaded whether or not Jetpack is active. |
||
7 | * |
||
8 | * Please namespace with jetpack_ |
||
9 | * Please write docblocks |
||
10 | */ |
||
11 | |||
12 | /** |
||
13 | * Disable direct access. |
||
14 | */ |
||
15 | if ( ! defined( 'ABSPATH' ) ) { |
||
16 | exit; |
||
17 | } |
||
18 | |||
19 | /** |
||
20 | * Determine if this site is an Atomic site or not looking first at the 'at_options' option. |
||
21 | * As a fallback, check for presence of wpcomsh plugin to determine if a current site has undergone AT. |
||
22 | * |
||
23 | * @since 4.8.1 |
||
24 | * |
||
25 | * @return bool |
||
26 | */ |
||
27 | function jetpack_is_atomic_site() { |
||
28 | $at_options = get_option( 'at_options', array() ); |
||
29 | return ! empty( $at_options ) || defined( 'WPCOMSH__PLUGIN_FILE' ); |
||
30 | } |
||
31 | |||
32 | /** |
||
33 | * Register post type for migration. |
||
34 | * |
||
35 | * @since 5.2 |
||
36 | */ |
||
37 | function jetpack_register_migration_post_type() { |
||
38 | register_post_type( 'jetpack_migration', array( |
||
39 | 'supports' => array(), |
||
40 | 'taxonomies' => array(), |
||
41 | 'hierarchical' => false, |
||
42 | 'public' => false, |
||
43 | 'has_archive' => false, |
||
44 | 'can_export' => true, |
||
45 | ) ); |
||
46 | } |
||
47 | |||
48 | /** |
||
49 | * Stores migration data in the database. |
||
50 | * |
||
51 | * @since 5.2 |
||
52 | * |
||
53 | * @param string $option_name |
||
54 | * @param bool $option_value |
||
55 | * |
||
56 | * @return int|WP_Error |
||
57 | */ |
||
58 | function jetpack_store_migration_data( $option_name, $option_value ) { |
||
59 | jetpack_register_migration_post_type(); |
||
60 | |||
61 | $insert = array( |
||
62 | 'post_title' => $option_name, |
||
63 | 'post_content_filtered' => $option_value, |
||
64 | 'post_type' => 'jetpack_migration', |
||
65 | 'post_date' => date( 'Y-m-d H:i:s', time() ), |
||
66 | ); |
||
67 | |||
68 | $post = get_page_by_title( $option_name, 'OBJECT', 'jetpack_migration' ); |
||
69 | |||
70 | if ( null !== $post ) { |
||
71 | $insert['ID'] = $post->ID; |
||
72 | } |
||
73 | |||
74 | return wp_insert_post( $insert, true ); |
||
75 | } |
||
76 | |||
77 | /** |
||
78 | * Retrieves legacy image widget data. |
||
79 | * |
||
80 | * @since 5.2 |
||
81 | * |
||
82 | * @param string $option_name |
||
83 | * |
||
84 | * @return mixed|null |
||
85 | */ |
||
86 | function jetpack_get_migration_data( $option_name ) { |
||
87 | $post = get_page_by_title( $option_name, 'OBJECT', 'jetpack_migration' ); |
||
88 | |||
89 | return null !== $post ? maybe_unserialize( $post->post_content_filtered ) : null; |
||
90 | } |
||
91 | |||
92 | /** |
||
93 | * Prints a TOS blurb used throughout the connection prompts. |
||
94 | * |
||
95 | * @since 5.3 |
||
96 | * |
||
97 | * @return string |
||
98 | */ |
||
99 | function jetpack_render_tos_blurb() { |
||
100 | printf( |
||
101 | __( 'By clicking the <strong>Set up Jetpack</strong> button, you agree to our fascinating <a href="%s" target="_blank">Terms of Service</a> and to <a href="%s" target="_blank">share details</a> with WordPress.com', 'jetpack' ), |
||
102 | 'https://wordpress.com/tos', |
||
103 | 'https://jetpack.com/support/what-data-does-jetpack-sync' |
||
104 | ); |
||
105 | } |
||
106 | |||
107 | /** |
||
108 | * Intervene upgrade process so Jetpack themes are downloaded with credentials. |
||
109 | * |
||
110 | * @since 5.3 |
||
111 | * |
||
112 | * @param bool $preempt Whether to preempt an HTTP request's return value. Default false. |
||
113 | * @param array $r HTTP request arguments. |
||
114 | * @param string $url The request URL. |
||
115 | * |
||
116 | * @return array|bool|WP_Error |
||
117 | */ |
||
118 | function jetpack_theme_update( $preempt, $r, $url ) { |
||
119 | if ( false !== stripos( $url, JETPACK__WPCOM_JSON_API_HOST . '/rest/v1/themes/download' ) ) { |
||
120 | $file = $r['filename']; |
||
121 | if ( ! $file ) { |
||
122 | return new WP_Error( 'problem_creating_theme_file', esc_html__( 'Problem creating file for theme download', 'jetpack' ) ); |
||
123 | } |
||
124 | $theme = pathinfo( parse_url( $url, PHP_URL_PATH ), PATHINFO_FILENAME ); |
||
125 | |||
126 | // Remove filter to avoid endless loop since wpcom_json_api_request_as_blog uses this too. |
||
127 | remove_filter( 'pre_http_request', 'jetpack_theme_update' ); |
||
128 | $result = Jetpack_Client::wpcom_json_api_request_as_blog( |
||
129 | "themes/download/$theme.zip", '1.1', array( 'stream' => true, 'filename' => $file ) |
||
130 | ); |
||
131 | |||
132 | if ( 200 !== wp_remote_retrieve_response_code( $result ) ) { |
||
133 | return new WP_Error( 'problem_fetching_theme', esc_html__( 'Problem downloading theme', 'jetpack' ) ); |
||
134 | } |
||
135 | return $result; |
||
136 | } |
||
137 | return $preempt; |
||
138 | } |
||
139 | |||
140 | /** |
||
141 | * Add the filter when a upgrade is going to be downloaded. |
||
142 | * |
||
143 | * @since 5.3 |
||
144 | * |
||
145 | * @param bool $reply Whether to bail without returning the package. Default false. |
||
146 | * |
||
147 | * @return bool |
||
148 | */ |
||
149 | function jetpack_upgrader_pre_download( $reply ) { |
||
150 | add_filter( 'pre_http_request', 'jetpack_theme_update', 10, 3 ); |
||
151 | return $reply; |
||
152 | } |
||
153 | |||
154 | add_filter( 'upgrader_pre_download', 'jetpack_upgrader_pre_download' ); |
||
155 | |||
156 | |||
157 | /** |
||
158 | * Wraps data in a way so that we can distinguish between objects and array and also prevent object recursion. |
||
159 | * |
||
160 | * @since 6.1.0 |
||
161 | * |
||
162 | * @param $any |
||
163 | * @param array $seen_nodes |
||
164 | * |
||
165 | * @return array |
||
166 | */ |
||
167 | View Code Duplication | function jetpack_json_wrap( &$any, $seen_nodes = array() ) { |
|
0 ignored issues
–
show
|
|||
168 | if ( is_object( $any ) ) { |
||
169 | $input = get_object_vars( $any ); |
||
170 | $input['__o'] = 1; |
||
171 | } else { |
||
172 | $input = &$any; |
||
173 | } |
||
174 | |||
175 | if ( is_array( $input ) ) { |
||
176 | $seen_nodes[] = &$any; |
||
177 | |||
178 | $return = array(); |
||
179 | |||
180 | foreach ( $input as $k => &$v ) { |
||
181 | if ( ( is_array( $v ) || is_object( $v ) ) ) { |
||
182 | if ( in_array( $v, $seen_nodes, true ) ) { |
||
183 | continue; |
||
184 | } |
||
185 | $return[ $k ] = jetpack_json_wrap( $v, $seen_nodes ); |
||
186 | } else { |
||
187 | $return[ $k ] = $v; |
||
188 | } |
||
189 | } |
||
190 | |||
191 | return $return; |
||
192 | } |
||
193 | |||
194 | return $any; |
||
195 | } |
||
196 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.