1 | <?php |
||||
2 | /** |
||||
3 | * Block updater. |
||||
4 | * |
||||
5 | * @author Pronamic <[email protected]> |
||||
6 | * @copyright 2005-2021 Pronamic |
||||
7 | * @license GPL-3.0-or-later |
||||
8 | * @package Pronamic\WordPress\Pay |
||||
9 | */ |
||||
10 | |||||
11 | namespace Pronamic\WordPress\Pay\Fundraising; |
||||
12 | |||||
13 | use Pronamic\WordPress\Money\Money; |
||||
14 | use Pronamic\WordPress\Money\Parser; |
||||
15 | use WP_Post; |
||||
16 | |||||
17 | /** |
||||
18 | * Addon. |
||||
19 | * |
||||
20 | * @author Reüel van der Steege |
||||
21 | * @since 1.0.0 |
||||
22 | * @version 1.0.0 |
||||
23 | */ |
||||
24 | class BlockUpdater { |
||||
25 | /** |
||||
26 | * Block names. |
||||
27 | * |
||||
28 | * @var array |
||||
29 | */ |
||||
30 | public $block_names; |
||||
31 | |||||
32 | /** |
||||
33 | * Add raised money. |
||||
34 | * |
||||
35 | * @var Money|null |
||||
36 | */ |
||||
37 | public $add_raised; |
||||
38 | |||||
39 | /** |
||||
40 | * Target amount. |
||||
41 | * |
||||
42 | * @var Money|null |
||||
43 | */ |
||||
44 | public $target_amount; |
||||
45 | |||||
46 | /** |
||||
47 | * Raised amount. |
||||
48 | * |
||||
49 | * @var Money|null |
||||
50 | */ |
||||
51 | public $raised_amount; |
||||
52 | |||||
53 | /** |
||||
54 | * Number of contributions. |
||||
55 | * |
||||
56 | * @var int|null |
||||
57 | */ |
||||
58 | public $contributions; |
||||
59 | |||||
60 | /** |
||||
61 | * Blcok updater constructor. |
||||
62 | */ |
||||
63 | public function __construct() { |
||||
64 | $this->block_names = array( |
||||
65 | 'pronamic-pay/fundraising-progress-circle', |
||||
66 | 'pronamic-pay/fundraising-progress-bar', |
||||
67 | 'pronamic-pay/fundraising-progress-text', |
||||
68 | ); |
||||
69 | } |
||||
70 | |||||
71 | /** |
||||
72 | * Add raised money. |
||||
73 | * |
||||
74 | * @param Money $add Money to add to raised amount. |
||||
75 | * @return void |
||||
76 | */ |
||||
77 | public function add_raised_money( Money $add ) { |
||||
78 | $this->add_raised = $add; |
||||
79 | } |
||||
80 | |||||
81 | /** |
||||
82 | * Update post. |
||||
83 | * |
||||
84 | * @param WP_Post $post Post to update fundraising blocks in. |
||||
85 | */ |
||||
86 | public function update_post( WP_Post $post ) { |
||||
87 | $post_content = $post->post_content; |
||||
88 | |||||
89 | if ( ! \has_blocks( $post_content ) ) { |
||||
90 | return; |
||||
91 | } |
||||
92 | |||||
93 | if ( null === $this->add_raised ) { |
||||
94 | return; |
||||
95 | } |
||||
96 | |||||
97 | $updated_content = $this->update_content( $post_content ); |
||||
98 | |||||
99 | if ( $updated_content === $post_content ) { |
||||
100 | return; |
||||
101 | } |
||||
102 | |||||
103 | // Temporary allow unfiltered HTML for `transform` CSS attribute. |
||||
104 | \add_filter( 'user_has_cap', array( $this, 'allow_unfiltered_html' ), 10, 2 ); |
||||
105 | |||||
106 | \kses_init(); |
||||
107 | |||||
108 | // Update post. |
||||
109 | \wp_update_post( |
||||
110 | array( |
||||
111 | 'ID' => $post->ID, |
||||
112 | 'post_content' => $updated_content, |
||||
113 | ) |
||||
114 | ); |
||||
115 | |||||
116 | \remove_filter( 'user_has_cap', array( $this, 'allow_unfiltered_html' ) ); |
||||
117 | |||||
118 | \kses_init(); |
||||
119 | } |
||||
120 | |||||
121 | /** |
||||
122 | * Allow unfiltered HTML. |
||||
123 | * |
||||
124 | * @param array $attributes CSS attributes. |
||||
125 | * |
||||
126 | * @return array |
||||
127 | */ |
||||
128 | public function allow_unfiltered_html( $capabilities, $capability ) { |
||||
129 | if ( in_array( 'unfiltered_html', $capability, true ) ) { |
||||
130 | $capabilities['unfiltered_html'] = true; |
||||
131 | } |
||||
132 | |||||
133 | return $capabilities; |
||||
134 | } |
||||
135 | |||||
136 | /** |
||||
137 | * Update content. |
||||
138 | * |
||||
139 | * @param string $post_content Post content. |
||||
140 | * @return string |
||||
141 | */ |
||||
142 | public function update_content( $post_content ) { |
||||
143 | $blocks = \parse_blocks( $post_content ); |
||||
144 | |||||
145 | foreach ( $blocks as &$block ) { |
||||
146 | $block = $this->update_block( $block ); |
||||
147 | } |
||||
148 | |||||
149 | // Serialize blocks. |
||||
150 | $updated_content = \serialize_blocks( $blocks ); |
||||
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||||
151 | |||||
152 | return $updated_content; |
||||
153 | } |
||||
154 | |||||
155 | /** |
||||
156 | * Update block. |
||||
157 | * |
||||
158 | * @param array $block Block to update. |
||||
159 | * @return array |
||||
160 | */ |
||||
161 | public function update_block( $block ) { |
||||
162 | // Update fundraising block. |
||||
163 | if ( \in_array( $block['blockName'], $this->block_names, true ) ) { |
||||
164 | $block = $this->update_fundraising_block( $block ); |
||||
165 | } |
||||
166 | |||||
167 | // Update inner blocks. |
||||
168 | if ( \array_key_exists( 'innerBlocks', $block ) ) { |
||||
169 | foreach ( $block['innerBlocks'] as &$inner_block ) { |
||||
170 | $inner_block = $this->update_block( $inner_block ); |
||||
171 | } |
||||
172 | } |
||||
173 | |||||
174 | return $block; |
||||
175 | } |
||||
176 | |||||
177 | /** |
||||
178 | * Update fundraising block. |
||||
179 | * |
||||
180 | * @param array $block Block. |
||||
181 | * @return array |
||||
182 | */ |
||||
183 | public function update_fundraising_block( $block ) { |
||||
184 | $parser = new Parser(); |
||||
185 | |||||
186 | // Get target amount for use when updating innner blocks. |
||||
187 | if ( ! \array_key_exists( 'targetAmount', $block['attrs'] ) ) { |
||||
188 | $block['attrs']['targetAmount'] = 0; |
||||
189 | } |
||||
190 | |||||
191 | // Try parsing `targetAmount` block attribute. |
||||
192 | try { |
||||
193 | $this->target_amount = $parser->parse( $block['attrs']['targetAmount'] ); |
||||
194 | } catch ( \Exception $e ) { |
||||
195 | $this->target_amount = null; |
||||
196 | } |
||||
197 | |||||
198 | // Set raised amount. |
||||
199 | if ( ! \array_key_exists( 'raisedAmount', $block['attrs'] ) ) { |
||||
200 | $block['attrs']['raisedAmount'] = 0; |
||||
201 | } |
||||
202 | |||||
203 | // Try parsing and updating `raisedAmount` block attribute. |
||||
204 | try { |
||||
205 | $this->raised_amount = $parser->parse( $block['attrs']['raisedAmount'] ); |
||||
206 | |||||
207 | $this->raised_amount = $this->raised_amount->add( $this->add_raised ); |
||||
0 ignored issues
–
show
It seems like
$this->add_raised can also be of type null ; however, parameter $addend of Pronamic\WordPress\Money\Money::add() does only seem to accept Pronamic\WordPress\Money\Money , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
208 | |||||
209 | $this->raised_amount->set_currency( $this->add_raised->get_currency() ); |
||||
0 ignored issues
–
show
The method
get_currency() does not exist on null .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. ![]() |
|||||
210 | |||||
211 | // Update block attributes. |
||||
212 | $block['attrs']['raisedAmount'] = \number_format( $this->raised_amount->get_value(), 2, '.', '' ); |
||||
213 | $block['attrs']['currencyCode'] = $this->raised_amount->get_currency()->get_alphabetic_code(); |
||||
214 | $block['attrs']['currencyDecimals'] = $this->raised_amount->get_currency()->get_number_decimals(); |
||||
215 | $block['attrs']['locale'] = str_replace( '_', '-', \get_locale() ); |
||||
216 | } catch ( \Exception $e ) { |
||||
217 | $this->raised_amount = null; |
||||
218 | } |
||||
219 | |||||
220 | // Set number of contributions. |
||||
221 | if ( ! \array_key_exists( 'contributionsValue', $block['attrs'] ) ) { |
||||
222 | $block['attrs']['contributionsValue'] = 0; |
||||
223 | } |
||||
224 | |||||
225 | $this->contributions = 1 + \intval( $block['attrs']['contributionsValue'] ); |
||||
226 | |||||
227 | $block['attrs']['contributionsValue'] = strval( $this->contributions ); |
||||
228 | |||||
229 | return $block; |
||||
230 | } |
||||
231 | } |
||||
232 |