PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.2.1
Jetpack – WP Security, Backup, Speed, & Growth v15.2.1
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 / modules / shortcodes / mailchimp.php
jetpack / modules / shortcodes Last commit date
css 10 months ago images 2 years ago img 2 years ago js 9 months ago archiveorg-book.php 1 year ago archiveorg.php 1 year ago archives.php 1 year ago bandcamp.php 11 months ago brightcove.php 1 year ago cartodb.php 1 year ago class.filter-embedded-html-objects.php 1 year ago codepen.php 1 year ago crowdsignal.php 9 months ago dailymotion.php 1 year ago descript.php 1 year ago facebook.php 1 year ago flatio.php 1 year ago flickr.php 11 months ago getty.php 1 year ago gist.php 1 year ago googleapps.php 1 year ago googlemaps.php 1 year ago googleplus.php 1 year ago gravatar.php 1 year ago houzz.php 1 year ago inline-pdfs.php 1 year ago instagram.php 1 year ago kickstarter.php 1 year ago mailchimp.php 1 year ago medium.php 1 year ago mixcloud.php 1 year ago others.php 1 year ago pinterest.php 1 year ago presentations.php 1 year ago quiz.php 1 year ago recipe.php 11 months ago scribd.php 1 year ago shortcode-utils.php 1 year ago sitemap.php 1 year ago slideshare.php 9 months ago slideshow.php 11 months ago smartframe.php 1 year ago soundcloud.php 1 year ago spotify.php 1 year ago ted.php 11 months ago tweet.php 1 year ago twitchtv.php 1 year ago twitter-timeline.php 1 year ago twitter.php 1 year ago unavailable.php 1 year ago untappd-menu.php 1 year ago upcoming-events.php 1 year ago ustream.php 1 year ago videopress.php 1 year ago vimeo.php 1 year ago vine.php 1 year ago vr.php 1 year ago wufoo.php 1 year ago youtube.php 1 year ago
mailchimp.php
233 lines
1 <?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * MailChimp Subscriber Popup Form shortcode
4 *
5 * Example:
6 * [mailchimp_subscriber_popup baseUrl="mc.us11.list-manage.com" uuid="1ca7856462585a934b8674c71" lid="2d24f1898b"]
7 *
8 * Embed code example:
9 * <script type="text/javascript" src="//downloads.mailchimp.com/js/signup-forms/popup/unique-methods/embed.js" data-dojo-config="usePlainJson: true, isDebug: false"></script><script type="text/javascript">window.dojoRequire(["mojo/signup-forms/Loader"], function(L) { L.start({"baseUrl":"mc.us11.list-manage.com","uuid":"1ca7856462585a934b8674c71","lid":"2d24f1898b","uniqueMethods":true}) })</script>
10 */
11
12 if ( ! defined( 'ABSPATH' ) ) {
13 exit( 0 );
14 }
15
16 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files.
17
18 /**
19 * Register [mailchimp_subscriber_popup] shortcode and add a filter to 'pre_kses' queue to reverse MailChimp embed to shortcode.
20 *
21 * @since 4.5.0
22 */
23 function jetpack_mailchimp_subscriber_popup() {
24 add_shortcode(
25 'mailchimp_subscriber_popup',
26 array(
27 'MailChimp_Subscriber_Popup',
28 'shortcode',
29 )
30 );
31
32 if ( jetpack_shortcodes_should_hook_pre_kses() ) {
33 add_filter(
34 'pre_kses',
35 array(
36 'MailChimp_Subscriber_Popup',
37 'reversal',
38 )
39 );
40 }
41 }
42
43 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
44 add_action( 'init', 'jetpack_mailchimp_subscriber_popup' );
45 } else {
46 jetpack_mailchimp_subscriber_popup();
47 }
48
49 /**
50 * Class MailChimp_Subscriber_Popup
51 *
52 * @since 4.5.0
53 */
54 class MailChimp_Subscriber_Popup {
55
56 /**
57 * Regular expressions to reverse script tags to shortcodes.
58 *
59 * @var array
60 */
61 private static $reversal_regexes = array(
62 /* raw examplejs */
63 '/<script type="text\/javascript" src="(https?:)?\/\/downloads\.mailchimp\.com\/js\/signup-forms\/popup\/unique-methods\/embed\.js" data-dojo-config="([^"]*?)"><\/script><script type="text\/javascript">window.dojoRequire\(\["mojo\/signup-forms\/Loader"\]\, function\(L\) { L\.start\({([^}]*?)}\) }\)<\/script>/s', //phpcs:ignore
64 /* visual editor */
65 '/&lt;script type="text\/javascript" src="(https?:)?\/\/downloads\.mailchimp\.com\/js\/signup-forms\/popup\/unique-methods\/embed\.js" data-dojo-config="([^"]*?)"&gt;&lt;\/script&gt;&lt;script type="text\/javascript"&gt;window.dojoRequire\(\["mojo\/signup-forms\/Loader"]\, function\(L\) { L\.start\({([^}]*?)}\) }\)&lt;\/script&gt;/s',
66 );
67
68 /**
69 * Allowed configuration attributes. Used in reversal when checking allowed attributes.
70 *
71 * @var array
72 */
73 private static $allowed_config = array(
74 'usePlainJson' => 'true',
75 'isDebug' => 'false',
76 );
77
78 /**
79 * Allowed JS variables. Used in reversal to whitelist variables.
80 *
81 * @var array
82 */
83 private static $allowed_js_vars = array(
84 'baseUrl',
85 'uuid',
86 'lid',
87 );
88
89 /**
90 * Runs the whole reversal.
91 *
92 * @since 4.5.0
93 *
94 * @param string $content Post Content.
95 *
96 * @return string Content with embeds replaced
97 */
98 public static function reversal( $content ) {
99 // Bail without the js src.
100 if ( ! is_string( $content ) || false === stripos( $content, 'downloads.mailchimp.com/js/signup-forms/popup/unique-methods/embed.js' ) ) {
101 return $content;
102 }
103
104 // loop through our rules and find valid embeds.
105 foreach ( self::$reversal_regexes as $regex ) {
106
107 if ( ! preg_match_all( $regex, $content, $matches ) ) {
108 continue;
109 }
110
111 foreach ( $matches[3] as $index => $js_vars ) {
112 // the regex rule for a specific embed.
113 $replace_regex = sprintf( '#\s*%s\s*#', preg_quote( $matches[0][ $index ], '#' ) );
114
115 $attrs = json_decode( '{' . $js_vars . '}' );
116
117 if ( $matches[2][ $index ] ) {
118 $config_attrs = json_decode( '{' . $matches[2][ $index ] . '}' );
119 foreach ( $config_attrs as $key => $value ) {
120 $attrs->$key = ( 1 === $value ) ? 'true' : 'false';
121 }
122 }
123
124 $shortcode = self::build_shortcode_from_reversal_attrs( $attrs );
125
126 $content = preg_replace( $replace_regex, "\n\n$shortcode\n\n", $content );
127
128 /** This action is documented in modules/widgets/social-media-icons.php */
129 do_action( 'jetpack_bump_stats_extras', 'html_to_shortcode', 'mailchimp_subscriber_popup' );
130 }
131 }
132
133 return $content;
134 }
135
136 /**
137 * Builds the actual shortcode based on passed in attributes.
138 *
139 * @since 4.5.0
140 *
141 * @param array $attrs A valid list of attributes (gets matched against self::$allowed_config and self::$allowed_js_vars).
142 *
143 * @return string
144 */
145 private static function build_shortcode_from_reversal_attrs( $attrs ) {
146 $shortcode = '[mailchimp_subscriber_popup ';
147
148 foreach ( $attrs as $key => $value ) {
149 // skip unsupported keys.
150 if (
151 ! array_key_exists( $key, self::$allowed_config )
152 && ! in_array( $key, self::$allowed_js_vars, true )
153 ) {
154 continue;
155 }
156
157 $value = esc_attr( $value );
158 $shortcode .= "$key='$value' ";
159 }
160 return trim( $shortcode ) . ']';
161 }
162
163 /**
164 * Parses the shortcode back out to embedded information.
165 *
166 * @since 4.5.0
167 *
168 * @param array $lcase_attrs Lowercase shortcode attributes.
169 *
170 * @return string
171 */
172 public static function shortcode( $lcase_attrs ) {
173 static $displayed_once = false;
174
175 // Limit to one form per page load.
176 if ( $displayed_once ) {
177 return '';
178 }
179
180 if ( empty( $lcase_attrs ) ) {
181 return '<!-- Missing MailChimp baseUrl, uuid or lid -->';
182 }
183
184 $defaults = array_fill_keys( self::$allowed_js_vars, '' );
185 $defaults = array_merge( $defaults, self::$allowed_config );
186
187 // Convert $attrs back to proper casing since they come through in all lowercase.
188 $attrs = array();
189 foreach ( $defaults as $key => $value ) {
190 if ( array_key_exists( strtolower( $key ), $lcase_attrs ) ) {
191 $attrs[ $key ] = $lcase_attrs[ strtolower( $key ) ];
192 }
193 }
194 $attrs = array_map( 'esc_js', array_filter( shortcode_atts( $defaults, $attrs ) ) );
195
196 // Split config & js vars.
197 $js_vars = array();
198 $config_vars = array();
199 foreach ( $attrs as $key => $value ) {
200 if (
201 'baseUrl' === $key
202 && (
203 ! preg_match( '#mc\.us\d+\.list-manage\d?\.com#', $value, $matches )
204 || $value !== $matches[0]
205 )
206 ) {
207 return '<!-- Invalid MailChimp baseUrl -->';
208 }
209
210 if ( in_array( $key, self::$allowed_js_vars, true ) ) {
211 $js_vars[ $key ] = $value;
212 } else {
213 $config_vars[] = "$key: $value";
214 }
215 }
216
217 // If one of these parameters is missing we can't render the form so exist.
218 if ( empty( $js_vars['baseUrl'] ) || empty( $js_vars['uuid'] ) || empty( $js_vars['lid'] ) ) {
219 return '<!-- Missing MailChimp baseUrl, uuid or lid -->';
220 }
221
222 // Add a uniqueMethods parameter if it is missing from the data we got from the embed code.
223 $js_vars['uniqueMethods'] = true;
224
225 /** This action is already documented in modules/widgets/gravatar-profile.php */
226 do_action( 'jetpack_stats_extra', 'mailchimp_subscriber_popup', 'view' );
227
228 $displayed_once = true;
229
230 return "\n\n" . '<script type="text/javascript" data-dojo-config="' . esc_attr( implode( ', ', $config_vars ) ) . '">jQuery.getScript( "//downloads.mailchimp.com/js/signup-forms/popup/unique-methods/embed.js", function( data, textStatus, jqxhr ) { window.dojoRequire(["mojo/signup-forms/Loader"], function(L) { L.start(' . wp_json_encode( $js_vars ) . ') });} );</script>' . "\n\n";
231 }
232 }
233