PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.9.5
Jetpack – WP Security, Backup, Speed, & Growth v12.9.5
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-fallback.php 2 years ago sitemap-buffer-image-fallback.php 3 years ago sitemap-buffer-image.php 4 years ago sitemap-buffer-master-fallback.php 3 years ago sitemap-buffer-master.php 4 years ago sitemap-buffer-news-fallback.php 3 years ago sitemap-buffer-news.php 4 years ago sitemap-buffer-page-fallback.php 3 years ago sitemap-buffer-page.php 4 years ago sitemap-buffer-video-fallback.php 3 years ago sitemap-buffer-video.php 4 years ago sitemap-buffer.php 3 years ago sitemap-builder.php 2 years ago sitemap-constants.php 4 years ago sitemap-finder.php 2 years ago sitemap-librarian.php 2 years ago sitemap-logger.php 4 years ago sitemap-state.php 2 years ago sitemap-stylist.php 2 years ago sitemaps.php 2 years ago
sitemap-buffer.php
308 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
116 $this->item_capacity = max( 1, (int) $item_limit );
117 $this->byte_capacity = max( 1, (int) $byte_limit ) - strlen( $this->doc->saveXML() );
118 }
119
120 /**
121 * Returns a DOM element that contains all sitemap elements.
122 *
123 * @access protected
124 * @since 5.3.0
125 * @return DOMElement $root
126 */
127 abstract protected function get_root_element();
128
129 /**
130 * Append an item to the buffer, if there is room for it,
131 * and set is_empty_flag to false. If there is no room,
132 * we set is_full_flag to true. If $item is null,
133 * don't do anything and report success.
134 *
135 * @since 5.3.0
136 *
137 * @param array $array The item to be added.
138 *
139 * @return bool True if the append succeeded, False if not.
140 */
141 public function append( $array ) {
142 if ( $array === null ) {
143 return true;
144 }
145
146 if ( $this->is_full_flag ) {
147 return false;
148 }
149
150 if ( 0 >= $this->item_capacity || 0 >= $this->byte_capacity ) {
151 $this->is_full_flag = true;
152 return false;
153 } else {
154 $this->item_capacity -= 1;
155 $added_element = $this->array_to_xml_string( $array, $this->get_root_element(), $this->doc );
156
157 $this->byte_capacity -= strlen( $this->doc->saveXML( $added_element ) );
158
159 return true;
160 }
161 }
162
163 /**
164 * Retrieve the contents of the buffer.
165 *
166 * @since 4.8.0
167 *
168 * @return string The contents of the buffer (with the footer included).
169 */
170 public function contents() {
171 if ( $this->is_empty() ) {
172 // The sitemap should have at least the root element added to the DOM.
173 $this->get_root_element();
174 }
175 return $this->doc->saveXML();
176 }
177
178 /**
179 * Retrieve the document object.
180 *
181 * @since 5.3.0
182 * @return DOMDocument $doc
183 */
184 public function get_document() {
185 return $this->doc;
186 }
187
188 /**
189 * Detect whether the buffer is full.
190 *
191 * @since 4.8.0
192 *
193 * @return bool True if the buffer is full, false otherwise.
194 */
195 public function is_full() {
196 return $this->is_full_flag;
197 }
198
199 /**
200 * Detect whether the buffer is empty.
201 *
202 * @since 4.8.0
203 *
204 * @return bool True if the buffer is empty, false otherwise.
205 */
206 public function is_empty() {
207 return (
208 ! isset( $this->root )
209 || ! $this->root->hasChildNodes()
210 );
211 }
212
213 /**
214 * Update the timestamp of the buffer.
215 *
216 * @since 4.8.0
217 *
218 * @param string $new_time A datetime string in 'YYYY-MM-DD hh:mm:ss' format.
219 */
220 public function view_time( $new_time ) {
221 $this->timestamp = max( $this->timestamp, $new_time );
222 }
223
224 /**
225 * Retrieve the timestamp of the buffer.
226 *
227 * @since 4.8.0
228 *
229 * @return string A datetime string in 'YYYY-MM-DD hh:mm:ss' format.
230 */
231 public function last_modified() {
232 return $this->timestamp;
233 }
234
235 /**
236 * Render an associative array as an XML string. This is needed because
237 * SimpleXMLElement only handles valid XML, but we sometimes want to
238 * pass around (possibly invalid) fragments. Note that 'null' values make
239 * a tag self-closing; this is only sometimes correct (depending on the
240 * version of HTML/XML); see the list of 'void tags'.
241 *
242 * Example:
243 *
244 * array(
245 * 'html' => array( |<html xmlns="foo">
246 * 'head' => array( | <head>
247 * 'title' => 'Woo!', | <title>Woo!</title>
248 * ), | </head>
249 * 'body' => array( ==> | <body>
250 * 'h2' => 'Some thing', | <h2>Some thing</h2>
251 * 'p' => 'it's all up ons', | <p>it's all up ons</p>
252 * 'br' => null, | <br />
253 * ), | </body>
254 * ), |</html>
255 * )
256 *
257 * @access protected
258 * @since 3.9.0
259 * @since 4.8.0 Rename, add $depth parameter, and change return type.
260 * @since 5.3.0 Refactor, remove $depth parameter, add $parent and $root, make access protected.
261 *
262 * @param array $array A recursive associative array of tag/child relationships.
263 * @param DOMElement $parent (optional) an element to which new children should be added.
264 * @param DOMDocument $root (optional) the parent document.
265 *
266 * @return string|DOMDocument The rendered XML string or an object if root element is specified.
267 */
268 protected function array_to_xml_string( $array, $parent = null, $root = null ) {
269 $element = null;
270 $return_string = false;
271
272 if ( null === $parent ) {
273 $return_string = true;
274 $root = new DOMDocument();
275 $parent = $root;
276 }
277
278 if ( is_array( $array ) ) {
279
280 foreach ( $array as $key => $value ) {
281 $element = $root->createElement( $key );
282 $parent->appendChild( $element );
283
284 if ( is_array( $value ) ) {
285 foreach ( $value as $child_key => $child_value ) {
286 $child = $root->createElement( $child_key );
287 $element->appendChild( $child );
288 $child->appendChild( self::array_to_xml_string( $child_value, $child, $root ) );
289 }
290 } else {
291 $element->appendChild(
292 $root->createTextNode( $value )
293 );
294 }
295 }
296 } else {
297 $element = $root->createTextNode( $array );
298 $parent->appendChild( $element );
299 }
300
301 if ( $return_string ) {
302 return $root->saveHTML();
303 } else {
304 return $element;
305 }
306 }
307 }
308