<?php
/**
 * Handle compabitility with other plugins/themes.
 *
 * @link       https://bootstrapped.ventures
 * @since      3.2.0
 *
 * @package    WP_Recipe_Maker
 * @subpackage WP_Recipe_Maker/includes/public
 */

/**
 * Handle compabitility with other plugins/themes.
 *
 * @since      3.2.0
 * @package    WP_Recipe_Maker
 * @subpackage WP_Recipe_Maker/includes/public
 * @author     Brecht Vandersmissen <brecht@bootstrapped.ventures>
 */
class WPRM_Compatibility {

	/**
	 * Track the language newly created WPRM terms should use.
	 *
	 * @var false|string
	 */
	private static $new_term_language = false;

	/**
	 * Register actions and filters.
	 *
	 * @since	3.2.0
	 */
	public static function init() {
		// Shortcode block in query loop.
		add_filter( 'render_block', array( __CLASS__, 'shortcode_block_query_loop' ), 10, 2 );

		// Rank Math.
		add_action( 'admin_enqueue_scripts', array( __CLASS__, 'rank_math' ) );

		// Yoast SEO.
		add_action( 'admin_enqueue_scripts', array( __CLASS__, 'yoast_seo' ) );
		add_filter( 'wpseo_video_index_content', array( __CLASS__, 'yoast_video_seo' ) );

		// Caching plugins.
		add_filter( 'litespeed_optimize_js_excludes', array( __CLASS__, 'cache_js_excludes' ) );
		add_filter( 'rocket_exclude_js', array( __CLASS__, 'cache_js_excludes' ) );
		add_filter( 'wp-optimize-minify-default-exclusions', array( __CLASS__, 'cache_js_excludes' ) );
		add_filter( 'perfmatters_minify_js_exclusions', array( __CLASS__, 'cache_js_excludes' ) );
		add_filter( 'sgo_js_minify_exclude', array( __CLASS__, 'cache_js_excludes' ) );
		add_filter( 'js_do_concat', array( __CLASS__, 'jetpack_boost_exclude' ), 10, 2 );

		// Jupiter.
		add_action( 'wp_footer', array( __CLASS__, 'jupiter_assets' ) );

		// Emeals.
		add_filter( 'wprm_recipe_ingredients_shortcode', array( __CLASS__, 'emeals_after_ingredients' ), 9 );
		add_action( 'wp_footer', array( __CLASS__, 'emeals_assets' ) );

		// Smart With Food.
		add_filter( 'wprm_recipe_ingredients_shortcode', array( __CLASS__, 'smartwithfood_after_ingredients' ), 9 );
		add_action( 'wp_footer', array( __CLASS__, 'smartwithfood_assets' ) );

		// Chicory.
		add_filter( 'wprm_recipe_ingredients_shortcode', array( __CLASS__, 'chicory_after_ingredients' ), 9 );
		add_action( 'wp_footer', array( __CLASS__, 'chicory_assets' ) );

		// My Shopping Help.
		add_filter( 'wprm_recipe_ingredients_shortcode', array( __CLASS__, 'myshoppinghelp_after_ingredients' ), 9 );

		// CookPal.
		add_filter( 'wprm_recipe_ingredients_shortcode', array( __CLASS__, 'cookpal_after_ingredients' ), 9 );

		add_action( 'ECS_after_render_post_footer', array( __CLASS__, 'wpupg_unset_recipe_id' ) );

		// WP Ultimate Post Grid.
		add_filter( 'wpupg_output_grid_post', array( __CLASS__, 'wpupg_set_recipe_id_legacy' ) );
		add_filter( 'wpupg_term_name', array( __CLASS__, 'wpupg_term_name' ), 10, 3 );

		add_filter( 'wpupg_set_current_item', array( __CLASS__, 'wpupg_set_recipe_id' ) );
		add_filter( 'wpupg_unset_current_item', array( __CLASS__, 'wpupg_unset_recipe_id' ) );
		add_filter( 'wpupg_template_editor_shortcodes', array( __CLASS__, 'wpupg_template_editor_shortcodes' ) );
		add_action( 'admin_enqueue_scripts', array( __CLASS__, 'wpupg_template_editor_styles' ) );

		// WP Ultimate Post Grid & WP Extended Search combination.
		add_filter( 'wpes_post_types', array( __CLASS__, 'wpupg_extended_search_post_types' ) );
		add_filter( 'wpes_tax', array( __CLASS__, 'wpupg_extended_search_taxonomies' ) );

		// Track created terms for multilingual plugins.
		add_action( 'created_term', array( __CLASS__, 'maybe_set_new_term_language' ), 10, 3 );
	}

	/**
	 * Render WPRM shortcode for query loop compatibility.
	 *
	 * @since	10.0.0
	 * @param	string $block_content	Current block content.
	 * @param	array $block			Current block.
	 */
	public static function shortcode_block_query_loop( $block_content, $block ) {
		if ( $block['blockName'] === 'core/shortcode' ) {
			// Check if it contains "[wprm-"
			if ( strpos( $block_content, '[wprm-' ) !== false ) {
				return do_shortcode( $block_content );
			}
		}
		return $block_content;
	}

	/**
	 * Yoast SEO Compatibility.
	 *
	 * @since	3.2.0
	 */
	public static function yoast_seo() {
		if ( defined( 'WPSEO_VERSION' ) ) {
			wp_enqueue_script( 'wprm-yoast-compatibility', WPRM_URL . 'assets/js/other/yoast-compatibility.js', array( 'jquery' ), WPRM_VERSION, true );
		}
	}

	/**
	 * Yoast Video SEO Compatibility.
	 *
	 * @since	7.2.0
	 */
	public static function yoast_video_seo( $post_content ) {
		$recipes = WPRM_Recipe_Manager::get_recipe_ids_from_content( $post_content );

		if ( $recipes ) {
			foreach ( $recipes as $recipe_id ) {
				$recipe_id = intval( $recipe_id );
				$recipe = WPRM_Recipe_Manager::get_recipe( $recipe_id );

				if ( $recipe ) { 
					// This makes sure recipes are parsed and their videos are included.
					$post_content .= ' ' . do_shortcode( '[wprm-recipe id="' . $recipe_id . '"]' );
					$post_content .= ' ' . $recipe->video_embed();
				}
			}
		}

		return $post_content;
	}

	/**
	 * Caching plugin compatibility.
	 *
	 * @since	9.7.0
	 */
	public static function cache_js_excludes( $excludes ) {
		if ( WPRM_Settings::get( 'assets_prevent_caching_optimization' ) && is_array( $excludes ) ) {
			$excludes[] = 'wp-recipe-maker/dist/public-modern.js';
			$excludes[] = 'wp-recipe-maker/dist/public-modern-split.js';
			$excludes[] = 'wp-recipe-maker/dist/public-feature-';
			if ( defined( 'WPRMP_BUNDLE' ) ) {
				$excludes[] = 'wp-recipe-maker-premium/dist/public-' . strtolower( WPRMP_BUNDLE ) . '.js';
				$excludes[] = 'wp-recipe-maker-premium/dist/public-' . strtolower( WPRMP_BUNDLE ) . '-split.js';
				$excludes[] = 'wp-recipe-maker-premium/dist/public-feature-';
				$excludes[] = 'wp-recipe-maker-premium/dist/public-recipe-collections-split.js';
			}
		}

		return $excludes;
	}

/**
  * Excludes WPRM assets from Jetpack Boost's concatenation.
  *
  * @param bool   $do_concat Whether Jetpack Boost should concatenate the asset.
  * @param string $handle    The handle of the JavaScript asset.
  * @return bool  Whether the asset should be excluded from concatenation.
  */
 public static function jetpack_boost_exclude( $do_concat, $handle ) {
		if ( WPRM_Settings::get( 'assets_prevent_caching_optimization' ) ) {
			if ( 'wprm-public' === $handle || 'wprmp-public' === $handle ) {
				$do_concat = false;
			}
		}

		return $do_concat;
	}

	/**
	 * Rank Math Compatibility.
	 *
	 * @since	6.6.0
	 */
	public static function rank_math() {
		// wp_enqueue_script( 'wprm-rank-math-compatibility', WPRM_URL . 'assets/js/other/rank-math-compatibility.js', array( 'wp-hooks', 'rank-math-analyzer' ), WPRM_VERSION, true );
	}

	/**
	 * Recipes in WP Ultimate Post Grid Compatibility (after 3.0.0).
	 *
	 * @since	5.9.0
	 * @param	mixed $post Post getting shown in the grid.
	 */
	public static function wpupg_set_recipe_id( $item ) {
		if ( WPRM_POST_TYPE === $item->post_type() ) {
			WPRM_Template_Shortcodes::set_current_recipe_id( $item->id() );
		} else {
			$recipes = WPRM_Recipe_Manager::get_recipe_ids_from_post( $item->id() );

			if ( isset( $recipes[0] ) ) {
				WPRM_Template_Shortcodes::set_current_recipe_id( $recipes[0] );
			}
		}

		return $item;
	}
	public static function wpupg_unset_recipe_id( $item ) {
		WPRM_Template_Shortcodes::set_current_recipe_id( false );
		return $item;
	}

	/**
	 * Recipes in WP Ultimate Post Grid Compatibility (before 3.0.0).
	 *
	 * @since	4.2.0
	 * @param	mixed $post Post getting shown in the grid.
	 */
	public static function wpupg_set_recipe_id_legacy( $post ) {
		if ( WPRM_POST_TYPE === $post->post_type ) {
			WPRM_Template_Shortcodes::set_current_recipe_id( $post->ID );
		}

		return $post;
	}

	/**
	 * Alter term names in WP Ultimate Post Grid.
	 *
	 * @since	7.3.0
	 * @param	mixed $name Name for the term.
	 * @param	mixed $id Term ID.
	 * @param	mixed $taxonomy Taxonomy of the term.
	 */
	public static function wpupg_term_name( $name, $id, $taxonomy ) {
		if ( 'wprm_suitablefordiet' === $taxonomy ) {
			$diet_label = get_term_meta( $id, 'wprm_term_label', true );
			
			if ( $diet_label ) {
				$name = $diet_label;
			}
		}

		return $name;
	}

	/**
	 * Add recipe shortcodes to grid template editor.
	 *
	 * @since	5.9.0
	 * @param	mixed $shortcodes Current template editor shortcodes.
	 */
	public static function wpupg_template_editor_shortcodes( $shortcodes ) {
		$shortcodes = array_merge( $shortcodes, WPRM_Template_Shortcodes::get_shortcodes() );
		return $shortcodes;
	}
	
	/**
	 * Add recipe shortcode styles to grid template editor.
	 *
	 * @since	5.9.0
	 */
	public static function wpupg_template_editor_styles( $shortcodes ) {
		$screen = get_current_screen();
		if ( 'grids_page_wpupg_template_editor' === $screen->id  ) {
			wp_enqueue_style( 'wprm-admin-template', WPRM_URL . 'dist/admin-template.css', array(), WPRM_VERSION, 'all' );
		}
	}
	
	/**
	 * Compatibility with WP Extended Search when WP Ultimate Post Grid is activated.
	 *
	 * @since	8.0.0
	 */
	public static function wpupg_extended_search_post_types( $post_types ) {
		if ( class_exists( 'WP_Ultimate_Post_Grid' ) ) {
			$post_types[ WPRM_POST_TYPE ] = get_post_type_object( WPRM_POST_TYPE );
		}

		return $post_types;
	}

	/**
	 * Compatibility with WP Extended Search when WP Ultimate Post Grid is activated.
	 *
	 * @since	8.0.0
	 */
	public static function wpupg_extended_search_taxonomies( $taxonomies ) {
		if ( class_exists( 'WP_Ultimate_Post_Grid' ) ) {
			$wprm_taxonomies = get_object_taxonomies( WPRM_POST_TYPE, 'objects' );
			$taxonomies = array_merge( $taxonomies, $wprm_taxonomies );
		}

		return $taxonomies;
	}

	/**
	 * Jupiter assets in footer.
	 *
	 * @since    8.2.0
	 */
	public static function jupiter_assets() {
		if ( WPRM_Settings::get( 'integration_jupiter' ) ) {
			$data = '';

			// Jupiter Handle, empty by default.
			$handle = trim( WPRM_Settings::get( 'jupiter_handle' ) );
			$data .= ' data-handle="' . esc_attr( $handle ) . '"';

			// Options.
			$data .= WPRM_Settings::get( 'jupiter_print_button' ) ? ' data-enable-print-link="true"' : ' data-enable-print-link="false"';
			$data .= WPRM_Settings::get( 'jupiter_shop_ingredients_button' ) ? ' data-enable-shop-ingredients-button="true"' : ' data-enable-shop-ingredients-button="false"';

			echo '<script defer src="https://scripts.jupiter.shop/wp-recipe-maker/bundle.min.js"' . $data . '></script>';
		}
	}

	/**
	 * Add eMeals Walmart button after the ingredients.
	 *
	 * @since	9.4.0
	 * @param	mixed $output Current ingredients output.
	 */
	public static function emeals_after_ingredients( $output ) {
		if ( WPRM_Settings::get( 'emeals_walmart_button' ) ) {
			$output = $output . do_shortcode( '[wprm-spacer][wprm-recipe-emeals]' );
		}

		return $output;
	}
	
	/**
	 * Emeals assets in footer.
	 *
	 * @since    9.0.0
	 */
	public static function emeals_assets() {
		if ( apply_filters( 'wprm_load_emeals', false ) ) {
			// Optional partner ID.
			$partner_id = WPRM_Settings::get( 'emeals_partner_id' );

			if ( ! $partner_id ) {
				$partner_id = 'wprecipemaker';
			}
			
			echo '<script type="text/javascript" src="https://emeals.com/shopping/button/bundle.min.js" partner="' . esc_attr( $partner_id ) . '"></script>';
		}
	}

	/**
	 * Add Smart with Food button after the ingredients.
	 *
	 * @since	8.10.0
	 * @param	mixed $output Current ingredients output.
	 */
	public static function smartwithfood_after_ingredients( $output ) {
		if ( WPRM_Settings::get( 'integration_smartwithfood_token' ) && WPRM_Settings::get( 'integration_smartwithfood' ) ) {
			$output = $output . do_shortcode( '[wprm-spacer][wprm-recipe-smart-with-food]' );
		}

		return $output;
	}

	/**
	 * Smart with Food assets in footer.
	 *
	 * @since    8.10.0
	 */
	public static function smartwithfood_assets() {
		if ( apply_filters( 'wprm_load_smartwithfood', false ) ) {
			// Make sure to only load JS if a token is set up.
			if ( WPRM_Settings::get( 'integration_smartwithfood_token' ) ) {
				echo '<script src="https://unpkg.com/@smartwithfood/js-sdk@2.0.0/dist/index.min.js"></script>';
				echo '<script src="' . WPRM_URL . 'assets/js/other/smart-with-food.js?ver=' . WPRM_VERSION .'"></script>';
				echo '<script>window.wprm_smartwithfood_token = "' . esc_attr( WPRM_Settings::get( 'integration_smartwithfood_token' ) ).'";</script>';
			}
		}
	}

	/**
	 * Add Chicory button after the ingredients.
	 *
	 * @since	9.3.0
	 * @param	mixed $output Current ingredients output.
	 */
	public static function chicory_after_ingredients( $output ) {
		if ( WPRM_Settings::get( 'integration_chicory_activate' ) && WPRM_Settings::get( 'integration_chicory_shoppable_button' ) ) {
			$output = $output . do_shortcode( '[wprm-spacer][wprm-recipe-chicory]' );
		}

		return $output;
	}

	/**
	 * Chicory assets in footer.
	 *
	 * @since    9.3.0
	 */
	public static function chicory_assets() {
		if ( apply_filters( 'wprm_load_chicory', false ) ) {
			// Make sure to only load JS if they actually agree to the terms.
			if ( WPRM_Settings::get( 'integration_chicory_activate' ) ) {
				$ads_enabled = WPRM_Settings::get( 'integration_chicory_premium_ads' );
				$chicory_config = array(
					'desktop' => array(
						'pairingAdsEnabled' => $ads_enabled,
						'inlineAdsEnabled' => $ads_enabled,
						'inlineAdsRefresh' => $ads_enabled,
						'pairingAdsRefresh' => $ads_enabled,
					),
					'mobile' => array(
						'pairingAdsEnabled' => $ads_enabled,
						'inlineAdsEnabled' => $ads_enabled,
						'inlineAdsRefresh' => $ads_enabled,
						'pairingAdsRefresh' => $ads_enabled,
					),
				);

				echo '<script>window.ChicoryConfig = ' . json_encode( $chicory_config ) . ';</script>';
				echo '<script defer src="//www.chicoryapp.com/widget_v2/"></script>';
			}
		}
	}

	/**
	 * Add My Shopping Help button after the ingredients.
	 *
	 * @since	10.3.0
	 * @param	mixed $output Current ingredients output.
	 */
	public static function myshoppinghelp_after_ingredients( $output ) {
		if ( WPRM_Settings::get( 'integration_myshoppinghelp_add' ) && class_exists( 'Nakko\Msh\MshPlugin' ) ) {
			$output = $output . do_shortcode( '[wprm-spacer][wprm-recipe-my-shopping-help]' );
		}

		return $output;
	}

	/**
	 * Add CookPal button after the ingredients.
	 *
	 * @since	10.5.0
	 * @param	mixed $output Current ingredients output.
	 */
	public static function cookpal_after_ingredients( $output ) {
		if ( WPRM_Settings::get( 'integration_cookpal_add' ) ) {
			$output = $output . do_shortcode( '[wprm-spacer][wprm-recipe-cookpal]' );
		}

		return $output;
	}

	/**
	 * Check if and what multilingual plugin is getting used.
	 *
	 * @since	6.9.0
	 */
	public static function multilingual() {
		$plugin = false;
		$languages = array();
		$current_language = false;
		$default_language = false;

		// WPML.
		$wpml_languages = apply_filters( 'wpml_active_languages', false );

		if ( $wpml_languages ) {
			$plugin = 'wpml';

			foreach ( $wpml_languages as $code => $options ) {
				$languages[ $code ] = array(
					'value' => $code,
					'label' => $options['native_name'],
				);
			}

			$current_language = ICL_LANGUAGE_CODE;
			$default_language = apply_filters( 'wpml_default_language', false );
		}

		// Polylang.
		if ( function_exists( 'pll_home_url' ) ) {
			$plugin = 'polylang';
			$slugs = pll_languages_list( array(
				'fields' => 'slug',
			) );

			$names = pll_languages_list( array(
				'fields' => 'name',
			) );

			$languages = array();
			foreach ( $slugs as $index => $slug ) {
				$languages[ $slug ] = array(
					'value' => $slug,
					'label' => isset( $names[ $index ] ) ? $names[ $index ] : $slug,
				);
			}

			if ( function_exists( 'pll_current_language' ) ) {
				$current_language = pll_current_language( 'slug' );
			}

			if ( function_exists( 'pll_default_language' ) ) {
				$default_language = pll_default_language( 'slug' );
			}
		}

		// Return either false (no multilingual plugin) or an array with the plugin and activated languages.
		return ! $plugin ? false : array(
			'plugin' => $plugin,
			'languages' => $languages,
			'current' => $current_language,
			'default' => $default_language,
		);
	}

	/**
	 * Get the language of a specific post ID.
	 *
	 * @since	7.7.0
	 * @param	int $post_id Post ID to get the language for.
	 */
	public static function get_language_for( $post_id ) {
		$language = false;

		if ( $post_id ) {
			$multilingual = self::multilingual();

			if ( $multilingual ) {
				// WPML.
				if ( 'wpml' === $multilingual['plugin'] ) {
					$wpml = apply_filters( 'wpml_post_language_details', false, $post_id );

					if ( $wpml && is_array( $wpml ) ) {
						$language = $wpml['language_code'];
					}
				}

				// Polylang.
				if ( 'polylang' === $multilingual['plugin'] ) {
					$polylang = pll_get_post_language( $post_id, 'slug' );

					if ( $polylang && ! is_wp_error( $polylang ) ) {
						$language = $polylang;
					}
				}
			}
		}

		// Use false instead of null.
		if ( ! $language ) {
			$language = false;
		}

		return $language;
	}

	/**
	 * Check if a post is a WPML translation of another post.
	 *
	 * @since	10.8.2
	 * @param	int $post_id Post ID to check.
	 */
	public static function is_wpml_translation_post( $post_id ) {
		$post_id = intval( $post_id );

		if ( ! $post_id || ! has_filter( 'wpml_element_language_details' ) ) {
			return false;
		}

		$post_type = get_post_type( $post_id );

		if ( ! $post_type ) {
			return false;
		}

		$details = apply_filters(
			'wpml_element_language_details',
			null,
			array(
				'element_id'   => $post_id,
				'element_type' => 'post_' . $post_type,
			)
		);

		if ( is_object( $details ) ) {
			$details = (array) $details;
		}

		return is_array( $details ) && ! empty( $details['source_language_code'] );
	}

	/**
	 * Set the language for a specific recipe ID.
	 *
	 * @since	7.7.0
	 * @param	int 	$recipe_id	Recipe ID to set the language for.
	 * @param	mixed 	$language	Language to set the recipe to.
	 */
	public static function set_language_for( $recipe_id, $language ) {
		if ( $recipe_id ) {
			$multilingual = self::multilingual();

			if ( $multilingual ) {
				// WPML.
				if ( 'wpml' === $multilingual['plugin'] ) {
					$element_type = 'post_' . WPRM_POST_TYPE;
					$translation_group_id = apply_filters( 'wpml_element_trid', NULL, $recipe_id, $element_type );

					do_action( 'wpml_set_element_language_details', array(
						'element_id' => $recipe_id,
						'trid' => $translation_group_id ? $translation_group_id : false,
						'element_type' => $element_type,
						'language_code' => $language ? $language : null,
					) );
				}

				// Polylang.
				if ( 'polylang' === $multilingual['plugin'] && function_exists( 'pll_set_post_language' ) ) {
					pll_set_post_language( $recipe_id, $language );
				}
			}
		}
	}

	/**
	 * Set the language for a specific term ID.
	 *
	 * @since	10.8.0
	 * @param	int         $term_id   Term ID to set the language for.
	 * @param	string      $taxonomy  Taxonomy the term belongs to.
	 * @param	false|mixed $language  Language code to set.
	 */
	public static function set_term_language( $term_id, $taxonomy, $language ) {
		$multilingual = self::multilingual();

		if ( ! $term_id || ! $taxonomy || ! $multilingual || ! $language ) {
			return false;
		}

		$language = sanitize_key( $language );

		// WPML.
		if ( 'wpml' === $multilingual['plugin'] ) {
			$element_type = 'tax_' . $taxonomy;
			$translation_group_id = apply_filters( 'wpml_element_trid', null, $term_id, $element_type );

			do_action( 'wpml_set_element_language_details', array(
				'element_id'   => $term_id,
				'trid'         => $translation_group_id ? $translation_group_id : false,
				'element_type' => $element_type,
				'language_code'=> $language,
			) );

			return true;
		}

		// Polylang.
		if ( 'polylang' === $multilingual['plugin'] && function_exists( 'pll_set_term_language' ) ) {
			pll_set_term_language( $term_id, $language );
			return true;
		}

		return false;
	}

	/**
	 * Get the language for a specific term ID.
	 *
	 * @since	10.8.0
	 * @param	int    $term_id  Term ID to get the language for.
	 * @param	string $taxonomy Taxonomy for the term.
	 */
	public static function get_term_language( $term_id, $taxonomy = '' ) {
		$multilingual = self::multilingual();

		if ( ! $term_id || ! $multilingual ) {
			return false;
		}

		// WPML.
		if ( 'wpml' === $multilingual['plugin'] ) {
			$element_type = 'tax_' . ( $taxonomy ? $taxonomy : 'term' );
			$details = apply_filters( 'wpml_element_language_details', null, array(
				'element_id'   => $term_id,
				'element_type' => $element_type,
			) );

			if ( $details ) {
				// WPML may return an array or stdClass depending on version.
				if ( is_object( $details ) ) {
					$details = (array) $details;
				}

				if ( is_array( $details ) && isset( $details['language_code'] ) ) {
					return $details['language_code'];
				}
			}
		}

		// Polylang.
		if ( 'polylang' === $multilingual['plugin'] && function_exists( 'pll_get_term_language' ) ) {
			$language = pll_get_term_language( $term_id, 'slug' );

			if ( $language && ! is_wp_error( $language ) ) {
				return $language;
			}
		}

		return false;
	}

	/**
	 * Get translated term ID for a specific language.
	 *
	 * @since	10.4.0
	 * @param	int    $term_id  Term ID to translate.
	 * @param	string $taxonomy Taxonomy for the term.
	 * @param	string $language Language code to get translation for.
	 */
	public static function get_translated_term_for_language( $term_id, $taxonomy, $language ) {
		$multilingual = self::multilingual();

		if ( ! $term_id || ! $taxonomy || ! $language || ! $multilingual ) {
			return false;
		}

		$term_id = intval( $term_id );
		$language = sanitize_key( $language );

		// WPML.
		if ( 'wpml' === $multilingual['plugin'] ) {
			$translated_term = apply_filters( 'wpml_object_id', $term_id, $taxonomy, false, $language );

			if ( $translated_term ) {
				return intval( $translated_term );
			}
		}

		// Polylang.
		if ( 'polylang' === $multilingual['plugin'] && function_exists( 'pll_get_term_translations' ) ) {
			$translations = pll_get_term_translations( $term_id );

			if ( is_array( $translations ) && isset( $translations[ $language ] ) && $translations[ $language ] ) {
				return intval( $translations[ $language ] );
			}
		}

		return false;
	}

	/**
	 * Get the current admin language.
	 *
	 * @since	10.8.0
	 */
	public static function get_current_admin_language() {
		$multilingual = self::multilingual();

		if ( ! $multilingual ) {
			return false;
		}

		// WPML.
		if ( 'wpml' === $multilingual['plugin'] ) {
			$current = apply_filters( 'wpml_current_language', null );

			if ( ! $current && defined( 'ICL_LANGUAGE_CODE' ) ) {
				$current = ICL_LANGUAGE_CODE;
			}

			return $current ? sanitize_key( $current ) : false;
		}

		// Polylang.
		if ( 'polylang' === $multilingual['plugin'] && function_exists( 'pll_current_language' ) ) {
			$current = pll_current_language( 'slug' );
			return $current ? sanitize_key( $current ) : false;
		}

		return false;
	}

	/**
	 * Switch the active language context temporarily.
	 *
	 * @since	10.8.1
	 * @param	false|string $language Language to switch to.
	 */
	public static function switch_language_context( $language ) {
		$multilingual = self::multilingual();

		if ( ! $multilingual || ! $language ) {
			return false;
		}

		$language = sanitize_key( $language );
		$previous_language = self::get_current_admin_language();

		// WPML.
		if ( 'wpml' === $multilingual['plugin'] ) {
			do_action( 'wpml_switch_language', $language );
			return $previous_language;
		}

		// Polylang.
		if ( 'polylang' === $multilingual['plugin'] && function_exists( 'pll_switch_language' ) ) {
			pll_switch_language( $language );
			return $previous_language;
		}

		return $previous_language;
	}

	/**
	 * Restore the active language context after a temporary switch.
	 *
	 * @since	10.8.1
	 * @param	false|string $language Language to restore.
	 */
	public static function restore_language_context( $language ) {
		$multilingual = self::multilingual();

		if ( ! $multilingual || ! $language ) {
			return false;
		}

		$language = sanitize_key( $language );

		// WPML.
		if ( 'wpml' === $multilingual['plugin'] ) {
			do_action( 'wpml_switch_language', $language );
			return true;
		}

		// Polylang.
		if ( 'polylang' === $multilingual['plugin'] && function_exists( 'pll_switch_language' ) ) {
			pll_switch_language( $language );
			return true;
		}

		return false;
	}

	/**
	 * Set the language context for newly created terms.
	 *
	 * @since	10.8.0
	 * @param	false|string $language Language to assign to new terms.
	 */
	public static function set_new_term_language_context( $language ) {
		self::$new_term_language = $language ? sanitize_key( $language ) : false;
	}

	/**
	 * Reset the language context for newly created terms.
	 *
	 * @since	10.8.0
	 */
	public static function clear_new_term_language_context() {
		self::$new_term_language = false;
	}

	/**
	 * Maybe set the language whenever a term gets created.
	 *
	 * @since	10.8.0
	 * @param	int    $term_id  Term ID that was created.
	 * @param	int    $tt_id    Term taxonomy ID.
	 * @param	string $taxonomy Taxonomy of the created term.
	 */
	public static function maybe_set_new_term_language( $term_id, $tt_id, $taxonomy ) {
		// Only handle WPRM taxonomies.
		if ( 0 !== strpos( $taxonomy, 'wprm_' ) ) {
			return;
		}

		$language = self::$new_term_language ? self::$new_term_language : self::get_current_admin_language();

		if ( $language ) {
			self::set_term_language( $term_id, $taxonomy, $language );
		}
	}

	/**
	 * Compatibility with multilingual plugins for home URL.
	 *
	 * @since	5.7.0
	 */
	public static function get_home_url() {
		$home_url = home_url();

		// Polylang Compatibility.
		if ( function_exists( 'pll_home_url' ) ) {
			$home_url = pll_home_url();
		}

		// Add trailing slash unless there are query parameters.
		if ( false === strpos( $home_url, '?' ) ) {
			$home_url = trailingslashit( $home_url );
		}

		// Add index.php if that's used in the permalinks.
		$structure = get_option( 'permalink_structure' );
		if ( '/index.php' === substr( $structure, 0, 10 ) && false === strpos( $home_url, '?' ) ) {
			$home_url .= 'index.php/';
		}

		return $home_url;
	}
}

WPRM_Compatibility::init();
