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