These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * Plugin Name: Writing on GitHub |
||
4 | * Plugin URI: https://github.com/litefeel/writing-on-github |
||
5 | * Description: A WordPress plugin to allow you writing on GitHub (or Jekyll site). |
||
6 | * Version: 1.5.1 |
||
7 | * Author: litefeel |
||
8 | * Author URI: https://www.litefeel.com |
||
9 | * License: GPLv2 |
||
10 | * Text Domain: writing-on-github |
||
11 | */ |
||
12 | |||
13 | // If the functions have already been autoloaded, don't reload. |
||
14 | // This fixes function duplication during unit testing. |
||
15 | $path = dirname( __FILE__ ) . '/vendor/autoload.php'; |
||
16 | if ( file_exists( $path ) ) { |
||
17 | require_once( $path ); |
||
18 | } |
||
19 | |||
20 | add_action( 'plugins_loaded', array( new Writing_On_GitHub, 'boot' ) ); |
||
21 | |||
22 | class Writing_On_GitHub { |
||
0 ignored issues
–
show
Complexity
introduced
by
![]() |
|||
23 | |||
24 | /** |
||
25 | * Object instance |
||
26 | * @var self |
||
27 | */ |
||
28 | public static $instance; |
||
29 | |||
30 | /** |
||
31 | * Language text domain |
||
32 | * @var string |
||
33 | */ |
||
34 | public static $text_domain = 'writing-on-github'; |
||
35 | |||
36 | /** |
||
37 | * Controller object |
||
38 | * @var Writing_On_GitHub_Controller |
||
39 | */ |
||
40 | public $controller; |
||
41 | |||
42 | /** |
||
43 | * Controller object |
||
44 | * @var Writing_On_GitHub_Admin |
||
45 | */ |
||
46 | public $admin; |
||
47 | |||
48 | /** |
||
49 | * CLI object. |
||
50 | * |
||
51 | * @var Writing_On_GitHub_CLI |
||
52 | */ |
||
53 | protected $cli; |
||
54 | |||
55 | /** |
||
56 | * Request object. |
||
57 | * |
||
58 | * @var Writing_On_GitHub_Request |
||
59 | */ |
||
60 | protected $request; |
||
61 | |||
62 | /** |
||
63 | * Response object. |
||
64 | * |
||
65 | * @var Writing_On_GitHub_Response |
||
66 | */ |
||
67 | protected $response; |
||
68 | |||
69 | /** |
||
70 | * Api object. |
||
71 | * |
||
72 | * @var Writing_On_GitHub_Api |
||
73 | */ |
||
74 | protected $api; |
||
75 | |||
76 | /** |
||
77 | * Import object. |
||
78 | * |
||
79 | * @var Writing_On_GitHub_Import |
||
80 | */ |
||
81 | protected $import; |
||
82 | |||
83 | /** |
||
84 | * Export object. |
||
85 | * |
||
86 | * @var Writing_On_GitHub_Export |
||
87 | */ |
||
88 | protected $export; |
||
89 | |||
90 | /** |
||
91 | * Semaphore object. |
||
92 | * |
||
93 | * @var Writing_On_GitHub_Semaphore |
||
94 | */ |
||
95 | protected $semaphore; |
||
96 | |||
97 | /** |
||
98 | * Database object. |
||
99 | * |
||
100 | * @var Writing_On_GitHub_Database |
||
101 | */ |
||
102 | protected $database; |
||
103 | |||
104 | /** |
||
105 | * Called at load time, hooks into WP core |
||
106 | */ |
||
107 | public function __construct() { |
||
108 | self::$instance = $this; |
||
109 | |||
110 | if ( is_admin() ) { |
||
111 | $this->admin = new Writing_On_GitHub_Admin; |
||
112 | } |
||
113 | |||
114 | $this->controller = new Writing_On_GitHub_Controller( $this ); |
||
115 | |||
116 | if ( defined( 'WP_CLI' ) && WP_CLI ) { |
||
117 | WP_CLI::add_command( 'wogh', $this->cli() ); |
||
118 | } |
||
119 | } |
||
120 | |||
121 | /** |
||
122 | * Attaches the plugin's hooks into WordPress. |
||
123 | */ |
||
124 | public function boot() { |
||
125 | register_activation_hook( __FILE__, array( $this, 'activate' ) ); |
||
126 | add_action( 'admin_notices', array( $this, 'activation_notice' ) ); |
||
127 | |||
128 | add_action( 'init', array( $this, 'l10n' ) ); |
||
129 | |||
130 | // Controller actions. |
||
131 | add_action( 'save_post', array( $this->controller, 'export_post' ) ); |
||
132 | add_action( 'delete_post', array( $this->controller, 'delete_post' ) ); |
||
133 | add_action( 'wp_ajax_nopriv_wogh_push_request', array( $this->controller, 'pull_posts' ) ); |
||
134 | add_action( 'wogh_export', array( $this->controller, 'export_all' ), 10, 2 ); |
||
135 | add_action( 'wogh_import', array( $this->controller, 'import_master' ), 10, 1 ); |
||
136 | add_filter( 'get_edit_post_link', array( $this, 'edit_post_link' ), 10, 3 ); |
||
137 | |||
138 | // add_filter( 'wogh_post_meta', array( $this, 'ignore_post_meta' ), 10, 1 ); |
||
139 | // add_filter( 'wogh_pre_import_meta', array( $this, 'ignore_post_meta' ), 10, 1 ); |
||
140 | add_filter( 'the_content', array( $this, 'the_content' ) ); |
||
141 | |||
142 | do_action( 'wogh_boot', $this ); |
||
143 | } |
||
144 | |||
145 | public function edit_post_link($link, $postID, $context) { |
||
0 ignored issues
–
show
The return type could not be reliably inferred; please add a
@return annotation.
Our type inference engine in quite powerful, but sometimes the code does not
provide enough clues to go by. In these cases we request you to add a ![]() |
|||
146 | if ( ! wp_is_post_revision( $postID ) ) { |
||
147 | $post = new Writing_On_GitHub_Post( $postID, Writing_On_GitHub::$instance->api() ); |
||
148 | if ( $post->is_on_github() ) { |
||
149 | return $post->github_edit_url(); |
||
150 | } |
||
151 | } |
||
152 | |||
153 | return $link; |
||
154 | } |
||
155 | |||
156 | public function ignore_post_meta($meta) { |
||
0 ignored issues
–
show
The return type could not be reliably inferred; please add a
@return annotation.
Our type inference engine in quite powerful, but sometimes the code does not
provide enough clues to go by. In these cases we request you to add a ![]() |
|||
157 | $ignore_meta_keys = get_option('wogh_ignore_metas'); |
||
0 ignored issues
–
show
|
|||
158 | if (empty($ignore_meta_keys)) { |
||
0 ignored issues
–
show
|
|||
159 | return $meta; |
||
160 | } |
||
161 | |||
162 | $keys = preg_split("/\\r\\n|\\r|\\n/", $ignore_meta_keys); |
||
0 ignored issues
–
show
|
|||
163 | if (empty($keys)) { |
||
0 ignored issues
–
show
|
|||
164 | return $meta; |
||
165 | } |
||
166 | foreach ($keys as $key => $value) { |
||
0 ignored issues
–
show
|
|||
167 | $keys[$key] = trim($value); |
||
0 ignored issues
–
show
|
|||
168 | } |
||
169 | |||
170 | foreach ($meta as $key => $value) { |
||
0 ignored issues
–
show
|
|||
171 | if (in_array($key, $keys)) { |
||
0 ignored issues
–
show
|
|||
172 | unset($meta[$key]); |
||
0 ignored issues
–
show
|
|||
173 | } |
||
174 | } |
||
175 | |||
176 | return $meta; |
||
177 | } |
||
178 | |||
179 | public function the_content($content) { |
||
0 ignored issues
–
show
The return type could not be reliably inferred; please add a
@return annotation.
Our type inference engine in quite powerful, but sometimes the code does not
provide enough clues to go by. In these cases we request you to add a ![]() |
|||
180 | $arr = wp_upload_dir(); |
||
181 | $baseurl = $arr['baseurl'] . '/writing-on-github'; |
||
182 | |||
183 | $content = preg_replace_callback( |
||
0 ignored issues
–
show
|
|||
184 | '/(<img [^>]*?src=[\'"])\s*(\/images\/[^\s#]\S+)\s*([\'"][^>]*?>)/', |
||
185 | View Code Duplication | function($matchs) use ($baseurl) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
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. ![]() |
|||
186 | $url = $baseurl . $matchs[2]; |
||
187 | return "${matchs[1]}$url${matchs[3]}"; |
||
188 | }, |
||
189 | $content |
||
190 | ); |
||
191 | |||
192 | $content = preg_replace_callback( |
||
0 ignored issues
–
show
|
|||
193 | '/(<a [^>]*?href=[\'"])\s*(\/images\/[^\s#]\S+)\s*([\'"][^>]*?>)/', |
||
194 | View Code Duplication | function($matchs) use ($baseurl) { |
|
0 ignored issues
–
show
This code seems to be duplicated across your project.
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. ![]() |
|||
195 | $url = $baseurl . $matchs[2]; |
||
196 | return "${matchs[1]}$url${matchs[3]}"; |
||
197 | }, |
||
198 | $content |
||
199 | ); |
||
200 | return $content; |
||
201 | } |
||
202 | |||
203 | /** |
||
204 | * Init i18n files |
||
205 | */ |
||
206 | public function l10n() { |
||
207 | load_plugin_textdomain( self::$text_domain ); |
||
208 | } |
||
209 | |||
210 | /** |
||
211 | * Sets and kicks off the export cronjob |
||
212 | */ |
||
213 | public function start_export( $force = false ) { |
||
214 | $this->start_cron( 'export', $force ); |
||
215 | } |
||
216 | |||
217 | /** |
||
218 | * Sets and kicks off the import cronjob |
||
219 | */ |
||
220 | public function start_import() { |
||
221 | $this->start_cron( 'import' ); |
||
222 | } |
||
223 | |||
224 | /** |
||
225 | * Enables the admin notice on initial activation |
||
226 | */ |
||
227 | public function activate() { |
||
228 | if ( 'yes' !== get_option( '_wogh_fully_exported' ) ) { |
||
229 | set_transient( '_wogh_activated', 'yes' ); |
||
230 | } |
||
231 | } |
||
232 | |||
233 | /** |
||
234 | * Displays the activation admin notice |
||
235 | */ |
||
236 | public function activation_notice() { |
||
237 | if ( ! get_transient( '_wogh_activated' ) ) { |
||
238 | return; |
||
239 | } |
||
240 | |||
241 | delete_transient( '_wogh_activated' ); |
||
242 | |||
243 | ?><div class="updated"> |
||
244 | <p> |
||
245 | <?php |
||
246 | printf( |
||
247 | __( 'To set up your site to sync with GitHub, update your <a href="%s">settings</a> and click "Export to GitHub."', 'writing-on-github' ), |
||
248 | admin_url( 'options-general.php?page=' . static::$text_domain) |
||
0 ignored issues
–
show
|
|||
249 | ); |
||
250 | ?> |
||
251 | </p> |
||
252 | </div><?php |
||
253 | } |
||
254 | |||
255 | /** |
||
256 | * Get the Controller object. |
||
257 | * |
||
258 | * @return Writing_On_GitHub_Controller |
||
259 | */ |
||
260 | public function controller() { |
||
261 | return $this->controller; |
||
262 | } |
||
263 | |||
264 | /** |
||
265 | * Lazy-load the CLI object. |
||
266 | * |
||
267 | * @return Writing_On_GitHub_CLI |
||
268 | */ |
||
269 | public function cli() { |
||
270 | if ( ! $this->cli ) { |
||
271 | $this->cli = new Writing_On_GitHub_CLI; |
||
272 | } |
||
273 | |||
274 | return $this->cli; |
||
275 | } |
||
276 | |||
277 | /** |
||
278 | * Lazy-load the Request object. |
||
279 | * |
||
280 | * @return Writing_On_GitHub_Request |
||
281 | */ |
||
282 | public function request() { |
||
283 | if ( ! $this->request ) { |
||
284 | $this->request = new Writing_On_GitHub_Request( $this ); |
||
285 | } |
||
286 | |||
287 | return $this->request; |
||
288 | } |
||
289 | |||
290 | /** |
||
291 | * Lazy-load the Response object. |
||
292 | * |
||
293 | * @return Writing_On_GitHub_Response |
||
294 | */ |
||
295 | public function response() { |
||
296 | if ( ! $this->response ) { |
||
297 | $this->response = new Writing_On_GitHub_Response( $this ); |
||
298 | } |
||
299 | |||
300 | return $this->response; |
||
301 | } |
||
302 | |||
303 | /** |
||
304 | * Lazy-load the Api object. |
||
305 | * |
||
306 | * @return Writing_On_GitHub_Api |
||
307 | */ |
||
308 | public function api() { |
||
309 | if ( ! $this->api ) { |
||
310 | $this->api = new Writing_On_GitHub_Api( $this ); |
||
311 | } |
||
312 | |||
313 | return $this->api; |
||
314 | } |
||
315 | |||
316 | /** |
||
317 | * Lazy-load the Import object. |
||
318 | * |
||
319 | * @return Writing_On_GitHub_Import |
||
320 | */ |
||
321 | public function import() { |
||
322 | if ( ! $this->import ) { |
||
323 | $this->import = new Writing_On_GitHub_Import( $this ); |
||
324 | } |
||
325 | |||
326 | return $this->import; |
||
327 | } |
||
328 | |||
329 | /** |
||
330 | * Lazy-load the Export object. |
||
331 | * |
||
332 | * @return Writing_On_GitHub_Export |
||
333 | */ |
||
334 | public function export() { |
||
335 | if ( ! $this->export ) { |
||
336 | $this->export = new Writing_On_GitHub_Export( $this ); |
||
337 | } |
||
338 | |||
339 | return $this->export; |
||
340 | } |
||
341 | |||
342 | /** |
||
343 | * Lazy-load the Semaphore object. |
||
344 | * |
||
345 | * @return Writing_On_GitHub_Semaphore |
||
346 | */ |
||
347 | public function semaphore() { |
||
348 | if ( ! $this->semaphore ) { |
||
349 | $this->semaphore = new Writing_On_GitHub_Semaphore; |
||
350 | } |
||
351 | |||
352 | return $this->semaphore; |
||
353 | } |
||
354 | |||
355 | /** |
||
356 | * Lazy-load the Database object. |
||
357 | * |
||
358 | * @return Writing_On_GitHub_Database |
||
359 | */ |
||
360 | public function database() { |
||
361 | if ( ! $this->database ) { |
||
362 | $this->database = new Writing_On_GitHub_Database( $this ); |
||
363 | } |
||
364 | |||
365 | return $this->database; |
||
366 | } |
||
367 | |||
368 | /** |
||
369 | * Print to WP_CLI if in CLI environment or |
||
370 | * write to debug.log if WP_DEBUG is enabled |
||
371 | * @source http://www.stumiller.me/sending-output-to-the-wordpress-debug-log/ |
||
372 | * |
||
373 | * @param mixed $msg |
||
374 | * @param string $write |
||
375 | */ |
||
376 | public static function write_log( $msg, $write = 'line' ) { |
||
377 | if ( defined( 'WP_CLI' ) && WP_CLI ) { |
||
378 | if ( is_array( $msg ) || is_object( $msg ) ) { |
||
379 | WP_CLI::print_value( $msg ); |
||
380 | } else { |
||
381 | WP_CLI::$write( $msg ); |
||
382 | } |
||
383 | } elseif ( true === WP_DEBUG ) { |
||
384 | if ( is_array( $msg ) || is_object( $msg ) ) { |
||
385 | error_log( print_r( $msg, true ) ); |
||
0 ignored issues
–
show
|
|||
386 | } else { |
||
387 | error_log( $msg ); |
||
388 | } |
||
389 | } |
||
390 | } |
||
391 | |||
392 | /** |
||
393 | * Kicks of an import or export cronjob. |
||
394 | * |
||
395 | * @param bool $force |
||
396 | * @param string $type |
||
397 | */ |
||
398 | protected function start_cron( $type, $force = false ) { |
||
399 | update_option( '_wogh_' . $type . '_started', 'yes' ); |
||
400 | $user_id = get_current_user_id(); |
||
401 | wp_schedule_single_event( time(), 'wogh_' . $type . '', array( $user_id, $force ) ); |
||
402 | spawn_cron(); |
||
403 | } |
||
404 | } |
||
405 |