diff options
Diffstat (limited to 'plugins/jetpack/sync/class.jetpack-sync-module-constants.php')
-rw-r--r-- | plugins/jetpack/sync/class.jetpack-sync-module-constants.php | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/plugins/jetpack/sync/class.jetpack-sync-module-constants.php b/plugins/jetpack/sync/class.jetpack-sync-module-constants.php new file mode 100644 index 00000000..4ad9bafa --- /dev/null +++ b/plugins/jetpack/sync/class.jetpack-sync-module-constants.php @@ -0,0 +1,124 @@ +<?php + +require_once dirname( __FILE__ ) . '/class.jetpack-sync-defaults.php'; + +class Jetpack_Sync_Module_Constants extends Jetpack_Sync_Module { + const CONSTANTS_CHECKSUM_OPTION_NAME = 'jetpack_constants_sync_checksum'; + const CONSTANTS_AWAIT_TRANSIENT_NAME = 'jetpack_sync_constants_await'; + + public function name() { + return 'constants'; + } + + private $constants_whitelist; + + public function set_defaults() { + $this->constants_whitelist = Jetpack_Sync_Defaults::$default_constants_whitelist; + } + + public function init_listeners( $callable ) { + add_action( 'jetpack_sync_constant', $callable, 10, 2 ); + } + + public function init_full_sync_listeners( $callable ) { + add_action( 'jetpack_full_sync_constants', $callable ); + } + + public function init_before_send() { + add_action( 'jetpack_sync_before_send_queue_sync', array( $this, 'maybe_sync_constants' ) ); + + // full sync + add_filter( 'jetpack_sync_before_send_jetpack_full_sync_constants', array( $this, 'expand_constants' ) ); + } + + public function reset_data() { + delete_option( self::CONSTANTS_CHECKSUM_OPTION_NAME ); + delete_transient( self::CONSTANTS_AWAIT_TRANSIENT_NAME ); + } + + function set_constants_whitelist( $constants ) { + $this->constants_whitelist = $constants; + } + + function get_constants_whitelist() { + return $this->constants_whitelist; + } + + function enqueue_full_sync_actions( $config ) { + /** + * Tells the client to sync all constants to the server + * + * @since 4.2.0 + * + * @param boolean Whether to expand constants (should always be true) + */ + do_action( 'jetpack_full_sync_constants', true ); + + return 1; + } + + function estimate_full_sync_actions( $config ) { + return 1; + } + + function get_full_sync_actions() { + return array( 'jetpack_full_sync_constants' ); + } + + function maybe_sync_constants() { + if ( get_transient( self::CONSTANTS_AWAIT_TRANSIENT_NAME ) ) { + return; + } + + set_transient( self::CONSTANTS_AWAIT_TRANSIENT_NAME, microtime( true ), Jetpack_Sync_Defaults::$default_sync_constants_wait_time ); + + $constants = $this->get_all_constants(); + if ( empty( $constants ) ) { + return; + } + + $constants_checksums = (array) get_option( self::CONSTANTS_CHECKSUM_OPTION_NAME, array() ); + + foreach ( $constants as $name => $value ) { + $checksum = $this->get_check_sum( $value ); + // explicitly not using Identical comparison as get_option returns a string + if ( ! $this->still_valid_checksum( $constants_checksums, $name, $checksum ) && ! is_null( $value ) ) { + /** + * Tells the client to sync a constant to the server + * + * @since 4.2.0 + * + * @param string The name of the constant + * @param mixed The value of the constant + */ + do_action( 'jetpack_sync_constant', $name, $value ); + $constants_checksums[ $name ] = $checksum; + } else { + $constants_checksums[ $name ] = $checksum; + } + } + update_option( self::CONSTANTS_CHECKSUM_OPTION_NAME, $constants_checksums ); + } + + // public so that we don't have to store an option for each constant + function get_all_constants() { + return array_combine( + $this->constants_whitelist, + array_map( array( $this, 'get_constant' ), $this->constants_whitelist ) + ); + } + + private function get_constant( $constant ) { + return ( defined( $constant ) ) ? + constant( $constant ) + : null; + } + + public function expand_constants( $args ) { + if ( $args[0] ) { + return $this->get_all_constants(); + } + + return $args; + } +} |