Как в WordPress с плагином ЮKassa отредактировать поля чека только для одного конкретного товара?

Кто-нибудь подскажет, как в плагине юкасса для WooCommerce установить «предмет расчёта» и «способ расчёта» только для одного товара? В карточке редактирования товара в блоке «Данные товара» соответствующей вкладки нет.
  • 19 марта 2026 г. 18:01
Ответы на вопрос 1
Коротко — в стандартном 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 — это покажет, где формируются данные для чека и какой фильтр/хук использовать.
- Если вы укажете, какую версию плагина и как именно называются фильтры в его коде (или пришлёте фрагмент кода, где собираются позиции чека), я подправлю пример под вашу реализацию.

Могу помочь адаптировать код под точный хук вашего плагина — пришлите название плагина и версию или фрагмент кода, где собираются данные чека.
Похожие вопросы