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