PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.3.3
Jetpack – WP Security, Backup, Speed, & Growth v13.3.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 2 years ago
donations.php
205 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 /**
16 * Registers the block for use in Gutenberg
17 * This is done via an action so that we can disable
18 * registration if we need to.
19 */
20 function register_block() {
21 Blocks::jetpack_register_block(
22 __DIR__,
23 array(
24 'render_callback' => __NAMESPACE__ . '\render_block',
25 )
26 );
27 }
28 add_action( 'init', __NAMESPACE__ . '\register_block' );
29
30 /**
31 * Donations block dynamic rendering.
32 *
33 * @param array $attr Array containing the Donations block attributes.
34 * @param string $content String containing the Donations block content.
35 *
36 * @return string
37 */
38 function render_block( $attr, $content ) {
39 // Keep content as-is if rendered in other contexts than frontend (i.e. feed, emails, API, etc.).
40 if ( ! jetpack_is_frontend() ) {
41 return $content;
42 }
43
44 require_once JETPACK__PLUGIN_DIR . 'modules/memberships/class-jetpack-memberships.php';
45
46 // If stripe isn't connected don't show anything to potential donors - they can't actually make a donation.
47 if ( ! \Jetpack_Memberships::has_connected_account() ) {
48 return '';
49 }
50
51 Jetpack_Gutenberg::load_assets_as_required( __DIR__ );
52
53 require_once JETPACK__PLUGIN_DIR . '/_inc/lib/class-jetpack-currencies.php';
54
55 $donations = array(
56 'one-time' => array_merge(
57 array(
58 'title' => __( 'One-Time', 'jetpack' ),
59 'class' => 'donations__one-time-item',
60 ),
61 $attr['oneTimeDonation']
62 ),
63 );
64 if ( $attr['monthlyDonation']['show'] ) {
65 $donations['1 month'] = array_merge(
66 array(
67 'title' => __( 'Monthly', 'jetpack' ),
68 'class' => 'donations__monthly-item',
69 ),
70 $attr['monthlyDonation']
71 );
72 }
73 if ( $attr['annualDonation']['show'] ) {
74 $donations['1 year'] = array_merge(
75 array(
76 'title' => __( 'Yearly', 'jetpack' ),
77 'class' => 'donations__annual-item',
78 ),
79 $attr['annualDonation']
80 );
81 }
82
83 $currency = $attr['currency'];
84 $nav = '';
85 $headings = '';
86 $amounts = '';
87 $extra_text = '';
88 $buttons = '';
89 foreach ( $donations as $interval => $donation ) {
90 $plan_id = (int) $donation['planId'];
91 $plan = get_post( $plan_id );
92 if ( ! $plan || is_wp_error( $plan ) ) {
93 continue;
94 }
95
96 if ( count( $donations ) > 1 ) {
97 if ( ! $nav ) {
98 $nav .= '<div class="donations__nav">';
99 }
100 $nav .= sprintf(
101 '<div role="button" tabindex="0" class="donations__nav-item" data-interval="%1$s">%2$s</div>',
102 esc_attr( $interval ),
103 esc_html( $donation['title'] )
104 );
105 }
106 $headings .= sprintf(
107 '<h4 class="%1$s">%2$s</h4>',
108 esc_attr( $donation['class'] ),
109 wp_kses_post( $donation['heading'] )
110 );
111 $amounts .= sprintf(
112 '<div class="donations__amounts %s">',
113 esc_attr( $donation['class'] )
114 );
115 foreach ( $donation['amounts'] as $amount ) {
116 $amounts .= sprintf(
117 '<div class="donations__amount" data-amount="%1$s">%2$s</div>',
118 esc_attr( $amount ),
119 esc_html( \Jetpack_Currencies::format_price( $amount, $currency ) )
120 );
121 }
122 $amounts .= '</div>';
123 $extra_text .= sprintf(
124 '<p class="%1$s">%2$s</p>',
125 esc_attr( $donation['class'] ),
126 wp_kses_post( $donation['extraText'] )
127 );
128 $buttons .= sprintf(
129 '<a class="wp-block-button__link donations__donate-button %1$s" href="%2$s">%3$s</a>',
130 esc_attr( $donation['class'] ),
131 esc_url( \Jetpack_Memberships::get_instance()->get_subscription_url( $plan_id ) ),
132 wp_kses_post( $donation['buttonText'] )
133 );
134 }
135 if ( $nav ) {
136 $nav .= '</div>';
137 }
138
139 $custom_amount = '';
140 if ( $attr['showCustomAmount'] ) {
141 $custom_amount .= sprintf(
142 '<p>%s</p>',
143 wp_kses_post( $attr['customAmountText'] )
144 );
145 $default_custom_amount = \Jetpack_Memberships::SUPPORTED_CURRENCIES[ $currency ] * 100;
146 $custom_amount .= sprintf(
147 '<div class="donations__amount donations__custom-amount">
148 %1$s
149 <div class="donations__amount-value" data-currency="%2$s" data-empty-text="%3$s"></div>
150 </div>',
151 esc_html( \Jetpack_Currencies::CURRENCIES[ $attr['currency'] ]['symbol'] ),
152 esc_attr( $attr['currency'] ),
153 esc_attr( \Jetpack_Currencies::format_price( $default_custom_amount, $currency, false ) )
154 );
155 }
156
157 return sprintf(
158 '
159 <div class="%1$s">
160 <div class="donations__container">
161 %2$s
162 <div class="donations__content">
163 <div class="donations__tab">
164 %3$s
165 <p>%4$s</p>
166 %5$s
167 %6$s
168 <hr class="donations__separator">
169 %7$s
170 %8$s
171 </div>
172 </div>
173 </div>
174 </div>
175 ',
176 esc_attr( Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attr ) ),
177 $nav,
178 $headings,
179 $attr['chooseAmountText'],
180 $amounts,
181 $custom_amount,
182 $extra_text,
183 $buttons
184 );
185 }
186
187 /**
188 * Determine if AMP should be disabled on posts having Donations blocks.
189 *
190 * @param bool $skip Skipped.
191 * @param int $post_id Post ID.
192 * @param WP_Post $post Post.
193 *
194 * @return bool Whether to skip the post from AMP.
195 */
196 function amp_skip_post( $skip, $post_id, $post ) {
197 // When AMP is on standard mode, there are no non-AMP posts to link to where the donation can be completed, so let's
198 // prevent the post from being available in AMP.
199 if ( function_exists( 'amp_is_canonical' ) && \amp_is_canonical() && has_block( Blocks::get_block_name( __DIR__ ), $post->post_content ) ) {
200 return true;
201 }
202 return $skip;
203 }
204 add_filter( 'amp_skip_post', __NAMESPACE__ . '\amp_skip_post', 10, 3 );
205