$product->функция get_id() для всех продуктов

#php #wordpress #product

Вопрос:

У меня есть вопрос.. мы получили скрипт от Enhancer для подписки на WooCommerce. Этот скрипт проверяет, был ли у клиента уже продукт, если да, он не дает пробную версию.

Но все наши продукты-это одна и та же услуга, только немного отличающиеся точки внутри пакетов.

Поэтому мы хотим проверить все товары, а не только выбранный. Есть ли способ изменить часть get_id для проверки всех продуктов?

Это часть кода:

 public static function limit_trial( $trial_length, $product ) {  if ( $trial_length lt;= 0 ) {  return $trial_length ;  }   $user_id = get_current_user_id() ;   if ( ! $user_id ) {  return $trial_length ;  }   if ( isset( self::$onetime_trial_cache[ $user_id ][ $product-gt;get_id() ] ) ) {  return self::$onetime_trial_cache[ $user_id ][ $product-gt;get_id() ] ? 0 : $trial_length ;  }   if ( $product-gt;is_type( 'variation' ) ) {  $parent_product = wc_get_product( $product-gt;get_parent_id() ) ;  } else {  $parent_product = $product ;  }   if ( 'no' !== self::get_product_limitation( $parent_product ) ) {  self::$onetime_trial_cache[ $user_id ][ $product-gt;get_id() ] = false ;  return $trial_length ;  }   if ( 'yes' !== get_post_meta( $parent_product-gt;get_id(), '_enr_limit_trial_to_one', true ) ) {  self::$onetime_trial_cache[ $user_id ][ $product-gt;get_id() ] = false ;  return $trial_length ;  }   $subscriptions = wcs_get_users_subscriptions( $user_id ) ;   foreach ( $subscriptions as $subscription ) {  if ( $subscription-gt;has_product( $product-gt;get_id() ) amp;amp; ( '' !== $subscription-gt;get_trial_period() || 0 !== $subscription-gt;get_time( 'trial_end' ) ) ) {  self::$onetime_trial_cache[ $user_id ][ $product-gt;get_id() ] = true ;  return 0 ;  }  }   self::$onetime_trial_cache[ $user_id ][ $product-gt;get_id() ] = false ;  return $trial_length ; }  

Ответ №1:

Вы должны получить все продукты, используя WP_Query() , затем вы можете повторить цикл, чтобы получить продукт. попробуйте выполнить приведенный ниже код.

 public static function limit_trial( $trial_length, $product ) {  if ( $trial_length lt;= 0 ) {  return $trial_length ;  }   $user_id = get_current_user_id() ;   if ( ! $user_id ) {  return $trial_length ;  }   $params = array(  'posts_per_page' =gt; -1,  'post_type' =gt; 'product'  );   $products = new WP_Query( $params );    if ( $products-gt;have_posts() ) { while ( $products-gt;have_posts() ) { $products-gt;the_post();    if ( isset( self::$onetime_trial_cache[ $user_id ][ get_the_ID() ] ) ) {  return self::$onetime_trial_cache[ $user_id ][ get_the_ID() ] ? 0 : $trial_length ;  }   if ( $product-gt;is_type( 'variation' ) ) {  $parent_product = wc_get_product( $product-gt;get_parent_id() ) ;  } else {  $parent_product = wc_get_product( get_the_ID() ) ;  }   if ( 'no' !== self::get_product_limitation( $parent_product ) ) {  self::$onetime_trial_cache[ $user_id ][ get_the_ID() ] = false ;  return $trial_length ;  }   if ( 'yes' !== get_post_meta( $parent_product-gt;get_id(), '_enr_limit_trial_to_one', true ) ) {  self::$onetime_trial_cache[ $user_id ][ get_the_ID() ] = false ;  return $trial_length ;  }   $subscriptions = wcs_get_users_subscriptions( $user_id ) ;   foreach ( $subscriptions as $subscription ) {  if ( $subscription-gt;has_product( get_the_ID() ) amp;amp; ( '' !== $subscription-gt;get_trial_period() || 0 !== $subscription-gt;get_time( 'trial_end' ) ) ) {  self::$onetime_trial_cache[ $user_id ][ get_the_ID() ] = true ;  return 0 ;  }  }    self::$onetime_trial_cache[ $user_id ][ get_the_ID() ] = false ;   } wp_reset_postdata(); }   return $trial_length ; }  

Комментарии:

1. Я использовал ваш код, но все еще не работал. У меня уже был продукт А, и теперь я хочу взять продукт В, но также даю мне испытание. Нужно ли мне где-то определять продукты с помощью идентификатора?

2. можете ли вы уточнить свой вопрос более подробно, где вы используете эту limit_trial функцию?

3. мы используем плагин «Enhancer для подписки на WooCommerce», это часть плагина, где он проверяет, была ли у клиента уже пробная версия или нет. Но он проверяет только, существовал ли товар в корзине в прошлом. Если оно существовало, он не дает суда, когда его нет, оно дает суд. Но у нас есть 6 продуктов, мы хотим, чтобы скрипт проверил все 6 продуктов, если бы у него был один из них, ему не следовало бы давать пробную версию.

Ответ №2:

Разве это не должно быть просто той частью кода, где он проверяет, какой продукт у него был.

 foreach ( $subscriptions as $subscription ) {  if ( $subscription-gt;has_product('295587','295585','295578') amp;amp; ( '' !== $subscription-gt;get_trial_period() || 0 !== $subscription-gt;get_time( 'trial_end' ) ) ) {  self::$onetime_trial_cache[ $user_id ][ $product-gt;get_id() ] = true ;  return 0 ;  }  

Так что, возможно, просто ввод с идентификатором продукта неверен. Я действительно могу определить их, используя идентификаторы продуктов (я знаю, что они не динамичны, но это не будет проблемой). Как я должен вводить продукты, которые мне нужно проверить?