Коротко — в стандартном UI плагина действительно нет per‑product полей. Решение — добавить свои поля в карточку товара и перехватить момент сборки позиций чека, чтобы подменить для нужного товара значения payment_subject / payment_mode (в API ЮKassa это «предмет расчёта» и «способ расчёта»).
Я привожу готовый пример, который:
- добавляет два селекта в «Данные товара»;
- сохраняет значения в метаполе товара;
- при формировании чеков заменяет payment_subject и payment_mode для позиций с заданным product_id.
Обратите внимание: конкретный хук/фильтр, который плагин использует для формирования массива позиций чека, может называться иначе в вашей версии плагина. В примере я использую условный фильтр yookassa_receipt_items — если у вас другой, просто замените имя фильтра на тот, что используется в вашем плагине (поиск по слову payment_subject в коде плагина поможет найти нужный фильтр).
Код (поместите в functions.php вашей темы/child-theme или в сниппет-плагин):
<?php
// 1) поля в карточке товара
add_action('woocommerce_product_options_general_product_data', 'yk_add_product_fields');
function yk_add_product_fields(){
echo '<div class="options_group">';
woocommerce_wp_select( array(
'id' => '_yookassa_payment_subject',
'label' => 'ЮKassa — предмет расчёта',
'options' => array(
'' => 'Не задано (по умолчанию)',
'commodity' => 'Товар (commodity)',
'service' => 'Услуга (service)',
'excise' => 'Подакцизный товар (excise)',
'job' => 'Работа (job)',
'payment' => 'Платёж (payment)',
'another' => 'Другое (another)'
)
));
woocommerce_wp_select( array(
'id' => '_yookassa_payment_mode',
'label' => 'ЮKassa — способ расчёта',
'options' => array(
'' => 'Не задано (по умолчанию)',
'full_prepayment' => 'Полная предварительная оплата',
'partial_prepayment'=> 'Частичная предварительная оплата',
'advance' => 'Аванс',
'full_payment' => 'Полная оплата',
'partial_payment' => 'Частичная оплата',
'credit' => 'Передача в кредит',
'credit_payment' => 'Оплата кредита'
)
));
echo '</div>';
}
// 2) сохранение полей
add_action('woocommerce_process_product_meta', 'yk_save_product_fields');
function yk_save_product_fields($post_id){
if ( isset($_POST['_yookassa_payment_subject']) ) {
update_post_meta($post_id, '_yookassa_payment_subject', sanitize_text_field($_POST['_yookassa_payment_subject']));
} else {
delete_post_meta($post_id, '_yookassa_payment_subject');
}
if ( isset($_POST['_yookassa_payment_mode']) ) {
update_post_meta($post_id, '_yookassa_payment_mode', sanitize_text_field($_POST['_yookassa_payment_mode']));
} else {
delete_post_meta($post_id, '_yookassa_payment_mode');
}
}
// 3) подмена полей в позициях чека
// Замените 'yookassa_receipt_items' на реальный фильтр вашего плагина, если он отличается.
add_filter('yookassa_receipt_items', 'yk_modify_receipt_items', 10, 2);
function yk_modify_receipt_items($items, $order){
foreach($items as $k => $item){
// $item может быть массивом или объектом в зависимости от плагина — пытаемся корректно получить product_id
$product_id = 0;
if ( is_array($item) ) {
if ( !empty($item['product_id']) ) $product_id = (int) $item['product_id'];
elseif ( !empty($item['id']) ) $product_id = (int) $item['id'];
} elseif ( is_object($item) ) {
if ( method_exists($item, 'get_product_id') ) $product_id = (int) $item->get_product_id();
elseif ( isset($item->product_id) ) $product_id = (int) $item->product_id;
}
if ( $product_id ) {
$subject = get_post_meta($product_id, '_yookassa_payment_subject', true);
$mode = get_post_meta($product_id, '_yookassa_payment_mode', true);
if ( $subject ) {
// структура позиции у вас может отличаться — подставьте нужный ключ
$items[$k]['payment_subject'] = $subject;
}
if ( $mode ) {
$items[$k]['payment_mode'] = $mode;
}
}
}
return $items;
}
?>
Пояснения и рекомендации:
- Значения payment_subject и payment_mode перечислены согласно API ЮKassa (ключи нужно передавать именно такими строками).
- Чтобы точно найти, куда «вклиниться», откройте папку плагина и выполните поиск по словам payment_subject, payment_mode или по строке receipt/items — это покажет, где формируются данные для чека и какой фильтр/хук использовать.
- Если вы укажете, какую версию плагина и как именно называются фильтры в его коде (или пришлёте фрагмент кода, где собираются позиции чека), я подправлю пример под вашу реализацию.
Могу помочь адаптировать код под точный хук вашего плагина — пришлите название плагина и версию или фрагмент кода, где собираются данные чека.