summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/modules/sitemaps/sitemap-state.php')
-rw-r--r--plugins/jetpack/modules/sitemaps/sitemap-state.php144
1 files changed, 144 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/sitemaps/sitemap-state.php b/plugins/jetpack/modules/sitemaps/sitemap-state.php
new file mode 100644
index 00000000..2157628e
--- /dev/null
+++ b/plugins/jetpack/modules/sitemaps/sitemap-state.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Abstract sitemap generation state class.
+ *
+ * @package Jetpack
+ * @since 4.8.0
+ * @author Automattic
+ */
+
+/* Include standard constants and librarian. */
+require_once dirname( __FILE__ ) . '/sitemap-constants.php';
+require_once dirname( __FILE__ ) . '/sitemap-librarian.php';
+
+if ( defined( 'WP_DEBUG' ) && ( true === WP_DEBUG ) ) {
+ require_once dirname( __FILE__ ) . '/sitemap-logger.php';
+}
+
+/**
+ * This class provides an interface for storing and retrieving
+ * the state of a sitemap generation phase. Whenever the builder
+ * wants to build a new sitemap page, it uses this class to see
+ * what the current state of the sitemap is. The lock is stored
+ * as a transient with max lifetime of 15 minutes; this way if our
+ * builder times out before unlocking the state, the lock will expire
+ * before the builder tries again.
+ *
+ * @since 4.8.0
+ */
+class Jetpack_Sitemap_State {
+
+ /**
+ * Initial state for the sitemap generator.
+ *
+ * @access public
+ * @since 4.8.0
+ *
+ * @param string $type The initial sitemap type.
+ *
+ * @return array $args {
+ * @type string sitemap-type The type of sitemap to be generated.
+ * @type int last-added The largest index to be added to a generated sitemap page.
+ * @type int number The index of the last sitemap to be generated.
+ * @type string last-modified The latest timestamp seen.
+ * @type array max The latest index of each sitemap type seen.
+ * }
+ */
+ private static function initial( $type = JP_PAGE_SITEMAP_TYPE ) {
+ return array(
+ 'sitemap-type' => $type,
+ 'last-added' => 0,
+ 'number' => 0,
+ 'last-modified' => '1970-01-01 00:00:00',
+ 'max' => array(),
+ );
+ }
+
+ /**
+ * Reset the sitemap state.
+ *
+ * @param string $type The initial sitemap type.
+ *
+ * @access public
+ * @since 4.8.0
+ */
+ public static function reset( $type ) {
+ delete_transient( 'jetpack-sitemap-state-lock' );
+ update_option(
+ 'jetpack-sitemap-state',
+ self::initial( $type )
+ );
+ }
+
+ /**
+ * Store a sitemap state, and unlock it.
+ *
+ * @access public
+ * @since 4.8.0
+ *
+ * @param array $state Array of the Sitemap state details.
+ * @type string sitemap-type The type of sitemap to be generated.
+ * @type int last-added The largest index to be added to a generated sitemap page.
+ * @type int number The index of the last sitemap to be generated.
+ * @type string last-modified The latest timestamp seen.
+ */
+ public static function check_in( $state ) {
+ // Get the old max value.
+ $sitemap_old = get_option( 'jetpack-sitemap-state', self::initial() );
+ $state['max'] = $sitemap_old['max'];
+
+ // Update the max value of the current type.
+ $state['max'][ $state['sitemap-type'] ]['number'] = $state['number'];
+ $state['max'][ $state['sitemap-type'] ]['lastmod'] = $state['last-modified'];
+
+ update_option( 'jetpack-sitemap-state', $state );
+ }
+
+ /**
+ * Unlock the sitemap state.
+ *
+ * @access public
+ * @since 4.8.0
+ */
+ public static function unlock() {
+ delete_transient( 'jetpack-sitemap-state-lock' );
+ }
+
+ /**
+ * Read the stored sitemap state. Returns false if the state is locked.
+ *
+ * @access public
+ * @since 4.8.0
+ *
+ * @return bool|array $args {
+ * @type string sitemap-type The type of sitemap to be generated.
+ * @type int last-added The largest index to be added to a generated sitemap page.
+ * @type int number The index of the last sitemap to be generated.
+ * @type string last-modified The latest timestamp seen.
+ * @type array max The latest index of each sitemap type seen.
+ * }
+ */
+ public static function check_out() {
+ // See if the state is locked.
+ if ( true === get_transient( 'jetpack-sitemap-state-lock' ) ) {
+ // If it is, return false.
+ return false;
+ } else {
+ // Otherwise, lock the state for 15 minutes and then return it.
+ set_transient( 'jetpack-sitemap-state-lock', true, JP_SITEMAP_LOCK_INTERVAL );
+ return get_option( 'jetpack-sitemap-state', self::initial() );
+ }
+ }
+
+ /**
+ * Delete the stored state and lock.
+ *
+ * @access public
+ * @since 4.8.0
+ */
+ public static function delete() {
+ delete_transient( 'jetpack-sitemap-state-lock' );
+ delete_option( 'jetpack-sitemap-state' );
+ }
+
+}