PluginProbe
GiveWP – Donation Plugin and Fundraising Platform / 4.16.9
GiveWP – Donation Plugin and Fundraising Platform v4.16.9
4.16.9 4.16.8.1 4.16.8 4.16.7.2 4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 All 255 releases
give / src / DonationForms / Actions / IsolateEnqueuedFormViewAssets.php

IsolateEnqueuedFormViewAssets.php in GiveWP – Donation Plugin and Fundraising Platform 4.16.9, at src/DonationForms/Actions/IsolateEnqueuedFormViewAssets.php

94 lines 3.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Give\DonationForms\Actions;
4
5 use WP_Dependencies;
6
7 /**
8 * Pins the script and style queues to what has already been enqueued, so a form view route prints
9 * its own assets and nothing else.
10 *
11 * The form view routes render a standalone document by calling wp_print_styles(),
12 * wp_print_head_scripts() and wp_print_footer_scripts() directly. Each of those fires an action that
13 * plugins legitimately enqueue from, so the queues keep growing after the route has finished
14 * enqueuing. Constraining the handles at print time, instead of dequeuing on a hook, keeps the route
15 * independent of the priority the other plugin picked.
16 *
17 * @since 4.16.7
18 */
19 class IsolateEnqueuedFormViewAssets
20 {
21 /**
22 * @since 4.16.7
23 */
24 public function __invoke(): void
25 {
26 $this->pinQueue(wp_scripts(), 'print_scripts_array', 'scripts');
27 $this->pinQueue(wp_styles(), 'print_styles_array', 'styles');
28 }
29
30 /**
31 * @since 4.16.7
32 *
33 * @param WP_Dependencies $dependencies The queue to pin.
34 * @param string $filter Print-time filter the queue is constrained through.
35 * @param string $type Either "scripts" or "styles".
36 */
37 private function pinQueue(WP_Dependencies $dependencies, string $filter, string $type): void
38 {
39 $allowedHandles = $this->expandDependencies($dependencies, $dependencies->queue);
40
41 /**
42 * Filters the handles a donation form view route may print. Add a handle here to let an
43 * asset enqueued after the form has been prepared through to the rendered form.
44 *
45 * @since 4.16.7
46 *
47 * @param string[] $allowedHandles Handles the route will print.
48 * @param string $type Either "scripts" or "styles".
49 */
50 $allowedHandles = apply_filters(
51 'givewp_donation_form_view_allowed_asset_handles',
52 $allowedHandles,
53 $type
54 );
55
56 add_filter($filter, static function ($handles) use ($allowedHandles) {
57 return array_values(array_intersect($handles, $allowedHandles));
58 });
59 }
60
61 /**
62 * Resolves the given handles together with everything they depend on. Registered dependencies
63 * may be cyclic, so handles are only ever visited once.
64 *
65 * @since 4.16.7
66 *
67 * @param WP_Dependencies $dependencies Queue the handles are registered in.
68 * @param string[] $handles Handles to resolve.
69 *
70 * @return string[]
71 */
72 private function expandDependencies(WP_Dependencies $dependencies, array $handles): array
73 {
74 $resolved = [];
75
76 while ($handles) {
77 /* WordPress allows arguments to be appended to a queued handle. */
78 $handle = explode('?', (string)array_shift($handles))[0];
79
80 if (isset($resolved[$handle])) {
81 continue;
82 }
83
84 $resolved[$handle] = true;
85
86 if (isset($dependencies->registered[$handle])) {
87 $handles = array_merge($handles, $dependencies->registered[$handle]->deps);
88 }
89 }
90
91 return array_keys($resolved);
92 }
93 }
94