wp-pay /
fundraising
| 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 | * Block 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 $capabilities Capabilities. |
||
| 125 | * @param array $capability Capability. |
||
| 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 ); |
||
| 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 inner 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 ); |
||
| 208 | |||
| 209 | $this->raised_amount->set_currency( $this->add_raised->get_currency() ); |
||
|
0 ignored issues
–
show
|
|||
| 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 |
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.