-
Notifications
You must be signed in to change notification settings - Fork 384
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Create background events for URL validation #5515
Changes from 70 commits
a1b61ff
345b324
bc4e116
4aa2a3d
ef5534e
4f9b4b9
2c2dce5
348b641
f0aa4b8
05a13f1
57fe9fd
133197a
3097d88
c53b089
54e21ff
8efbe1c
317589e
8084ca7
241789f
8ef28ce
1f2ed34
cda3ee2
33a680c
cd4dd77
2d2a0a6
3f2d79f
7f6f775
9345651
28581d7
0a655f6
1562990
3d07f78
a9e5eac
b2bc91e
25ce26c
b08f164
5334bdf
8fefced
16e3ee5
265abd6
6e10b5b
e2fe6cd
69eddd7
be7ca6e
418fe96
a42e721
94c9959
a2f95e1
43e4ffb
38b05d6
2c7e338
0817cbe
313a13f
c31474c
1e14a97
5c01177
6d8a5c0
6558fe6
f4754e1
e2588ec
f38297f
6747c04
7cdde96
53f5c58
1419ef4
a598fce
809e0cc
1a40431
b200e53
9a0c634
599796f
eeb2df5
daf1c17
7fc9711
f362d40
c6eb855
4f316a1
641a7a4
0195b17
54276a1
0528d1a
b7c8c79
4982692
fa5bba9
895451e
07cb9f7
7f5f4fe
8422d62
50a6bd9
a53afa5
64f88ad
37d5041
6b4a537
f424735
2b49211
ef173e2
ab4e02c
035e99c
f64e4ab
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,171 @@ | ||||||||||||||||||||||||||||||||||||||||||
<?php | ||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* BackgroundTaskDeactivator service for clearing background tasks on plugin deactivation. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @package AmpProject\AmpWP | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
namespace AmpProject\AmpWP\BackgroundTask; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
use AmpProject\AmpWP\Icon; | ||||||||||||||||||||||||||||||||||||||||||
use AmpProject\AmpWP\Infrastructure\Conditional; | ||||||||||||||||||||||||||||||||||||||||||
use AmpProject\AmpWP\Infrastructure\Deactivateable; | ||||||||||||||||||||||||||||||||||||||||||
use AmpProject\AmpWP\Infrastructure\Registerable; | ||||||||||||||||||||||||||||||||||||||||||
use AmpProject\AmpWP\Infrastructure\Service; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* Clears background tasks when the plugin is deactivated. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @package AmpProject\AmpWP | ||||||||||||||||||||||||||||||||||||||||||
* @since 2.1 | ||||||||||||||||||||||||||||||||||||||||||
* @internal | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
final class BackgroundTaskDeactivator implements Service, Conditional, Registerable, Deactivateable { | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No, they are not shared by default. See comment above. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh, wait, I'm referring to regular dependencies, not services. Let me check the injector again before I continue talking nonsense... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No, it seems correct, services are not shared by default. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done in f38297f |
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* List of event names to deactivate. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @var string[] | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
private $events_to_deactivate = []; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* Name of the plugin as WordPress is expecting it. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* This should usually have the form "amp/amp.php". | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @var string | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
private $plugin_file; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* Check whether the conditional object is currently needed. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @return bool Whether the conditional object is needed. | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
public static function is_needed() { | ||||||||||||||||||||||||||||||||||||||||||
return is_admin() || wp_doing_cron(); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* Class constructor. | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
public function __construct() { | ||||||||||||||||||||||||||||||||||||||||||
$this->plugin_file = plugin_basename( AMP__FILE__ ); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* Register the service with the system. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @return void | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
public function register() { | ||||||||||||||||||||||||||||||||||||||||||
add_action( "network_admin_plugin_action_links_{$this->plugin_file}", [ $this, 'add_warning_sign_to_network_deactivate_action' ], 10, 1 ); | ||||||||||||||||||||||||||||||||||||||||||
add_action( 'plugin_row_meta', [ $this, 'add_warning_to_plugin_meta' ], 10, 2 ); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* Get warning icon markup. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @return string Warning icon markup. | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
private function get_warning_icon() { | ||||||||||||||||||||||||||||||||||||||||||
return sprintf( '<span style="vertical-align: middle">%s</span>', Icon::warning()->to_html() ); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* Adds an event to the deactivate queue. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @param string $event_name The event name. | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
public function add_event( $event_name ) { | ||||||||||||||||||||||||||||||||||||||||||
if ( ! in_array( $event_name, $this->events_to_deactivate, true ) ) { | ||||||||||||||||||||||||||||||||||||||||||
$this->events_to_deactivate[] = $event_name; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* Run deactivation logic. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* This should be hooked up to the WordPress deactivation hook. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @param bool $network_wide Whether the deactivation was done network-wide. | ||||||||||||||||||||||||||||||||||||||||||
* @return void | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
public function deactivate( $network_wide ) { | ||||||||||||||||||||||||||||||||||||||||||
if ( $network_wide && is_multisite() && ! wp_is_large_network( 'sites' ) ) { | ||||||||||||||||||||||||||||||||||||||||||
foreach ( get_sites( | ||||||||||||||||||||||||||||||||||||||||||
[ | ||||||||||||||||||||||||||||||||||||||||||
'fields' => 'ids', | ||||||||||||||||||||||||||||||||||||||||||
'number' => 0, // Disables pagination to retrieve all sites. | ||||||||||||||||||||||||||||||||||||||||||
] | ||||||||||||||||||||||||||||||||||||||||||
) as $blog_id ) { | ||||||||||||||||||||||||||||||||||||||||||
switch_to_blog( $blog_id ); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
foreach ( $this->events_to_deactivate as $event_name ) { | ||||||||||||||||||||||||||||||||||||||||||
wp_clear_scheduled_hook( $event_name ); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
restore_current_blog(); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||
foreach ( $this->events_to_deactivate as $event_name ) { | ||||||||||||||||||||||||||||||||||||||||||
wp_clear_scheduled_hook( $event_name ); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* Add a warning sign to the network deactivate action on the network plugins screen. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @param string[] $actions An array of plugin action links. By default this can include 'activate', | ||||||||||||||||||||||||||||||||||||||||||
* 'deactivate', and 'delete'. | ||||||||||||||||||||||||||||||||||||||||||
* @return string[] | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
public function add_warning_sign_to_network_deactivate_action( $actions ) { | ||||||||||||||||||||||||||||||||||||||||||
if ( ! wp_is_large_network() ) { | ||||||||||||||||||||||||||||||||||||||||||
return $actions; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
if ( ! array_key_exists( 'deactivate', $actions ) ) { | ||||||||||||||||||||||||||||||||||||||||||
return $actions; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
wp_enqueue_style( 'amp-icons' ); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
$warning_icon = $this->get_warning_icon(); | ||||||||||||||||||||||||||||||||||||||||||
if ( false === strpos( $actions['deactivate'], $warning_icon ) ) { | ||||||||||||||||||||||||||||||||||||||||||
$actions['deactivate'] = preg_replace( '#(?=</a>)#i', ' ' . $warning_icon, $actions['deactivate'] ); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+124
to
+129
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @westonruter I noticed you were the original author of this snippet of code. How about instead of only appending the warning icon to the anchor text, we use a confirmation dialog to verify they want to deactivate? For example:
Suggested change
And here's it in action: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Actually, the warning was originally added by @schlessera in eaf8259, although it was further iterated on. Adding a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I have to say I'm pretty agnostic on this. We could do both (the icon and the confirm), make no change, or make a new issue for further discussion. Which way are you leaning @westonruter @pierlon ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
@westonruter The I agree with @johnwatkins0 with regards to moving this discussion to its own issue. |
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
return $actions; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||
* Add a warning to the plugin meta row on the network plugins screen. | ||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||
* @param string[] $plugin_meta An array of the plugin's metadata, including the version, author, author URI, and | ||||||||||||||||||||||||||||||||||||||||||
* plugin URI. | ||||||||||||||||||||||||||||||||||||||||||
* @param string $plugin_file Path to the plugin file relative to the plugins directory. | ||||||||||||||||||||||||||||||||||||||||||
* @return string[] | ||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||
public function add_warning_to_plugin_meta( $plugin_meta, $plugin_file ) { | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @westonruter Same suggestion as above. If you do plan to do something similar to above, this method may not be needed. Instead, you could probably hook into |
||||||||||||||||||||||||||||||||||||||||||
if ( ! is_multisite() || ! wp_is_large_network() ) { | ||||||||||||||||||||||||||||||||||||||||||
return $plugin_meta; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
if ( $plugin_file !== $this->plugin_file ) { | ||||||||||||||||||||||||||||||||||||||||||
return $plugin_meta; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
wp_enqueue_style( 'amp-icons' ); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
$warning = $this->get_warning_icon() . ' ' . esc_html__( 'Large site detected. Deactivation will leave orphaned scheduled events behind.', 'amp' ) . ' ' . $this->get_warning_icon(); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
if ( ! in_array( $warning, $plugin_meta, true ) ) { | ||||||||||||||||||||||||||||||||||||||||||
$plugin_meta[] = $warning; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
return $plugin_meta; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This can be addressed later, but shouldn't both
ScannableURLProvider
andURLScanningContext
be instantiated via the injector?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I have refrained so far from moving this class into the DI architecture, but it could be done easily.