base = $base; } /** * Checks if the WordPress timezone matches the given API Timezone, * which could be a global API timezone or a profile-specific timezone. * * @since 3.8.1 * * @param string $api_profile_timezone API Timezone. * @param string $api_profile_name API Profile Name (e.g. @n7TestAcct). * @param string $api_profile_change_timezone_url URL to API service where the user can change the timezone. * @return mixed \WP_Error | true */ public function timezones_match( $api_profile_timezone = '', $api_profile_name = '', $api_profile_change_timezone_url = '#' ) { // Pass test if we don't have API access. if ( ! $this->base->get_class( 'settings' )->account_connected() ) { return true; } // Pass test if the API date couldn't be fetched. if ( ! $api_profile_timezone ) { return true; } // Fetch timezones for WordPress, Server and API. $wordpress_timezone = $this->base->get_class( 'date' )->convert_wordpress_gmt_offset_to_offset_value( get_option( 'gmt_offset' ) ); // Fetch the current date and time, to the minute, for each of the timezones. try { $wordpress_date = new \DateTime( 'now', new \DateTimeZone( $wordpress_timezone ) ); $api_date = new \DateTime( 'now', new \DateTimeZone( $api_profile_timezone ) ); } catch ( \Exception $e ) { return new \WP_Error( $this->base->plugin->filter_name . '_date_time_zone_error', $e->getMessage() ); } // If the three dates don't match, scheduling won't work as expected. $wordpress_date = $wordpress_date->format( 'Y-m-d H:i' ); $api_date = $api_date->format( 'Y-m-d H:i' ); if ( $api_date !== $wordpress_date ) { return new \WP_Error( $this->base->plugin->filter_name . '_timezones_invalid', sprintf( '%1$s

%2$s
%3$s %4$s (%5$s) [%7$s]
%8$s Profile Timezone: %9$s (%10$s) [%12$s]', __( 'This Profile\'s Timezone does not match your WordPress timezone. They must be the same, to ensure that statuses can be scheduled, and are scheduled at the correct time.', 'wp-to-buffer' ), __( 'Right now, your timezones are configured as:', 'wp-to-buffer' ), __( 'WordPress Timezone:', 'wp-to-buffer' ), esc_html( $wordpress_timezone ), esc_html( $wordpress_date ), admin_url( 'options-general.php#timezone_string' ), __( 'Fix', 'wp-to-buffer' ), esc_html( $api_profile_name ), esc_html( $api_profile_timezone ), esc_html( $api_date ), esc_html( $api_profile_change_timezone_url ), __( 'Fix', 'wp-to-buffer' ) ) ); } } /** * Iterates through all associative statuses for a given Post Type, * checking whether a profile and action combination have two or more statuses * that are the same. * * @since 3.1.1 * * @param array $settings Settings. * @return false|array Profile ID and Action with duplicates, or false */ public function check_for_duplicates( $settings ) { // Define the status keys to compare. $status_keys_to_compare = array( 'message', 'conditions', 'terms', 'custom_fields', ); /** * Defines the key values to compare across all statuses for a Post Type and Social Profile * combination, to ensure no duplicate statuses have been defined. * * @since 3.1.1 * * @param array $status_keys_to_compare Status Key Values to Compare. */ $status_keys_to_compare = apply_filters( $this->base->plugin->filter_name . '_validate_check_for_duplicates_status_keys', $status_keys_to_compare ); // Iterate through each profile. foreach ( $settings as $profile_id => $actions ) { // Iterate through each action for this profile. foreach ( $actions as $action => $statuses ) { // Check if this action is enabled. if ( ! isset( $statuses['enabled'] ) || ! $statuses['enabled'] ) { continue; } // Build serialized strings for each status, so we can compare them. $statuses_serialized = array(); foreach ( $statuses['status'] as $status ) { // Build status comprising of just the keys we want to compare with other statuses. $status_compare = array(); foreach ( $status_keys_to_compare as $status_key_to_compare ) { $status_compare[ $status_key_to_compare ] = ( isset( $status[ $status_key_to_compare ] ) ? $status[ $status_key_to_compare ] : '' ); } // Add the status compare to the serialized array. $statuses_serialized[] = serialize( $status_compare ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions } // Check if any two values in our array are the same. // If so, this means the user is using the same status message twice, which may cause an issue. $counts = array_count_values( $statuses_serialized ); foreach ( $counts as $count ) { if ( $count > 1 ) { // Return the Profile ID and Action that contains duplicate statuses. return array( 'profile_id' => $profile_id, 'action' => $action, ); } } } } // No duplicates found. return false; } }