: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Class for managing integration toggles.
class Yoast_Integration_Toggles {
* Available integration toggles.
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();
* 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();
* 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() {
/* translators: %s: 'Semrush' */
'name' => sprintf( __( '%s integration', 'wordpress-seo' ), 'Semrush' ),
'setting' => 'semrush_integration_active',
/* translators: %s: 'Semrush' */
__( 'The %s integration offers suggestions and insights for keywords related to the entered focus keyphrase.', 'wordpress-seo' ),
/* translators: %s: Algolia. */
'name' => sprintf( esc_html__( '%s integration', 'wordpress-seo' ), 'Algolia' ),
'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',
* 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 ) {
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 );