You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.9 KiB
85 lines
1.9 KiB
<?php
|
|
|
|
namespace WCML\DisplayAsTranslated;
|
|
|
|
use WPML\FP\Just;
|
|
use WPML\FP\Obj;
|
|
use WPML\LIB\WP\Hooks;
|
|
use function WPML\FP\invoke;
|
|
use function WPML\FP\spreadArgs;
|
|
|
|
class ProductCatHooks implements \IWPML_Frontend_Action {
|
|
|
|
/**
|
|
* @var bool $isTermsFilterLoaded
|
|
*/
|
|
private $isTermsFilterLoaded = false;
|
|
|
|
const KEY_FIX_TERM_COUNT_ZERO = 'wcml_fix_term_count_zero';
|
|
|
|
/** @var \WPML_Translation_Element_Factory $elementFactory */
|
|
private $elementFactory;
|
|
|
|
public function __construct( \WPML_Translation_Element_Factory $elementFactory ) {
|
|
$this->elementFactory = $elementFactory;
|
|
}
|
|
|
|
public function add_hooks() {
|
|
Hooks::onFilter( 'woocommerce_product_subcategories_args' )
|
|
->then( spreadArgs( [ $this, 'addFixCountArg' ] ) );
|
|
}
|
|
|
|
/**
|
|
* @param array $args
|
|
*
|
|
* @return array
|
|
*/
|
|
public function addFixCountArg( $args ) {
|
|
$this->loadTermsFilter();
|
|
return (array) Obj::assoc( self::KEY_FIX_TERM_COUNT_ZERO, true, $args );
|
|
}
|
|
|
|
/**
|
|
* @return void
|
|
*/
|
|
private function loadTermsFilter() {
|
|
if ( ! $this->isTermsFilterLoaded ) {
|
|
Hooks::onFilter( 'get_terms', 10, 4 )
|
|
->then( spreadArgs( [ $this, 'fixTermsWithZeroCount' ] ) );
|
|
|
|
$this->isTermsFilterLoaded = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param array $terms
|
|
* @param array|null $taxonomy
|
|
* @param array $termQueryVars
|
|
*
|
|
* @return array
|
|
*/
|
|
public function fixTermsWithZeroCount( $terms, $taxonomy, $termQueryVars ) {
|
|
if ( ! empty( $termQueryVars[ self::KEY_FIX_TERM_COUNT_ZERO ] ) ) {
|
|
foreach ( $terms as $term ) {
|
|
if ( ! $term->count ) {
|
|
$term->count = $this->getSourceTermCount( $term );
|
|
}
|
|
}
|
|
}
|
|
|
|
return $terms;
|
|
}
|
|
|
|
/**
|
|
* @param \WP_Term $term
|
|
*
|
|
* @return int
|
|
*/
|
|
private function getSourceTermCount( $term ) {
|
|
return (int) Just::of( $this->elementFactory->create_term( $term->term_taxonomy_id ) )
|
|
->map( invoke( 'get_source_element' ) )
|
|
->map( invoke( 'get_wp_object' ) )
|
|
->map( Obj::prop( 'count' ) )
|
|
->getOrElse( $term->count );
|
|
}
|
|
}
|
|
|