Проблемы с программным созданием продукта с переменной подпиской в ​​WooCommerce

В настоящее время я разрабатываю веб-сайт, который использует WooCommerce и различные расширения (все они обновлены на момент написания статьи), чтобы показать ряд сообщений, принадлежащих пользовательскому типу сообщений.

Эти сообщения создаются пользователями веб-сайта в интерфейсе веб-сайта с использованием специальной формы ACF. В интерфейсной форме создается новый пост типа «shwimmer-pools» вместе с двумя новыми продуктами — один для подписки и один для бронирования.

Создание этих новых сообщений обрабатывается в нашем специальном классе ShwimmerFormHandler. Этот класс запускается при отправке формы создания пула. Вы можете просмотреть класс в этом Gist: https://gist.github.com/mangopearuk/c10c52498547016c6aa23c6cca26fb43

Проблема, с которой мы столкнулись, связана с продуктом «Подписки». Продукт должен быть продуктом с переменной подпиской, так как создатели пула могут установить 6 различных ценовых диапазонов — взрослый, детский, семейный и месяц или год подписки.

В настоящее время мы успешно создаем новый продукт подписки с помощью wp_insert_post() [строка 285], а также создаем каждый из вариантов с помощью wp_insert_post() [из строки 478]. Все они успешно зарегистрированы и вроде как работают.

Проблема, с которой мы столкнулись, заключается в том, что когда вы просматриваете форму покупки подписки, цена неверна, и всякий раз, когда вы выбираете вариант, появляется сообщение об ошибке: «К сожалению, этот продукт недоступен. Пожалуйста, выберите другую комбинацию».

Продукт подписки работает должным образом после нажатия «Обновить» в админке. Любые идеи о том, как решить эту проблему?

Спасибо, Энди


person Andi North    schedule 14.07.2016    source источник
comment
Да, именно так создается идентификатор подписки внутри класса.   -  person Andi North    schedule 14.07.2016


Ответы (2)


Вероятно, вам нужно запустить синхронизацию переменных продуктов.

$subscription_id = wp_insert_post( $args );
$product = wc_get_product( $subscription_id );
$product->variable_product_sync();

Кроме того, как вы обнаружили (и добавили сюда для полноты картины), функция синхронизации работает вне метаданных _price. _regular_price и _sale_price также сравниваются. Подписки устанавливают _subscription_price как _regular_price, а затем _price — это либо _regular_price, либо _sale_price в зависимости от того, продается ли товар со скидкой. Итак, если вы программно создаете подписку, вам нужно обязательно установить метаданные _price и _regular_price.

person helgatheviking    schedule 14.07.2016
comment
К сожалению, это не сработало. Я также пробовал: $product->sync($subscription_id); - ничего не получилось. - person Andi North; 14.07.2016
comment
Извините, я видел подобную проблему раньше и думал, что это все. У всех ваших вариаций есть цены? - person helgatheviking; 15.07.2016
comment
Да, все данные о вариантах хранятся в правильных полях — они просто не отображаются во внешнем интерфейсе, пока вы вручную не отредактируете сообщение и не обновите его. - person Andi North; 15.07.2016
comment
Спасибо за добавление этой дополнительной информации - это очень полезно! - person Andi North; 16.07.2016

Спасибо всем за помощь. Оказывается, это довольно просто исправить...

Плагин подписок не показывает метаполя _price и _regular_price, но они требуются для функции sync(). Как только я добавил эти два дополнительных поля в свой класс, функция sync() заработала.

person Andi North    schedule 15.07.2016