Análise avançada do WooCommerce: como personalizar os atributos dos produtos e os campos de gestão de inventário

Leitura de 4 minutos
2026-03-14
2026-06-03
2,971
Eu recebo uma comissão quando você faz compras através dos links abaixo, sem custo adicional para você.

Para lojas WooCommerce maduras, o sistema padrão de gestão de atributos e inventário de produtos costuma ser insuficiente para atender às necessidades de uma operação refinada. Pode ser necessário acompanhar o inventário de forma independente para o mesmo produto com diferentes especificações (por exemplo, combinações de cores e tamanhos de camisetas) ou adicionar atributos de vendas exclusivos e filtrar os produtos de acordo com eles. Este artigo irá explorar em profundidade como expandir a capacidade de gestão de dados do WooCommerce por meio de campos personalizados e ganchos, permitindo uma gestão de dados avançada que realmente se alinhe com a lógica do negócio.

Compreender a estrutura de dados central do WooCommerce.

Para implementar uma personalização eficaz, primeiro é necessário compreender o modelo básico do WooCommerce para processar dados de produtos. Isto ajudar-nos-á a determinar onde e como inserir a lógica de personalização.

O funcionamento das propriedades e variantes dos produtos.

O WooCommerce usaproduct_attributesOs metadados são utilizados para armazenar atributos globais e locais do produto. Estes atributos definem as especificações do produto (como “cor” e “tamanho”). Quando você ativa o recurso para o produto,variable productQuando se trata de (produtos variáveis), o sistema gera todos os combinações possíveis dessas atributos.product_variationSubartigo (variante do produto).

Leitura recomendada Guia completo para o desenvolvimento e otimização de sites de comércio eletrónico no WooCommerce

Cada variante de produto é um tipo de artigo de produto independente, com o seu próprio preço e stock._stock)、SKU (_skuOs campos incluem tamanho, cor, estilo e assim por diante. A lógica fundamental de gestão de inventário ocorre ao nível das variantes. Por exemplo, se o stock de uma variante com o tamanho “L” e a cor “azul” estiver esgotado, isso não afetará o estado do stock da variante com o tamanho “M” e a cor “vermelha”.

Hospedagem para sites WordPress da UltraHost
Garantia de reembolso em 30 dias, largura de banda ilimitada e banco de dados, proteção contra DDoS gratuita; desconto de 50% na compra de 3 anos (planos de 4 TB a 10 TB).

As limitações dos metacampos integrados.

Por predefinição, o WooCommerce fornece um conjunto de metacampos predefinidos para cada produto (incluindo produtos simples e variantes), tais como:_price, _regular_price, _sale_price, _stock, _stock_status, _manage_stockNo entanto, se precisar de acompanhar informações como “inventário de diferentes canais”, “números de lote” ou “materiais personalizados dos produtos”, estes campos são claramente insuficientes.

Neste caso, precisamos de adicionar e utilizar campos personalizados através da API de metadados do WordPress e dos ganchos específicos do WooCommerce, de forma a integrar estes novos dados de forma transparente em todo o processo de adicionar, eliminar, editar e consultar produtos, bem como na sua apresentação na página inicial.

Adicionar campos de atributos personalizados aos produtos.

A criação de novas atributos de produtos, como “Composição do tecido” ou “Local de produção”, pode enriquecer significativamente a descrição do produto e as capacidades de filtragem. Vamos implementar isto dividindo o processo em duas partes: gestão back-end e apresentação front-end.

Registar e mostrar novos campos no backoffice de gestão.

Para que os administradores da loja possam inserir estes novos atributos facilmente, precisamos de adicionar campos personalizados à página de edição de produtos. Isto é normalmente feito através dewoocommerce_product_options_general_product_dataewoocommerce_product_after_variable_attributesAguardar os ganchos de ação para concluir.

Leitura recomendada Guia de desenvolvimento de plugins do WordPress: um tutorial passo a passo para criar o seu próprio plugin do zero.

A seguir, apresentamos um exemplo de como adicionar uma caixa de texto com o “Número do lote de produção” para todos os produtos. Este código deve ser adicionado ao tema.functions.phpNo ficheiro ou num plug-in personalizado.

add_action( 'woocommerce_product_options_inventory_product_data', 'add_custom_batch_field' );
function add_custom_batch_field() {
    global $product_object;

woocommerce_wp_text_input( array(
        'id'          => '_custom_batch_number',
        'label'       => __( '生产批次号', 'your-textdomain' ),
        'desc_tip'    => true,
        'description' => __( '用于追溯商品生产来源的唯一编号。', 'your-textdomain' ),
        'value'       => $product_object->get_meta( '_custom_batch_number', true ),
    ) );
}

Para produtos variáveis, se pretender atribuir um número de lote diferente a cada variante, terá de adicionar um campo ao painel de definições da variante.

add_action( 'woocommerce_variation_options_inventory', 'add_custom_field_to_variation', 10, 3 );
function add_custom_field_to_variation( $loop, $variation_data, $variation ) {
    woocommerce_wp_text_input( array(
        'id'            => "_custom_batch_number_{$loop}",
        'name'          => "_custom_batch_number[{$loop}]",
        'label'         => __( '变体批次号', 'your-textdomain' ),
        'desc_tip'      => true,
        'description'   => __( '该特定变体的生产批次。', 'your-textdomain' ),
        'value'         => get_post_meta( $variation->ID, '_custom_batch_number', true ),
        'wrapper_class' => 'form-row form-row-full',
    ) );
}

\nSalvar os valores dos campos personalizados.

Não basta apenas mostrar a caixa de entrada; também precisamos armazenar os valores inseridos nos metadados do artigo do produto correspondente quando o usuário clica em “Salvar” ou “Atualizar”. Para isso, é necessário usarwoocommerce_process_product_metaewoocommerce_save_product_variationGancho.

hospedagem compartilhada da hosting.com
Alto desempenho com CPUs AMD EPYC, armazenamento SSD NVMe e LiteSpeed, suporte interno especializado 24 horas por dia, 7 dias por semana, medidas de segurança avançadas, incluindo SSL, força bruta, malware e proteção contra DDoS, economia de até 73%
// 保存简单商品的批次号
add_action( 'woocommerce_process_product_meta', 'save_custom_batch_field' );
function save_custom_batch_field( $product_id ) {
    $batch_number = isset( $_POST['_custom_batch_number'] ) ? sanitize_text_field( $_POST['_custom_batch_number'] ) : '';
    update_post_meta( $product_id, '_custom_batch_number', $batch_number );
}

// 保存变体商品的批次号
add_action( 'woocommerce_save_product_variation', 'save_variation_custom_field', 10, 2 );
function save_variation_custom_field( $variation_id, $loop ) {
    $batch_number = isset( $_POST['_custom_batch_number'][ $loop ] ) ? sanitize_text_field( $_POST['_custom_batch_number'][ $loop ] ) : '';
    update_post_meta( $variation_id, '_custom_batch_number', $batch_number );
}

Expandir a lógica de gestão de inventário.

O valor central dos campos de inventário personalizados reside na sua capacidade de interagir com o sistema de gestão de inventário central do WooCommerce, permitindo cálculos e verificações de inventário baseados em regras complexas.

Criar um campo de rastreamento de inventário para vários armazéns

Suponhamos que você precise gerir o inventário de dois armazéns, um “armazém principal” e outro “armazém secundário”. Podemos adicionar dois campos de inventário independentes para cada variante de produto e fazer uma avaliação com base no inventário total na interface do utilizador.

Primeiramente, adicione um campo de inventário personalizado à variante (exibido na guia “Inventário”).

Leitura recomendada Análise aprofundada dos campos de checkout personalizados do WooCommerce: uma prática completa desde a criação até o processamento de dados.

add_action( 'woocommerce_variation_options_inventory', 'add_multi_warehouse_stock_fields', 10, 3 );
function add_multi_warehouse_stock_fields( $loop, $variation_data, $variation ) {
    echo '<div class="multi-warehouse-fields">';
    woocommerce_wp_text_input( array(
        'id'            =&gt; "_warehouse_main_stock_{$loop}",
        'name'          =&gt; "_warehouse_main_stock[{$loop}]",
        'label'         =&gt; __( 'Stock principal do armazém', 'your-textdomain' ),
        'type'          =&gt; 'number',
        'value'         =&gt; get_post_meta( $variation-&gt;ID, '_warehouse_main_stock', true ),
    ) );
    woocommerce_wp_text_input( array(
        'id'            =&gt; "_warehouse_branch_stock_{$loop}",
        'name'          =&gt; "_warehouse_branch_stock[{$loop}]",
        'label'         =&gt; __( 'Stock da filial do armazém', 'your-textdomain' ),
        'type'          =&gt; 'number',
        'value'         =&gt; get_post_meta( $variation-&gt;ID, '_warehouse_branch_stock', true ),
    ) );
    echo ' <p>';

```

 ';
    woocommerce_wp_text_input( array(
        'id'            =&gt; "_warehouse_main_stock_{$loop}",
        'name'          =&gt; "_warehouse_main_stock[{$loop}]",
        'label'         =&gt; __( 'Total warehouse stock', 'your-textdomain' ),
        'type'          =&gt; 'number',
        'value'         =&gt; get_post_meta( $variation-&gt;ID, '_warehouse_main_stock', true ),
    ) );
    woocommerce_wp_text_input( array(
        'id'            =&gt; "_warehouse_branch_stock_{$loop}",
        'name'          =&gt; "_warehouse_branch_stock[{$loop}]",
        'label'         =&gt; __( 'Branch warehouse stock', 'your-textdomain' ),
        'type'          =&gt; 'number',
        'value'         =&gt; get_post_meta( $variation-&gt;ID, '_warehouse_branch_stock', true ),
    ) );
    echo ' <p>';

```'</div>';
}

Calcular e sobrescrever a lógica do estoque total.

Em seguida, precisamos calcular o stock total (armazém principal + armazéns secundários) e fazer com que o WooCommerce utilize este valor calculado como o “stock total” desta variante. Para isso, é necessário utilizar owoocommerce_product_get_stock_quantityFiltro.

add_filter( 'woocommerce_product_get_stock_quantity', 'calculate_total_stock_from_warehouses', 10, 2 );
function calculate_total_stock_from_warehouses( $stock_quantity, $product ) {
    // 确保只对变体商品进行操作
    if ( $product->is_type( 'variation' ) ) {
        $main_stock = (int) $product->get_meta( '_warehouse_main_stock', true );
        $branch_stock = (int) $product->get_meta( '_warehouse_branch_stock', true );
        $calculated_total = $main_stock + $branch_stock;

// 如果计算总值与默认_stock值不同,则更新默认_stock字段(可选,用于保持数据一致性)
        // update_post_meta( $product->get_id(), ‘_stock', $calculated_total );

return $calculated_total;
    }
    return $stock_quantity;
}

Ao mesmo tempo, também precisamos garantir que, ao fazer um pedido, as existências do armazém correspondente sejam deduzidas de acordo com as regras do negócio (por exemplo, priorizando o envio a partir do armazém). Isto pode ser feito através dewoocommerce_reduce_order_stockouwoocommerce_payment_complete_reduce_order_stockA implementação do gancho, deduzindo o valor por omissão._stockAo mesmo tempo, também deduzimos o valor dos nossos campos de armazém personalizados.

Hospedagem Compartilhada InterServer
Hospedagem compartilhada $2.50 USD por mês, primeiro mês $0.1 USD código promocional tryinterserver, 461 scripts de aplicativos em nuvem, instalação com um clique.

Exibir e utilizar dados personalizados na página inicial.

Os dados dos campos adicionados devem, em última análise, servir os clientes do front-end, seja para exibição, filtragem ou como base para decisões de compra.

Exibir informações personalizadas na página de detalhes do produto.

fazer uso dewoocommerce_product_meta_startouwoocommerce_after_variations_tablePor exemplo, é possível utilizar ganchos para exportar informações como o número do lote para a página individual do produto.

add_action( 'woocommerce_after_variations_table', 'display_batch_number_on_frontend' );
function display_batch_number_on_frontend() {
    global $product;
    if ( $product-&gt;is_type( 'variable' ) ) {
        // Para produtos variáveis, pode ser necessário exibir o número do lote da variante selecionada atualmente, dinamicamente, por meio de JavaScript.
        echo ' <p>Número do lote: ' . $product-&gt;get_variation_batch_number() . '</p>';
    }
}'<div class="batch-info" style="margin-top: 15px;"><strong>Informações do lote:</strong><span id="dynamic-batch-number">Por favor, selecione as especificações do produto.</span></div>'\n";
            wc_enqueue_js( ‘
              $( ’input.variation_id‘ ).change( function() {
                  if ( ‘' != $( this ).val() ) {
                      var variation_id = $( this ).val();
                      // Fazer uma solicitação AJAX para obter o número de lote da variante
                     $.ajax({
                         url: wc_add_to_cart_params.ajax_url,
                         type: 'POST‘,
                         data: {
                            action: ’get_variation_batch_number‘,
                            variation_id: variation_id,
                         },
                         success: function( response ) {
                           $( ’#dynamic-batch-number‘ ).text( response.data );
                         }
                      });
                  } else {
                     $( ’#dynamic-batch-number‘ ).text( ’Por favor, selecione uma especificação do produto" );
                  }
               });
            ‘ );
        } else {
            // Para produtos simples, exibir diretamente
           $batch = $product-&gt;get_meta( ’_custom_batch_number‘, true );
            if ( $batch ) {
                echo ‘ <p>Número de lote: ‘ . $batch . '</p>';
            } else {
                echo ‘ Número de lote não disponível';
            }
        }
    }
}

```‘<p><strong>Número do lote de produção:</strong>‘ . esc_html( $batch ) . ’</p>’// O código JavaScript acima é responsável por processar o pedido AJAX e retornar o número de lote da variação solicitado.  
function get_variation_batch_number_callback() {  
    variation_id = intval(post[‘variation_id’]);  
    batch = get_post_meta(variation_id, ‘_custom_batch_number’, true);  
    wp_send_json_success(batch);  
}  

// Trata o pedido AJAX acima.  
add_action(‘wp_ajax_get_variation_batch_number’, ‘get_variation_batch_number_callback’);  
add_action(‘wp_ajax_nopriv_get_variation_batch_number’, ‘get_variation_batch_number_callback’);  
function get_variation_batch_number_callback() {  
    variation_id = intval(post[‘variation_id’]);  
    batch = get_post_meta(variation_id, ‘_custom_batch_number’, true);  
    wp_send_json_success(batch);  
}

Filtrar produtos com base em atributos personalizados.

Se o campo que você adicionou for um atributo filtrável (como “Origem”), poderá registá-lo como um atributo de produto filtrável e usar o WooCommerce para isso.[products]Filtre utilizando códigos curtos ou pequenas ferramentas. Uma abordagem mais avançada consiste em fazer isso através dewoocommerce_product_queryOs ganchos permitem alterar diretamente a consulta principal na página de arquivamento de produtos (como a página da loja) e filtrar os produtos com base no valor dos campos personalizados.

add_action( 'woocommerce_product_query', 'filter_products_by_custom_meta' );
function filter_products_by_custom_meta( $q ) {
    if ( isset( $_GET[‘special_batch’] ) && ! empty( $_GET[‘special_batch’] ) ) {
        $meta_query = $q->get( 'meta_query' );
        $meta_query[] = array(
            'key‘ => ’_custom_batch_number‘,
            ’value‘ => sanitize_text_field( $_GET[‘special_batch’] ),
            ’compare‘ => ’LIKE‘,
        );
        $q->set( ’meta_query‘, $meta_query );
    }
}

resumos

Através da utilização flexível das funcionalidades de metadados do WordPress e dos vários "hooks" fornecidos pelo WooCommerce, podemos ultrapassar significativamente as limitações do seu modelo de dados predefinido. Desde a adição de campos de texto simples até à implementação de ligações complexas de inventário em vários armazéns, os campos personalizados proporcionam aos gestores de lojas uma capacidade poderosa de gestão de dados.

O importante é compreender onde os dados são armazenados (tabela de metadados do artigo), dominar a forma de renderizar os campos no back-end de administração (funções do WooCommerce) e utilizar com competência os filtros e ganchos de ação para intervir na lógica central (como o cálculo de estoque e a filtragem de consultas). Sempre coloque a experiência do utilizador em primeiro lugar e certifique-se de que os dados personalizados não só podem ser geridos com facilidade pelos administradores, mas também são apresentados de forma clara e interativa aos clientes finais, aumentando assim a profissionalidade e a eficiência operacional da loja.

Perguntas frequentes Perguntas frequentes

Como é garantida a segurança dos dados dos campos personalizados?

É crucial garantir uma limpeza e validação rigorosas ao guardar os dados dos campos personalizados. Certifique-se de utilizar, por exemplo,sanitize_text_field()absint()Utilize uma função de limpeza do WordPress como esta para processar todas as entradas dos utilizadores. Para os campos de inventário numéricos, certifique-se de que são convertidos para o tipo inteiro. Ao mesmo tempo, ao efetuar a saída para a página front-end, utilize <esc_html()ouwc_clean()Fazer a escape para evitar ataques de Cross-Site Scripting (XSS).

Estes campos personalizados são compatíveis com plugins de terceiros?

A compatibilidade depende da forma como os plugins de terceiros funcionam. A maioria dos plugins bem concebidos (como plugins de SEO, construtores de páginas) lê as informações do produto através dos ganchos padrão do WooCommerce, por isso, normalmente, não são afetados. No entanto, se o plugin consultar diretamente a base de dados ou alterar a lógica central, os seus campos personalizados poderão ser ignorados. É essencial testar cuidadosamente a compatibilidade no ambiente de teste antes de implementar funcionalidades críticas para o negócio.

Um grande número de campos personalizados afetará o desempenho do site?

Uma implementação inadequada pode realmente afetar o desempenho. Cada umget_post_meta()Cada chamada resulta numa consulta à base de dados. A melhor prática é: numa única função ou gancho, realizar uma única consulta.get_post_meta($id)Não especifique o nome da chave para obter todos os metadados (retorna uma matriz) e, em seguida, leia os valores necessários da matriz; ou useWC_ProductO objeto deget_meta()Método. Além disso, pode-se considerar armazenar dados personalizados que são acessados com frequência e raramente alterados no cache de objetos.

Quando se faz uma mudança ou uma cópia de segurança, os dados dos campos personalizados são perdidos?

Desde que você use a API de metadados padrão do WordPress/WooCommerce (comoupdate_post_metaPara guardar os dados, estes são armazenados na base de dados do WordPress.wp_postmetaNesta tabela. Qualquer plugin ou ferramenta padrão de backup e migração do WordPress (como All-in-One WP Migration ou Duplicator) incluirá essas tabelas, portanto, os dados não serão perdidos. Certifique-se de realizar testes de validação de dados após a migração.