sitemap-constants.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <?php
  2. /**
  3. * Sitemap-related constants.
  4. *
  5. * @package Jetpack
  6. * @since 4.8.0
  7. * @author Automattic
  8. */
  9. /**
  10. * Maximum size (in bytes) of a sitemap xml file.
  11. * Max is 716800 = 700kb to avoid potential failures for default memcached limits (1MB)
  12. *
  13. * @link http://www.sitemaps.org/
  14. * @since 4.8.0
  15. */
  16. if ( ! defined( 'JP_SITEMAP_MAX_BYTES' ) ) {
  17. define( 'JP_SITEMAP_MAX_BYTES', 716800 );
  18. }
  19. /**
  20. * Maximum size (in url nodes) of a sitemap xml file.
  21. * Per the spec, max value is 50000.
  22. *
  23. * @link http://www.sitemaps.org/
  24. * @since 4.8.0
  25. */
  26. if ( ! defined( 'JP_SITEMAP_MAX_ITEMS' ) ) {
  27. define( 'JP_SITEMAP_MAX_ITEMS', 2000 );
  28. }
  29. /**
  30. * Maximum size (in url nodes) of a news sitemap xml file.
  31. * Per the spec, max value is 1000.
  32. *
  33. * @link https://support.google.com/news/publisher/answer/74288?hl=en
  34. * @since 4.8.0
  35. */
  36. if ( ! defined( 'JP_NEWS_SITEMAP_MAX_ITEMS' ) ) {
  37. define( 'JP_NEWS_SITEMAP_MAX_ITEMS', 1000 );
  38. }
  39. /**
  40. * Batch size for database queries.
  41. *
  42. * @since 4.8.0
  43. */
  44. if ( ! defined( 'JP_SITEMAP_BATCH_SIZE' ) ) {
  45. define( 'JP_SITEMAP_BATCH_SIZE', 50 );
  46. }
  47. /**
  48. * Number of sitemap files to update on each run.
  49. *
  50. * @since 4.8.0
  51. */
  52. if ( ! defined( 'JP_SITEMAP_UPDATE_SIZE' ) ) {
  53. define( 'JP_SITEMAP_UPDATE_SIZE', 100 );
  54. }
  55. /**
  56. * Number of seconds between sitemap updates.
  57. *
  58. * @since 4.8.0
  59. */
  60. if ( ! defined( 'JP_SITEMAP_INTERVAL' ) ) {
  61. define( 'JP_SITEMAP_INTERVAL', 12 * HOUR_IN_SECONDS );
  62. }
  63. /**
  64. * Number of seconds to lock the sitemap state.
  65. *
  66. * @since 4.8.0
  67. */
  68. if ( ! defined( 'JP_SITEMAP_LOCK_INTERVAL' ) ) {
  69. define( 'JP_SITEMAP_LOCK_INTERVAL', 15 * MINUTE_IN_SECONDS );
  70. }
  71. /**
  72. * Cache lifetime of news sitemap (in seconds).
  73. *
  74. * @since 4.8.0
  75. */
  76. if ( ! defined( 'JP_NEWS_SITEMAP_INTERVAL' ) ) {
  77. define( 'JP_NEWS_SITEMAP_INTERVAL', 12 * HOUR_IN_SECONDS );
  78. }
  79. /*
  80. * These constants represent the types of various kinds of sitemaps.
  81. * Note: these strings are used as 'post_types' in the database, and
  82. * so must be at most 20 characters long.
  83. */
  84. if ( ! defined( 'JP_MASTER_SITEMAP_TYPE' ) ) {
  85. define( 'JP_MASTER_SITEMAP_TYPE', 'jp_sitemap_master' );
  86. }
  87. if ( ! defined( 'JP_PAGE_SITEMAP_TYPE' ) ) {
  88. define( 'JP_PAGE_SITEMAP_TYPE', 'jp_sitemap' );
  89. }
  90. if ( ! defined( 'JP_PAGE_SITEMAP_INDEX_TYPE' ) ) {
  91. define( 'JP_PAGE_SITEMAP_INDEX_TYPE', 'jp_sitemap_index' );
  92. }
  93. if ( ! defined( 'JP_IMAGE_SITEMAP_TYPE' ) ) {
  94. define( 'JP_IMAGE_SITEMAP_TYPE', 'jp_img_sitemap' );
  95. }
  96. if ( ! defined( 'JP_IMAGE_SITEMAP_INDEX_TYPE' ) ) {
  97. define( 'JP_IMAGE_SITEMAP_INDEX_TYPE', 'jp_img_sitemap_index' );
  98. }
  99. if ( ! defined( 'JP_VIDEO_SITEMAP_TYPE' ) ) {
  100. define( 'JP_VIDEO_SITEMAP_TYPE', 'jp_vid_sitemap' );
  101. }
  102. if ( ! defined( 'JP_VIDEO_SITEMAP_INDEX_TYPE' ) ) {
  103. define( 'JP_VIDEO_SITEMAP_INDEX_TYPE', 'jp_vid_sitemap_index' );
  104. }
  105. /**
  106. * The name (with extension) of a sitemap file of the given
  107. * type and number.
  108. *
  109. * @since 4.8.0
  110. *
  111. * @param string $type The sitemap type.
  112. * @param string $number The sitemap number.
  113. *
  114. * @return string The filename.
  115. */
  116. function jp_sitemap_filename( $type, $number = null ) {
  117. if ( is_null( $number ) ) {
  118. return "error-not-int-$type-$number.xml";
  119. } elseif ( JP_MASTER_SITEMAP_TYPE === $type ) {
  120. return 'sitemap.xml';
  121. } elseif ( JP_PAGE_SITEMAP_TYPE === $type ) {
  122. return "sitemap-$number.xml";
  123. } elseif ( JP_PAGE_SITEMAP_INDEX_TYPE === $type ) {
  124. return "sitemap-index-$number.xml";
  125. } elseif ( JP_IMAGE_SITEMAP_TYPE === $type ) {
  126. return "image-sitemap-$number.xml";
  127. } elseif ( JP_IMAGE_SITEMAP_INDEX_TYPE === $type ) {
  128. return "image-sitemap-index-$number.xml";
  129. } elseif ( JP_VIDEO_SITEMAP_TYPE === $type ) {
  130. return "video-sitemap-$number.xml";
  131. } elseif ( JP_VIDEO_SITEMAP_INDEX_TYPE === $type ) {
  132. return "video-sitemap-index-$number.xml";
  133. } else {
  134. return "error-bad-type-$type-$number.xml";
  135. }
  136. }
  137. /**
  138. * The index type corresponding to a sitemap type.
  139. *
  140. * @since 4.8.0
  141. *
  142. * @param string $type The sitemap type.
  143. *
  144. * @return string The index type.
  145. */
  146. function jp_sitemap_index_type_of( $type ) {
  147. if ( JP_PAGE_SITEMAP_TYPE === $type ) {
  148. return JP_PAGE_SITEMAP_INDEX_TYPE;
  149. } elseif ( JP_IMAGE_SITEMAP_TYPE === $type ) {
  150. return JP_IMAGE_SITEMAP_INDEX_TYPE;
  151. } elseif ( JP_VIDEO_SITEMAP_TYPE === $type ) {
  152. return JP_VIDEO_SITEMAP_INDEX_TYPE;
  153. } else {
  154. return "error-bad-type-$type";
  155. }
  156. }
  157. /**
  158. * The sitemap type corresponding to an index type.
  159. *
  160. * @since 4.8.0
  161. *
  162. * @param string $type The index type.
  163. *
  164. * @return string The sitemap type.
  165. */
  166. function jp_sitemap_child_type_of( $type ) {
  167. if ( JP_PAGE_SITEMAP_INDEX_TYPE === $type ) {
  168. return JP_PAGE_SITEMAP_TYPE;
  169. } elseif ( JP_IMAGE_SITEMAP_INDEX_TYPE === $type ) {
  170. return JP_IMAGE_SITEMAP_TYPE;
  171. } elseif ( JP_VIDEO_SITEMAP_INDEX_TYPE === $type ) {
  172. return JP_VIDEO_SITEMAP_TYPE;
  173. } else {
  174. return "error-bad-type-$type";
  175. }
  176. }
  177. /**
  178. * Convert '0000-00-00 00:00:00' to '0000-00-00T00:00:00Z'.
  179. * Note that the input is assumed to be in UTC (a.k.a. GMT).
  180. *
  181. * @link https://www.w3.org/TR/NOTE-datetime
  182. * @since 4.8.0
  183. *
  184. * @param string $datetime The timestamp to convert.
  185. *
  186. * @return string The converted timestamp.
  187. */
  188. function jp_sitemap_datetime( $datetime ) {
  189. $regex = '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/';
  190. if ( preg_match( $regex, $datetime ) ) {
  191. return str_replace( ' ', 'T', $datetime ) . 'Z';
  192. } else {
  193. return $datetime;
  194. }
  195. }