PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.5.1
Jetpack – WP Security, Backup, Speed, & Growth v15.5.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 9 months ago images 2 years ago img 2 years ago js 9 months ago archiveorg-book.php 9 months ago archiveorg.php 9 months ago archives.php 9 months ago bandcamp.php 9 months ago brightcove.php 8 months ago cartodb.php 9 months ago class.filter-embedded-html-objects.php 9 months ago codepen.php 9 months ago crowdsignal.php 8 months ago dailymotion.php 9 months ago descript.php 9 months ago facebook.php 9 months ago flatio.php 9 months ago flickr.php 8 months ago getty.php 9 months ago gist.php 9 months ago googleapps.php 9 months ago googlemaps.php 9 months ago googleplus.php 9 months ago gravatar.php 9 months ago houzz.php 9 months ago inline-pdfs.php 9 months ago instagram.php 9 months ago kickstarter.php 9 months ago mailchimp.php 8 months ago medium.php 9 months ago mixcloud.php 9 months ago others.php 9 months ago pinterest.php 9 months ago presentations.php 9 months ago quiz.php 9 months ago recipe.php 9 months ago scribd.php 9 months ago shortcode-utils.php 9 months ago sitemap.php 9 months ago slideshare.php 9 months ago slideshow.php 9 months ago smartframe.php 9 months ago soundcloud.php 9 months ago spotify.php 9 months ago ted.php 9 months ago tweet.php 9 months ago twitchtv.php 9 months ago twitter-timeline.php 9 months ago twitter.php 9 months ago unavailable.php 9 months ago untappd-menu.php 9 months ago upcoming-events.php 9 months ago ustream.php 9 months ago videopress.php 9 months ago vimeo.php 9 months ago vine.php 9 months ago vr.php 9 months ago wufoo.php 9 months ago youtube.php 7 months 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, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ') });} );</script>' . "\n\n";
231 }
232 }
233