File: //var/www/dinamo-shop/wp-content/plugins/woocommerce-multilingual/classes/Terms/Count/Hooks.php
<?php
namespace WCML\Terms\Count;
use WCML\Terms\SuspendWpmlFiltersFactory;
use WPML\FP\Fns;
use WPML\FP\Obj;
use WPML\LIB\WP\Hooks as WpHooks;
use function WPML\FP\spreadArgs;
class Hooks implements \IWPML_Backend_Action, \IWPML_REST_Action {
/**
* @return void
*/
public function add_hooks() {
WpHooks::onFilter( 'woocommerce_product_recount_terms', PHP_INT_MAX )
->then( spreadArgs( [ self::class, 'disableTermFilters' ] ) );
WpHooks::onAction( 'icl_save_term_translation', 10, 2 )
->then( spreadArgs( [ self::class, 'recountOnSaveTermTranslation' ] ) );
WpHooks::onAction( 'wpml_sync_term_hierarchy_done' )
->then( [ self::class, 'recountAllTermsInShutdown' ] );
}
/**
* At the top of `_wc_term_recount` we suspend all WPML term filters,
* and we resume it at the bottom once `wc_term_counts` transient
* is deleted.
*
* @see _wc_term_recount()
*
* @param bool $shouldRecountTerms
*
* @return bool
*/
public static function disableTermFilters( $shouldRecountTerms ) {
if ( $shouldRecountTerms ) {
$filtersSuspend = SuspendWpmlFiltersFactory::create();
add_action( 'delete_transient_wc_term_counts', function() use ( $filtersSuspend ) {
$filtersSuspend->resume();
} );
}
return $shouldRecountTerms;
}
/**
* @param \stdClass $originalTax
* @param int $translatedTerm
*
* @return void
*/
public static function recountOnSaveTermTranslation( $originalTax, $translatedTerm ) {
$taxonomyName = Obj::prop( 'taxonomy', $originalTax );
if ( in_array( $taxonomyName, [ 'product_cat', 'product_tag' ], true ) ) {
SuspendWpmlFiltersFactory::create()->runAndResume( function () use ( $translatedTerm, $taxonomyName ) {
_wc_term_recount( [ (int) Obj::prop( 'term_taxonomy_id', $translatedTerm ) ], get_taxonomy( $taxonomyName ) );
} );
}
}
/**
* @return void
*/
public static function recountAllTermsInShutdown() {
WpHooks::onAction( 'shutdown' )->then( Fns::once( [ self::class, 'recountAllTerms' ] ) );
}
/**
* @return void
*/
public static function recountAllTerms() {
SuspendWpmlFiltersFactory::create()->runAndResume( function() {
wc_recount_all_terms();
} );
}
}