140 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| /**
 | ||
|  * WPSEO plugin file.
 | ||
|  *
 | ||
|  * @package WPSEO\Admin
 | ||
|  */
 | ||
| 
 | ||
| /**
 | ||
|  * Class for managing integration toggles.
 | ||
|  */
 | ||
| class Yoast_Integration_Toggles {
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Available integration toggles.
 | ||
| 	 *
 | ||
| 	 * @var array
 | ||
| 	 */
 | ||
| 	protected $toggles;
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Instance holder.
 | ||
| 	 *
 | ||
| 	 * @var self|null
 | ||
| 	 */
 | ||
| 	protected static $instance = null;
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Gets the main integration toggles manager instance used.
 | ||
| 	 *
 | ||
| 	 * This essentially works like a Singleton, but for its drawbacks does not restrict
 | ||
| 	 * instantiation otherwise.
 | ||
| 	 *
 | ||
| 	 * @return self Main instance.
 | ||
| 	 */
 | ||
| 	public static function instance() {
 | ||
| 		if ( self::$instance === null ) {
 | ||
| 			self::$instance = new self();
 | ||
| 		}
 | ||
| 
 | ||
| 		return self::$instance;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Gets all available integration toggles.
 | ||
| 	 *
 | ||
| 	 * @return array List of sorted Yoast_Feature_Toggle instances.
 | ||
| 	 */
 | ||
| 	public function get_all() {
 | ||
| 		if ( $this->toggles === null ) {
 | ||
| 			$this->toggles = $this->load_toggles();
 | ||
| 		}
 | ||
| 
 | ||
| 		return $this->toggles;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Loads the available integration toggles.
 | ||
| 	 *
 | ||
| 	 * Also ensures that the toggles are all Yoast_Feature_Toggle instances and sorted by their order value.
 | ||
| 	 *
 | ||
| 	 * @return array List of sorted Yoast_Feature_Toggle instances.
 | ||
| 	 */
 | ||
| 	protected function load_toggles() {
 | ||
| 		$integration_toggles = [
 | ||
| 			(object) [
 | ||
| 				/* translators: %s: 'Semrush' */
 | ||
| 				'name'            => sprintf( __( '%s integration', 'wordpress-seo' ), 'Semrush' ),
 | ||
| 				'setting'         => 'semrush_integration_active',
 | ||
| 				'label'           => sprintf(
 | ||
| 					/* translators: %s: 'Semrush' */
 | ||
| 					__( 'The %s integration offers suggestions and insights for keywords related to the entered focus keyphrase.', 'wordpress-seo' ),
 | ||
| 					'Semrush'
 | ||
| 				),
 | ||
| 				'order'           => 10,
 | ||
| 			],
 | ||
| 			(object) [
 | ||
| 				/* translators: %s: Algolia. */
 | ||
| 				'name'               => \sprintf( \esc_html__( '%s integration', 'wordpress-seo' ), 'Algolia' ),
 | ||
| 				'premium'            => true,
 | ||
| 				'setting'            => 'algolia_integration_active',
 | ||
| 				'label'              => __( 'Improve the quality of your site search! Automatically helps your users find your cornerstone and most important content in your internal search results. It also removes noindexed posts & pages from your site’s search results.', 'wordpress-seo' ),
 | ||
| 				/* translators: %s: Algolia. */
 | ||
| 				'read_more_label'    => \sprintf( \__( 'Find out more about our %s integration.', 'wordpress-seo' ), 'Algolia' ),
 | ||
| 				'read_more_url'      => 'https://yoa.st/4eu',
 | ||
| 				'premium_url'        => 'https://yoa.st/4ex',
 | ||
| 				'premium_upsell_url' => 'https://yoa.st/get-algolia-integration',
 | ||
| 				'order'              => 25,
 | ||
| 			],
 | ||
| 		];
 | ||
| 
 | ||
| 		/**
 | ||
| 		 * Filter to add integration toggles from add-ons.
 | ||
| 		 *
 | ||
| 		 * @param array $integration_toggles Array with integration toggle objects where each object
 | ||
| 		 *                                   should have a `name`, `setting` and `label` property.
 | ||
| 		 */
 | ||
| 		$integration_toggles = apply_filters( 'wpseo_integration_toggles', $integration_toggles );
 | ||
| 
 | ||
| 		$integration_toggles = array_map( [ $this, 'ensure_toggle' ], $integration_toggles );
 | ||
| 		usort( $integration_toggles, [ $this, 'sort_toggles_callback' ] );
 | ||
| 
 | ||
| 		return $integration_toggles;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Ensures that the passed value is a Yoast_Feature_Toggle.
 | ||
| 	 *
 | ||
| 	 * @param Yoast_Feature_Toggle|object|array $toggle_data Feature toggle instance, or raw object or array
 | ||
| 	 *                                                       containing integration toggle data.
 | ||
| 	 * @return Yoast_Feature_Toggle Feature toggle instance based on $toggle_data.
 | ||
| 	 */
 | ||
| 	protected function ensure_toggle( $toggle_data ) {
 | ||
| 		if ( $toggle_data instanceof Yoast_Feature_Toggle ) {
 | ||
| 			return $toggle_data;
 | ||
| 		}
 | ||
| 
 | ||
| 		if ( is_object( $toggle_data ) ) {
 | ||
| 			$toggle_data = get_object_vars( $toggle_data );
 | ||
| 		}
 | ||
| 
 | ||
| 		return new Yoast_Feature_Toggle( $toggle_data );
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Callback for sorting integration toggles by their order.
 | ||
| 	 *
 | ||
| 	 * {@internal Once the minimum PHP version goes up to PHP 7.0, the logic in the function
 | ||
| 	 * can be replaced with the spaceship operator `<=>`.}
 | ||
| 	 *
 | ||
| 	 * @param Yoast_Feature_Toggle $feature_a Feature A.
 | ||
| 	 * @param Yoast_Feature_Toggle $feature_b Feature B.
 | ||
| 	 *
 | ||
| 	 * @return int An integer less than, equal to, or greater than zero indicating respectively
 | ||
| 	 *             that feature A is considered to be less than, equal to, or greater than feature B.
 | ||
| 	 */
 | ||
| 	protected function sort_toggles_callback( Yoast_Feature_Toggle $feature_a, Yoast_Feature_Toggle $feature_b ) {
 | ||
| 		return ( $feature_a->order - $feature_b->order );
 | ||
| 	}
 | ||
| }
 |