provider_cluster = $provider_cluster; } /** * @return mixed[] */ public function resolve_term_value( Term_Settings $term ): array { // dynamicTerm is actually a Pro option, but we support them all // - as backward compatibility with existing Lite setups. if ( $term->is_dynamic_term() ) { $resolvers = $this->get_value_resolvers( $term ); $resolver = $resolvers[ $term->get_dynamic_term() ] ?? null; return is_callable( $resolver ) ? $resolver() : array(); } $term_id = $term->get_term_id(); return array( $term_id ); } /** * @return array */ protected function get_value_resolvers( Term_Settings $term ): array { return array( '$current$' => fn() => array( self::resolve_current_term_id() ), '$meta$' => fn() => $this->resolve_meta_value( $term ), '$custom-argument$' => fn() => $this->resolve_custom_value( $term ), ); } /** * @return mixed[] */ protected function resolve_meta_value( Term_Settings $term ): array { $vendor_name = $this->provider_cluster->get_vendor_name_by_key( $term->get_vendor_key() ); $field_id = $term->get_field_id(); $field_data = $this->provider_cluster->get_field_meta( $vendor_name, $field_id ); if ( $field_data->is_field_exist() ) { $field_name = $field_data->get_name(); $current_term_id = self::resolve_current_term_id(); return self::get_meta_ids( $field_name, $current_term_id ); } return array(); } /** * @return mixed[] */ protected function resolve_custom_value( Term_Settings $term ): array { $custom_arguments = $this->get_context()->get_custom_arguments(); $value = any( $custom_arguments, $term->get_custom_argument_name() ); if ( is_numeric( $value ) ) { $term_id = int( $value ); return array( $term_id ); } if ( is_array( $value ) ) { return $value; } return array(); } /** * @return int[] */ protected static function get_meta_ids( string $field_name, int $object_id ): array { $meta_value = get_post_meta( $object_id, $field_name, true ); if ( is_numeric( $meta_value ) ) { $meta_id = int( $meta_value ); return array( $meta_id ); } if ( is_array( $meta_value ) && key_exists( 0, $meta_value ) && is_numeric( $meta_value[0] ) ) { return array_map( fn( $item ) => int( $item ), $meta_value ); } return array(); } protected static function resolve_current_term_id(): int { return get_queried_object_id(); } }