PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.4.2
Jetpack – WP Security, Backup, Speed, & Growth v12.4.2
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / extensions / blocks / donations / donations.php
jetpack / extensions / blocks / donations Last commit date
donations.php 3 years ago
donations.php
263 lines
1 <?php
2 /**
3 * Donations Block.
4 *
5 * @since 8.x
6 *
7 * @package automattic/jetpack
8 */
9
10 namespace Automattic\Jetpack\Extensions\Donations;
11
12 use Automattic\Jetpack\Blocks;
13 use Jetpack_Gutenberg;
14
15 const FEATURE_NAME = 'donations';
16 const BLOCK_NAME = 'jetpack/' . FEATURE_NAME;
17
18 /**
19 * Registers the block for use in Gutenberg
20 * This is done via an action so that we can disable
21 * registration if we need to.
22 */
23 function register_block() {
24 Blocks::jetpack_register_block(
25 BLOCK_NAME,
26 array(
27 'render_callback' => __NAMESPACE__ . '\render_block',
28 'attributes' => array(
29 'currency' => array(
30 'type' => 'string',
31 'default' => 'USD',
32 ),
33 'oneTimeDonation' => array(
34 'type' => 'object',
35 'default' => array(
36 'show' => true,
37 'planId' => null,
38 'amounts' => array( 5, 15, 100 ),
39 'heading' => __( 'Make a one-time donation', 'jetpack' ),
40 'extraText' => __( 'Your contribution is appreciated.', 'jetpack' ),
41 'buttonText' => __( 'Donate', 'jetpack' ),
42 ),
43 ),
44 'monthlyDonation' => array(
45 'type' => 'object',
46 'default' => array(
47 'show' => true,
48 'planId' => null,
49 'amounts' => array( 5, 15, 100 ),
50 'heading' => __( 'Make a monthly donation', 'jetpack' ),
51 'extraText' => __( 'Your contribution is appreciated.', 'jetpack' ),
52 'buttonText' => __( 'Donate monthly', 'jetpack' ),
53 ),
54 ),
55 'annualDonation' => array(
56 'type' => 'object',
57 'default' => array(
58 'show' => true,
59 'planId' => null,
60 'amounts' => array( 5, 15, 100 ),
61 'heading' => __( 'Make a yearly donation', 'jetpack' ),
62 'extraText' => __( 'Your contribution is appreciated.', 'jetpack' ),
63 'buttonText' => __( 'Donate yearly', 'jetpack' ),
64 ),
65 ),
66 'showCustomAmount' => array(
67 'type' => 'boolean',
68 'default' => true,
69 ),
70 'chooseAmountText' => array(
71 'type' => 'string',
72 'default' => __( 'Choose an amount', 'jetpack' ),
73 ),
74 'customAmountText' => array(
75 'type' => 'string',
76 'default' => __( 'Or enter a custom amount', 'jetpack' ),
77 ),
78 'fallbackLinkUrl' => array(
79 'type' => 'string',
80 ),
81 ),
82 )
83 );
84 }
85 add_action( 'init', __NAMESPACE__ . '\register_block' );
86
87 /**
88 * Donations block dynamic rendering.
89 *
90 * @param array $attr Array containing the Donations block attributes.
91 * @param string $content String containing the Donations block content.
92 *
93 * @return string
94 */
95 function render_block( $attr, $content ) {
96 // Keep content as-is if rendered in other contexts than frontend (i.e. feed, emails, API, etc.).
97 if ( ! jetpack_is_frontend() ) {
98 return $content;
99 }
100
101 require_once JETPACK__PLUGIN_DIR . 'modules/memberships/class-jetpack-memberships.php';
102
103 // If stripe isn't connected don't show anything to potential donors - they can't actually make a donation.
104 if ( ! \Jetpack_Memberships::get_connected_account_id() ) {
105 return '';
106 }
107
108 Jetpack_Gutenberg::load_assets_as_required( FEATURE_NAME, array( 'thickbox' ) );
109 add_thickbox();
110
111 require_once JETPACK__PLUGIN_DIR . '/_inc/lib/class-jetpack-currencies.php';
112
113 $donations = array(
114 'one-time' => array_merge(
115 array(
116 'title' => __( 'One-Time', 'jetpack' ),
117 'class' => 'donations__one-time-item',
118 ),
119 $attr['oneTimeDonation']
120 ),
121 );
122 if ( $attr['monthlyDonation']['show'] ) {
123 $donations['1 month'] = array_merge(
124 array(
125 'title' => __( 'Monthly', 'jetpack' ),
126 'class' => 'donations__monthly-item',
127 ),
128 $attr['monthlyDonation']
129 );
130 }
131 if ( $attr['annualDonation']['show'] ) {
132 $donations['1 year'] = array_merge(
133 array(
134 'title' => __( 'Yearly', 'jetpack' ),
135 'class' => 'donations__annual-item',
136 ),
137 $attr['annualDonation']
138 );
139 }
140
141 $currency = $attr['currency'];
142 $nav = '';
143 $headings = '';
144 $amounts = '';
145 $extra_text = '';
146 $buttons = '';
147 foreach ( $donations as $interval => $donation ) {
148 $plan_id = (int) $donation['planId'];
149 $plan = get_post( $plan_id );
150 if ( ! $plan || is_wp_error( $plan ) ) {
151 continue;
152 }
153
154 if ( count( $donations ) > 1 ) {
155 if ( ! $nav ) {
156 $nav .= '<div class="donations__nav">';
157 }
158 $nav .= sprintf(
159 '<div role="button" tabindex="0" class="donations__nav-item" data-interval="%1$s">%2$s</div>',
160 esc_attr( $interval ),
161 esc_html( $donation['title'] )
162 );
163 }
164 $headings .= sprintf(
165 '<h4 class="%1$s">%2$s</h4>',
166 esc_attr( $donation['class'] ),
167 wp_kses_post( $donation['heading'] )
168 );
169 $amounts .= sprintf(
170 '<div class="donations__amounts %s">',
171 esc_attr( $donation['class'] )
172 );
173 foreach ( $donation['amounts'] as $amount ) {
174 $amounts .= sprintf(
175 '<div class="donations__amount" data-amount="%1$s">%2$s</div>',
176 esc_attr( $amount ),
177 esc_html( \Jetpack_Currencies::format_price( $amount, $currency ) )
178 );
179 }
180 $amounts .= '</div>';
181 $extra_text .= sprintf(
182 '<p class="%1$s">%2$s</p>',
183 esc_attr( $donation['class'] ),
184 wp_kses_post( $donation['extraText'] )
185 );
186 $buttons .= sprintf(
187 '<a class="wp-block-button__link donations__donate-button %1$s" href="%2$s">%3$s</a>',
188 esc_attr( $donation['class'] ),
189 esc_url( \Jetpack_Memberships::get_instance()->get_subscription_url( $plan_id ) ),
190 wp_kses_post( $donation['buttonText'] )
191 );
192 }
193 if ( $nav ) {
194 $nav .= '</div>';
195 }
196
197 $custom_amount = '';
198 if ( $attr['showCustomAmount'] ) {
199 $custom_amount .= sprintf(
200 '<p>%s</p>',
201 wp_kses_post( $attr['customAmountText'] )
202 );
203 $default_custom_amount = \Jetpack_Memberships::SUPPORTED_CURRENCIES[ $currency ] * 100;
204 $custom_amount .= sprintf(
205 '<div class="donations__amount donations__custom-amount">
206 %1$s
207 <div class="donations__amount-value" data-currency="%2$s" data-empty-text="%3$s"></div>
208 </div>',
209 esc_html( \Jetpack_Currencies::CURRENCIES[ $attr['currency'] ]['symbol'] ),
210 esc_attr( $attr['currency'] ),
211 esc_attr( \Jetpack_Currencies::format_price( $default_custom_amount, $currency, false ) )
212 );
213 }
214
215 return sprintf(
216 '
217 <div class="%1$s">
218 <div class="donations__container">
219 %2$s
220 <div class="donations__content">
221 <div class="donations__tab">
222 %3$s
223 <p>%4$s</p>
224 %5$s
225 %6$s
226 <hr class="donations__separator">
227 %7$s
228 %8$s
229 </div>
230 </div>
231 </div>
232 </div>
233 ',
234 esc_attr( Blocks::classes( FEATURE_NAME, $attr ) ),
235 $nav,
236 $headings,
237 $attr['chooseAmountText'],
238 $amounts,
239 $custom_amount,
240 $extra_text,
241 $buttons
242 );
243 }
244
245 /**
246 * Determine if AMP should be disabled on posts having Donations blocks.
247 *
248 * @param bool $skip Skipped.
249 * @param int $post_id Post ID.
250 * @param WP_Post $post Post.
251 *
252 * @return bool Whether to skip the post from AMP.
253 */
254 function amp_skip_post( $skip, $post_id, $post ) {
255 // When AMP is on standard mode, there are no non-AMP posts to link to where the donation can be completed, so let's
256 // prevent the post from being available in AMP.
257 if ( function_exists( 'amp_is_canonical' ) && \amp_is_canonical() && has_block( BLOCK_NAME, $post->post_content ) ) {
258 return true;
259 }
260 return $skip;
261 }
262 add_filter( 'amp_skip_post', __NAMESPACE__ . '\amp_skip_post', 10, 3 );
263