Поддержка WooCommerce Кастомное поле в админке товара

  • Здравствуйте, есть функция добавления/сохранения/вывода кастомного бейджа товара. Тип лейбла выбирается в админке в карточке товара. Всё работает, сохраняется и выводится, но почему-то на фронте выводится упорно имя ключа массива вместо текста лейбла. Т.е. вместо ‘Новинка’, ‘Скидка’ и пр. выводится ‘stiker_new’, ‘stiker_sale’. Никак не получается вывести надпись лейбла, подскажите в чём ошибка?

    // Enabling and Displaying Fields in backend
    add_action( 'woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields' );
    function woo_add_custom_general_fields() {
    
        echo '<div class="options_group">';
    
        woocommerce_wp_select( array( // Text Field type
            'id'          => 'sticker_1',
            'label'       => __( 'Бейдж', 'woocommerce' ),
            'description' => __( 'Бейдж товара.', 'woocommerce' ),
            'desc_tip'    => true,
            'options'     => array(
                ''        => __( 'Выберите тип бейджа', 'woocommerce' ),
                'stiker_new'    => __('Новинка', 'woocommerce' ),
                'stiker_sale' => __('Скидка', 'woocommerce' ),
    			'stiker_hit' => __('Хит продаж', 'woocommerce' ),
    			'stiker_super_price' => __('Лучшая цена', 'woocommerce' ),
            )
        ) );
    
        echo '</div>';
    }
    
    // Save Fields values to database when submitted (Backend)
    add_action( 'woocommerce_process_product_meta', 'woo_save_custom_general_fields', 30, 1 );
    function woo_save_custom_general_fields( $post_id ){
    
        // Saving "Conditions" field key/value
        $posted_field_value = $_POST['sticker_1'];
        if( ! empty( $posted_field_value ) )
            update_post_meta( $post_id, 'sticker_1', esc_attr( $posted_field_value ) );
    }
    
    // Display In front end
    add_action( 'woocommerce_sale_flash', 'woo_display_custom_general_fields_values', 50 );
    function woo_display_custom_general_fields_values() {
        global $product;
    
        // compatibility with WC +3
        $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id;
        echo '<span class="sticker">' . get_post_meta( $product_id, 'sticker_1', true ) . '</span>';
    }
Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Модератор Юрий

    (@yube)

    подскажите в чём ошибка?

    В том, что Вы полагаете, что html-форма сабмитит текстовую приписку. Нет, сабмитится value выбранного option.

    Вам надо делать обработку полученных метаданных. Например как-то так:

    
    $stiker_1 = get_post_meta( $product_id, 'sticker_1', true );
    switch ( $stiker_1 ) {
        case 'stiker_new' : $sticker_label = 'Новинка'; break;
        case 'stiker_sale' : $sticker_label = 'Скидка'; break;
        case 'stiker_hit' : $sticker_label = 'Хит продаж'; break;
        case 'stiker_super_price' : $sticker_label = 'Лучшая цена'; break;
    }
    echo '<span class="sticker">' . $sticker_label . '</span>';
    

    И кстати, конструкция __('Новинка', 'woocommerce' ) абсолютно бессмысленна, т.к. у woocommerce нет фразы ‘Новинка’ и вряд ли когда-нибудь будет.

    Преогромнейшее спасибо за подсказку! Это действительно работает. Уже не один час с ними зависаю, вы меня спасли. Я предполагала, что дело в самих надписях, в массиве просто как текст пробовала добавлять, но почему-то это не сработало. Главное в самой админке же текст отображался..а на фронте нет

Просмотр 2 ответов — с 1 по 2 (всего 2)