File: /var/www/dinamo-shop/wp-content/plugins/woocommerce-multilingual/classes/Block/Convert/Hooks.php
<?php
namespace WCML\Block\Convert;
use IWPML_DIC_Action;
use IWPML_Frontend_Action;
use WPML\Core\ISitePress;
use WCML\StandAlone\NullSitePress;
use SitePress;
use WCML\Rest\Frontend\Language;
use WPML\FP\Just;
use WPML\FP\Str;
class Hooks implements IWPML_Frontend_Action, IWPML_DIC_Action {
/** @var SitePress|NullSitePress $sitepress */
private $sitepress;
/** @var Language $frontendRestLang */
private $frontendRestLang;
/**
* @param SitePress|NullSitePress $sitepress
* @param Language $frontendRestLang
*/
public function __construct( ISitePress $sitepress, Language $frontendRestLang ) {
$this->sitepress = $sitepress;
$this->frontendRestLang = $frontendRestLang;
}
public function add_hooks() {
add_filter( 'render_block_data', [ $this, 'filterIdsInBlock' ] );
add_filter( 'render_block_woocommerce/product-search', [ $this, 'filterProductSearchForm' ] );
add_action( 'parse_query', [ $this, 'addCurrentLangToQueryVars' ] );
if ( ! ( is_admin() || \WPML_URL_HTTP_Referer::is_post_edit_page() ) ) {
add_filter( 'rest_request_before_callbacks', [ $this, 'useLanguageFrontendRestLang' ], 10, 3 );
}
}
public function filterIdsInBlock( array $block ) {
return ConverterProvider::get( $block['blockName'] )->convert( $block );
}
/**
* WC is caching query results in transients which name
* is based on the query vars hash.
*
* @param \WP_Query $query
*/
public function addCurrentLangToQueryVars( $query ) {
if ( $query instanceof \Automattic\WooCommerce\Blocks\Utils\BlocksWpQuery ) {
$query->query_vars['wpml_language'] = $this->sitepress->get_current_language();
}
}
/**
* @param \WP_HTTP_Response|\WP_Error $response
* @param array $handler
* @param \WP_REST_Request $request
*
* @return \WP_HTTP_Response|\WP_Error
*/
public function useLanguageFrontendRestLang( $response, $handler, $request ) {
if ( $this->isWcRestRequest( $request ) ) {
$lang = $this->frontendRestLang->get();
if ( $lang ) {
$this->sitepress->switch_lang( $lang );
}
}
return $response;
}
/**
* @param \WP_REST_Request $request
*
* @return bool
*/
private function isWcRestRequest( \WP_REST_Request $request ) {
return strpos( $request->get_route(), '/wc/blocks/' ) === 0
|| strpos( $request->get_route(), '/wc/store/' ) === 0;
}
/**
* @param string $blockContent
*
* @return string
*/
public function filterProductSearchForm( $blockContent ) {
// $replaceActionUrl :: string -> string
$replaceActionUrl = Str::pregReplace( '/(<form[^>]*action=")([^"]*)"/', '$1' . home_url( '/' ) . '"' );
// $addLanguageHiddenField :: string -> string
$addLanguageHiddenField = [ $this->sitepress, 'get_search_form_filter' ];
return Just::of( $blockContent )
->map( $replaceActionUrl )
->map( $addLanguageHiddenField )
->get();
}
}