Нема описа

sitemap-constants.php 5.7KB

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