PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.8.1
Jetpack – WP Security, Backup, Speed, & Growth v14.8.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 / sitemaps / sitemap-buffer.php
jetpack / modules / sitemaps Last commit date
sitemap-buffer-factory.php 1 year ago sitemap-buffer-fallback.php 2 years ago sitemap-buffer-image-fallback.php 2 years ago sitemap-buffer-image-xmlwriter.php 1 year ago sitemap-buffer-image.php 4 years ago sitemap-buffer-master-fallback.php 2 years ago sitemap-buffer-master-xmlwriter.php 1 year ago sitemap-buffer-master.php 4 years ago sitemap-buffer-news-fallback.php 2 years ago sitemap-buffer-news-xmlwriter.php 1 year ago sitemap-buffer-news.php 4 years ago sitemap-buffer-page-fallback.php 2 years ago sitemap-buffer-page-xmlwriter.php 1 year ago sitemap-buffer-page.php 4 years ago sitemap-buffer-video-fallback.php 2 years ago sitemap-buffer-video-xmlwriter.php 1 year ago sitemap-buffer-video.php 4 years ago sitemap-buffer-xmlwriter.php 1 year ago sitemap-buffer.php 1 year ago sitemap-builder.php 1 year ago sitemap-constants.php 1 year ago sitemap-finder.php 2 years ago sitemap-librarian.php 1 year ago sitemap-logger.php 1 year ago sitemap-state.php 2 years ago sitemap-stylist.php 2 years ago sitemaps.php 1 year ago
sitemap-buffer.php
310 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * Sitemaps (per the protocol) are essentially lists of XML fragments;
4 * lists which are subject to size constraints. The Jetpack_Sitemap_Buffer
5 * class abstracts the details of constructing these lists while
6 * maintaining the constraints.
7 *
8 * @since 4.8.0
9 * @package automattic/jetpack
10 */
11
12 /**
13 * A buffer for constructing sitemap xml files.
14 *
15 * Models a list of strings such that
16 *
17 * 1. the list must have a bounded number of entries,
18 * 2. the concatenation of the strings must have bounded
19 * length (including some header and footer strings), and
20 * 3. each item has a timestamp, and we need to keep track
21 * of the most recent timestamp of the items in the list.
22 *
23 * @since 4.8.0
24 */
25 abstract class Jetpack_Sitemap_Buffer {
26
27 /**
28 * Largest number of items the buffer can hold.
29 *
30 * @access protected
31 * @since 4.8.0
32 * @var int $item_capacity The item capacity.
33 */
34 protected $item_capacity;
35
36 /**
37 * Largest number of bytes the buffer can hold.
38 *
39 * @access protected
40 * @since 4.8.0
41 * @var int $byte_capacity The byte capacity.
42 */
43 protected $byte_capacity;
44
45 /**
46 * Flag which detects when the buffer is full.
47 *
48 * @access protected
49 * @since 4.8.0
50 * @var bool $is_full_flag The flag value. This flag is set to false on construction and only flipped to true if we've tried to add something and failed.
51 */
52 protected $is_full_flag;
53
54 /**
55 * Flag which detects when the buffer is empty.
56 *
57 * @access protected
58 * @since 4.8.0
59 * @var bool $is_empty_flag The flag value. This flag is set to true on construction and only flipped to false if we've tried to add something and succeeded.
60 */
61 protected $is_empty_flag;
62
63 /**
64 * The most recent timestamp seen by the buffer.
65 *
66 * @access protected
67 * @since 4.8.0
68 * @var string $timestamp Must be in 'YYYY-MM-DD hh:mm:ss' format.
69 */
70 protected $timestamp;
71
72 /**
73 * The DOM document object that is currently being used to construct the XML doc.
74 *
75 * @access protected
76 * @since 5.3.0
77 * @var DOMDocument $doc
78 */
79 protected $doc = null;
80
81 /**
82 * The root DOM element object that holds everything inside. Do not use directly, call
83 * the get_root_element getter method instead.
84 *
85 * @access protected
86 * @since 5.3.0
87 * @var DOMElement $doc
88 */
89 protected $root = null;
90
91 /**
92 * Helper class to construct sitemap paths.
93 *
94 * @since 5.3.0
95 * @protected
96 * @var Jetpack_Sitemap_Finder
97 */
98 protected $finder;
99
100 /**
101 * Construct a new Jetpack_Sitemap_Buffer.
102 *
103 * @since 4.8.0
104 *
105 * @param int $item_limit The maximum size of the buffer in items.
106 * @param int $byte_limit The maximum size of the buffer in bytes.
107 * @param string $time The initial datetime of the buffer. Must be in 'YYYY-MM-DD hh:mm:ss' format.
108 */
109 public function __construct( $item_limit, $byte_limit, $time ) {
110 $this->is_full_flag = false;
111 $this->timestamp = $time;
112
113 $this->finder = new Jetpack_Sitemap_Finder();
114 $this->doc = new DOMDocument( '1.0', 'UTF-8' );
115 $this->doc->formatOutput = true;
116 $this->doc->preserveWhiteSpace = false;
117
118 $this->item_capacity = max( 1, (int) $item_limit );
119 $this->byte_capacity = max( 1, (int) $byte_limit ) - strlen( $this->doc->saveXML() );
120 }
121
122 /**
123 * Returns a DOM element that contains all sitemap elements.
124 *
125 * @access protected
126 * @since 5.3.0
127 * @return DOMElement $root
128 */
129 abstract protected function get_root_element();
130
131 /**
132 * Append an item to the buffer, if there is room for it,
133 * and set is_empty_flag to false. If there is no room,
134 * we set is_full_flag to true. If $item is null,
135 * don't do anything and report success.
136 *
137 * @since 5.3.0
138 *
139 * @param array $array The item to be added.
140 *
141 * @return bool True if the append succeeded, False if not.
142 */
143 public function append( $array ) {
144 if ( $array === null ) {
145 return true;
146 }
147
148 if ( $this->is_full_flag ) {
149 return false;
150 }
151
152 if ( 0 >= $this->item_capacity || 0 >= $this->byte_capacity ) {
153 $this->is_full_flag = true;
154 return false;
155 } else {
156 $this->item_capacity -= 1;
157 $added_element = $this->array_to_xml_string( $array, $this->get_root_element(), $this->doc );
158
159 $this->byte_capacity -= strlen( $this->doc->saveXML( $added_element ) );
160
161 return true;
162 }
163 }
164
165 /**
166 * Retrieve the contents of the buffer.
167 *
168 * @since 4.8.0
169 *
170 * @return string The contents of the buffer (with the footer included).
171 */
172 public function contents() {
173 if ( $this->is_empty() ) {
174 // The sitemap should have at least the root element added to the DOM.
175 $this->get_root_element();
176 }
177 return $this->doc->saveXML();
178 }
179
180 /**
181 * Retrieve the document object.
182 *
183 * @since 5.3.0
184 * @return DOMDocument $doc
185 */
186 public function get_document() {
187 return $this->doc;
188 }
189
190 /**
191 * Detect whether the buffer is full.
192 *
193 * @since 4.8.0
194 *
195 * @return bool True if the buffer is full, false otherwise.
196 */
197 public function is_full() {
198 return $this->is_full_flag;
199 }
200
201 /**
202 * Detect whether the buffer is empty.
203 *
204 * @since 4.8.0
205 *
206 * @return bool True if the buffer is empty, false otherwise.
207 */
208 public function is_empty() {
209 return (
210 ! isset( $this->root )
211 || ! $this->root->hasChildNodes()
212 );
213 }
214
215 /**
216 * Update the timestamp of the buffer.
217 *
218 * @since 4.8.0
219 *
220 * @param string $new_time A datetime string in 'YYYY-MM-DD hh:mm:ss' format.
221 */
222 public function view_time( $new_time ) {
223 $this->timestamp = max( $this->timestamp, $new_time );
224 }
225
226 /**
227 * Retrieve the timestamp of the buffer.
228 *
229 * @since 4.8.0
230 *
231 * @return string A datetime string in 'YYYY-MM-DD hh:mm:ss' format.
232 */
233 public function last_modified() {
234 return $this->timestamp;
235 }
236
237 /**
238 * Render an associative array as an XML string. This is needed because
239 * SimpleXMLElement only handles valid XML, but we sometimes want to
240 * pass around (possibly invalid) fragments. Note that 'null' values make
241 * a tag self-closing; this is only sometimes correct (depending on the
242 * version of HTML/XML); see the list of 'void tags'.
243 *
244 * Example:
245 *
246 * array(
247 * 'html' => array( |<html xmlns="foo">
248 * 'head' => array( | <head>
249 * 'title' => 'Woo!', | <title>Woo!</title>
250 * ), | </head>
251 * 'body' => array( ==> | <body>
252 * 'h2' => 'Some thing', | <h2>Some thing</h2>
253 * 'p' => 'it's all up ons', | <p>it's all up ons</p>
254 * 'br' => null, | <br />
255 * ), | </body>
256 * ), |</html>
257 * )
258 *
259 * @access protected
260 * @since 3.9.0
261 * @since 4.8.0 Rename, add $depth parameter, and change return type.
262 * @since 5.3.0 Refactor, remove $depth parameter, add $parent and $root, make access protected.
263 *
264 * @param array $array A recursive associative array of tag/child relationships.
265 * @param DOMElement $parent (optional) an element to which new children should be added.
266 * @param DOMDocument $root (optional) the parent document.
267 *
268 * @return string|DOMDocument The rendered XML string or an object if root element is specified.
269 */
270 protected function array_to_xml_string( $array, $parent = null, $root = null ) {
271 $element = null;
272 $return_string = false;
273
274 if ( null === $parent ) {
275 $return_string = true;
276 $root = new DOMDocument();
277 $parent = $root;
278 }
279
280 if ( is_array( $array ) ) {
281
282 foreach ( $array as $key => $value ) {
283 $element = $root->createElement( $key );
284 $parent->appendChild( $element );
285
286 if ( is_array( $value ) ) {
287 foreach ( $value as $child_key => $child_value ) {
288 $child = $root->createElement( $child_key );
289 $element->appendChild( $child );
290 $child->appendChild( self::array_to_xml_string( $child_value, $child, $root ) );
291 }
292 } else {
293 $element->appendChild(
294 $root->createTextNode( $value )
295 );
296 }
297 }
298 } else {
299 $element = $root->createTextNode( $array );
300 $parent->appendChild( $element );
301 }
302
303 if ( $return_string ) {
304 return $root->saveHTML();
305 } else {
306 return $element;
307 }
308 }
309 }
310