PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
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 1 month ago images 1 year ago img 2 months ago js 7 months ago archiveorg-book.php 7 months ago archiveorg.php 1 month ago archives.php 1 week ago bandcamp.php 7 months ago brightcove.php 6 months ago cartodb.php 7 months ago class.filter-embedded-html-objects.php 7 months ago codepen.php 7 months ago crowdsignal.php 6 months ago dailymotion.php 7 months ago descript.php 7 months ago facebook.php 7 months ago flatio.php 7 months ago flickr.php 7 months ago getty.php 7 months ago gist.php 7 months ago googleapps.php 7 months ago googlemaps.php 1 month ago googleplus.php 7 months ago gravatar.php 7 months ago houzz.php 7 months ago inline-pdfs.php 7 months ago instagram.php 7 months ago kickstarter.php 7 months ago mailchimp.php 1 month ago medium.php 7 months ago mixcloud.php 7 months ago others.php 7 months ago pinterest.php 7 months ago presentations.php 7 months ago quiz.php 7 months ago recipe.php 2 weeks ago scribd.php 7 months ago shortcode-utils.php 7 months ago sitemap.php 7 months ago slideshare.php 7 months ago slideshow.php 2 weeks ago smartframe.php 7 months ago soundcloud.php 1 month ago spotify.php 7 months ago ted.php 7 months ago tweet.php 7 months ago twitchtv.php 2 weeks ago twitter-timeline.php 7 months ago twitter.php 7 months ago unavailable.php 7 months ago untappd-menu.php 7 months ago upcoming-events.php 7 months ago ustream.php 7 months ago videopress.php 7 months ago vimeo.php 1 month ago vine.php 7 months ago vr.php 1 month ago wufoo.php 7 months ago youtube.php 4 months ago
mailchimp.php
230 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 // If JSON is garbage, skip.
117 if ( ! $attrs ) {
118 continue;
119 }
120
121 $shortcode = self::build_shortcode_from_reversal_attrs( $attrs );
122
123 $content = preg_replace( $replace_regex, "\n\n$shortcode\n\n", $content );
124
125 /** This action is documented in modules/widgets/social-media-icons.php */
126 do_action( 'jetpack_bump_stats_extras', 'html_to_shortcode', 'mailchimp_subscriber_popup' );
127 }
128 }
129
130 return $content;
131 }
132
133 /**
134 * Builds the actual shortcode based on passed in attributes.
135 *
136 * @since 4.5.0
137 *
138 * @param array $attrs A valid list of attributes (gets matched against self::$allowed_config and self::$allowed_js_vars).
139 *
140 * @return string
141 */
142 private static function build_shortcode_from_reversal_attrs( $attrs ) {
143 $shortcode = '[mailchimp_subscriber_popup ';
144
145 foreach ( $attrs as $key => $value ) {
146 // skip unsupported keys.
147 if (
148 ! array_key_exists( $key, self::$allowed_config )
149 && ! in_array( $key, self::$allowed_js_vars, true )
150 ) {
151 continue;
152 }
153
154 $value = esc_attr( $value );
155 $shortcode .= "$key='$value' ";
156 }
157 return trim( $shortcode ) . ']';
158 }
159
160 /**
161 * Parses the shortcode back out to embedded information.
162 *
163 * @since 4.5.0
164 *
165 * @param array $lcase_attrs Lowercase shortcode attributes.
166 *
167 * @return string
168 */
169 public static function shortcode( $lcase_attrs ) {
170 static $displayed_once = false;
171
172 // Limit to one form per page load.
173 if ( $displayed_once ) {
174 return '';
175 }
176
177 if ( empty( $lcase_attrs ) ) {
178 return '<!-- Missing MailChimp baseUrl, uuid or lid -->';
179 }
180
181 $defaults = array_fill_keys( self::$allowed_js_vars, '' );
182 $defaults = array_merge( $defaults, self::$allowed_config );
183
184 // Convert $attrs back to proper casing since they come through in all lowercase.
185 $attrs = array();
186 foreach ( $defaults as $key => $value ) {
187 if ( array_key_exists( strtolower( $key ), $lcase_attrs ) ) {
188 $attrs[ $key ] = $lcase_attrs[ strtolower( $key ) ];
189 }
190 }
191 $attrs = array_map( 'esc_js', array_filter( shortcode_atts( $defaults, $attrs ) ) );
192
193 // Split config & js vars.
194 $js_vars = array();
195 $config_vars = array();
196 foreach ( $attrs as $key => $value ) {
197 if (
198 'baseUrl' === $key
199 && (
200 ! preg_match( '#mc\.us\d+\.list-manage\d?\.com#', $value, $matches )
201 || $value !== $matches[0]
202 )
203 ) {
204 return '<!-- Invalid MailChimp baseUrl -->';
205 }
206
207 if ( in_array( $key, self::$allowed_js_vars, true ) ) {
208 $js_vars[ $key ] = $value;
209 } else {
210 $config_vars[] = "$key: $value";
211 }
212 }
213
214 // If one of these parameters is missing we can't render the form so exist.
215 if ( empty( $js_vars['baseUrl'] ) || empty( $js_vars['uuid'] ) || empty( $js_vars['lid'] ) ) {
216 return '<!-- Missing MailChimp baseUrl, uuid or lid -->';
217 }
218
219 // Add a uniqueMethods parameter if it is missing from the data we got from the embed code.
220 $js_vars['uniqueMethods'] = true;
221
222 /** This action is already documented in modules/widgets/gravatar-profile.php */
223 do_action( 'jetpack_stats_extra', 'mailchimp_subscriber_popup', 'view' );
224
225 $displayed_once = true;
226
227 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";
228 }
229 }
230