PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.1.3
Jetpack – WP Security, Backup, Speed, & Growth v12.1.3
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
264 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 'plan_check' => true,
29 'attributes' => array(
30 'currency' => array(
31 'type' => 'string',
32 'default' => 'USD',
33 ),
34 'oneTimeDonation' => array(
35 'type' => 'object',
36 'default' => array(
37 'show' => true,
38 'planId' => null,
39 'amounts' => array( 5, 15, 100 ),
40 'heading' => __( 'Make a one-time donation', 'jetpack' ),
41 'extraText' => __( 'Your contribution is appreciated.', 'jetpack' ),
42 'buttonText' => __( 'Donate', 'jetpack' ),
43 ),
44 ),
45 'monthlyDonation' => array(
46 'type' => 'object',
47 'default' => array(
48 'show' => true,
49 'planId' => null,
50 'amounts' => array( 5, 15, 100 ),
51 'heading' => __( 'Make a monthly donation', 'jetpack' ),
52 'extraText' => __( 'Your contribution is appreciated.', 'jetpack' ),
53 'buttonText' => __( 'Donate monthly', 'jetpack' ),
54 ),
55 ),
56 'annualDonation' => array(
57 'type' => 'object',
58 'default' => array(
59 'show' => true,
60 'planId' => null,
61 'amounts' => array( 5, 15, 100 ),
62 'heading' => __( 'Make a yearly donation', 'jetpack' ),
63 'extraText' => __( 'Your contribution is appreciated.', 'jetpack' ),
64 'buttonText' => __( 'Donate yearly', 'jetpack' ),
65 ),
66 ),
67 'showCustomAmount' => array(
68 'type' => 'boolean',
69 'default' => true,
70 ),
71 'chooseAmountText' => array(
72 'type' => 'string',
73 'default' => __( 'Choose an amount', 'jetpack' ),
74 ),
75 'customAmountText' => array(
76 'type' => 'string',
77 'default' => __( 'Or enter a custom amount', 'jetpack' ),
78 ),
79 'fallbackLinkUrl' => array(
80 'type' => 'string',
81 ),
82 ),
83 )
84 );
85 }
86 add_action( 'init', __NAMESPACE__ . '\register_block' );
87
88 /**
89 * Donations block dynamic rendering.
90 *
91 * @param array $attr Array containing the Donations block attributes.
92 * @param string $content String containing the Donations block content.
93 *
94 * @return string
95 */
96 function render_block( $attr, $content ) {
97 // Keep content as-is if rendered in other contexts than frontend (i.e. feed, emails, API, etc.).
98 if ( ! jetpack_is_frontend() ) {
99 return $content;
100 }
101
102 require_once JETPACK__PLUGIN_DIR . 'modules/memberships/class-jetpack-memberships.php';
103
104 // If stripe isn't connected don't show anything to potential donors - they can't actually make a donation.
105 if ( ! \Jetpack_Memberships::get_connected_account_id() ) {
106 return '';
107 }
108
109 Jetpack_Gutenberg::load_assets_as_required( FEATURE_NAME, array( 'thickbox' ) );
110 add_thickbox();
111
112 require_once JETPACK__PLUGIN_DIR . '/_inc/lib/class-jetpack-currencies.php';
113
114 $donations = array(
115 'one-time' => array_merge(
116 array(
117 'title' => __( 'One-Time', 'jetpack' ),
118 'class' => 'donations__one-time-item',
119 ),
120 $attr['oneTimeDonation']
121 ),
122 );
123 if ( $attr['monthlyDonation']['show'] ) {
124 $donations['1 month'] = array_merge(
125 array(
126 'title' => __( 'Monthly', 'jetpack' ),
127 'class' => 'donations__monthly-item',
128 ),
129 $attr['monthlyDonation']
130 );
131 }
132 if ( $attr['annualDonation']['show'] ) {
133 $donations['1 year'] = array_merge(
134 array(
135 'title' => __( 'Yearly', 'jetpack' ),
136 'class' => 'donations__annual-item',
137 ),
138 $attr['annualDonation']
139 );
140 }
141
142 $currency = $attr['currency'];
143 $nav = '';
144 $headings = '';
145 $amounts = '';
146 $extra_text = '';
147 $buttons = '';
148 foreach ( $donations as $interval => $donation ) {
149 $plan_id = (int) $donation['planId'];
150 $plan = get_post( $plan_id );
151 if ( ! $plan || is_wp_error( $plan ) ) {
152 continue;
153 }
154
155 if ( count( $donations ) > 1 ) {
156 if ( ! $nav ) {
157 $nav .= '<div class="donations__nav">';
158 }
159 $nav .= sprintf(
160 '<div role="button" tabindex="0" class="donations__nav-item" data-interval="%1$s">%2$s</div>',
161 esc_attr( $interval ),
162 esc_html( $donation['title'] )
163 );
164 }
165 $headings .= sprintf(
166 '<h4 class="%1$s">%2$s</h4>',
167 esc_attr( $donation['class'] ),
168 wp_kses_post( $donation['heading'] )
169 );
170 $amounts .= sprintf(
171 '<div class="donations__amounts %s">',
172 esc_attr( $donation['class'] )
173 );
174 foreach ( $donation['amounts'] as $amount ) {
175 $amounts .= sprintf(
176 '<div class="donations__amount" data-amount="%1$s">%2$s</div>',
177 esc_attr( $amount ),
178 esc_html( \Jetpack_Currencies::format_price( $amount, $currency ) )
179 );
180 }
181 $amounts .= '</div>';
182 $extra_text .= sprintf(
183 '<p class="%1$s">%2$s</p>',
184 esc_attr( $donation['class'] ),
185 wp_kses_post( $donation['extraText'] )
186 );
187 $buttons .= sprintf(
188 '<a class="wp-block-button__link donations__donate-button %1$s" href="%2$s">%3$s</a>',
189 esc_attr( $donation['class'] ),
190 esc_url( \Jetpack_Memberships::get_instance()->get_subscription_url( $plan_id ) ),
191 wp_kses_post( $donation['buttonText'] )
192 );
193 }
194 if ( $nav ) {
195 $nav .= '</div>';
196 }
197
198 $custom_amount = '';
199 if ( $attr['showCustomAmount'] ) {
200 $custom_amount .= sprintf(
201 '<p>%s</p>',
202 wp_kses_post( $attr['customAmountText'] )
203 );
204 $default_custom_amount = \Jetpack_Memberships::SUPPORTED_CURRENCIES[ $currency ] * 100;
205 $custom_amount .= sprintf(
206 '<div class="donations__amount donations__custom-amount">
207 %1$s
208 <div class="donations__amount-value" data-currency="%2$s" data-empty-text="%3$s"></div>
209 </div>',
210 esc_html( \Jetpack_Currencies::CURRENCIES[ $attr['currency'] ]['symbol'] ),
211 esc_attr( $attr['currency'] ),
212 esc_attr( \Jetpack_Currencies::format_price( $default_custom_amount, $currency, false ) )
213 );
214 }
215
216 return sprintf(
217 '
218 <div class="%1$s">
219 <div class="donations__container">
220 %2$s
221 <div class="donations__content">
222 <div class="donations__tab">
223 %3$s
224 <p>%4$s</p>
225 %5$s
226 %6$s
227 <hr class="donations__separator">
228 %7$s
229 %8$s
230 </div>
231 </div>
232 </div>
233 </div>
234 ',
235 esc_attr( Blocks::classes( FEATURE_NAME, $attr ) ),
236 $nav,
237 $headings,
238 $attr['chooseAmountText'],
239 $amounts,
240 $custom_amount,
241 $extra_text,
242 $buttons
243 );
244 }
245
246 /**
247 * Determine if AMP should be disabled on posts having Donations blocks.
248 *
249 * @param bool $skip Skipped.
250 * @param int $post_id Post ID.
251 * @param WP_Post $post Post.
252 *
253 * @return bool Whether to skip the post from AMP.
254 */
255 function amp_skip_post( $skip, $post_id, $post ) {
256 // When AMP is on standard mode, there are no non-AMP posts to link to where the donation can be completed, so let's
257 // prevent the post from being available in AMP.
258 if ( function_exists( 'amp_is_canonical' ) && \amp_is_canonical() && has_block( BLOCK_NAME, $post->post_content ) ) {
259 return true;
260 }
261 return $skip;
262 }
263 add_filter( 'amp_skip_post', __NAMESPACE__ . '\amp_skip_post', 10, 3 );
264