#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 ; }
Так что, возможно, просто ввод с идентификатором продукта неверен. Я действительно могу определить их, используя идентификаторы продуктов (я знаю, что они не динамичны, но это не будет проблемой). Как я должен вводить продукты, которые мне нужно проверить?