Shortcode para exibir valor parcelado na página de um produto variavel

Claro! Aqui está uma descrição da função exibir_valor_parcelado_shortcode:

Função exibir_valor_parcelado_shortcode

A função exibir_valor_parcelado_shortcode é uma função personalizada em PHP que pode ser utilizada em WordPress para exibir informações de preços parcelados de produtos. Ela cria um shortcode chamado [exibir_valor_parcelado] que pode ser inserido em páginas, postagens ou widgets para exibir os valores parcelados de um produto.

Parâmetros

A função aceita os seguintes parâmetros:

  • frase_anterior (opcional): Define a frase anterior ao exibir os preços parcelados. O valor padrão é “Ou compre parcelado em até”.
  • frase_posterior (opcional): Define a frase posterior ao exibir os preços parcelados. O valor padrão é “no cartão de crédito”.
  • frase_anterior_atributo (opcional): Define a frase anterior específica para variações de produtos que são atributos. O valor padrão é “Ou compre parcelado no(a)”.
  • frase_posterior_atributo (opcional): Define a frase posterior específica para variações de produtos que são atributos. O valor padrão é vazio.
  • parcelas (opcional): Define o número de parcelas para cálculo dos preços. O valor padrão é 10.
  • taxa (opcional): Define a taxa de juros a ser aplicada nos preços parcelados. O valor padrão é 3.

Uso

Para utilizar a função, é necessário adicionar o shortcode [exibir_valor_parcelado] em uma página, postagem ou widget. É possível personalizar os parâmetros do shortcode conforme necessário. Exemplo de uso:

[exibir_valor_parcelado frase_anterior="Aproveite nossas promoções" parcelas=12 taxa=2.5]

Exemplo de Implementação

A função exibir_valor_parcelado_shortcode deve ser adicionada ao arquivo functions.php do tema ativo do WordPress ou a um plugin personalizado. Após adicioná-la, o shortcode [exibir_valor_parcelado] estará disponível para uso.

function exibir_valor_parcelado_shortcode($atts) {
    // Código da função
}

add_shortcode('exibir_valor_parcelado', 'exibir_valor_parcelado_shortcode');

Recomenda-se que as alterações sejam feitas em um tema filho ou em um plugin personalizado para garantir a manutenção das modificações mesmo em atualizações futuras do tema.

Com essa função, é possível exibir informações de preços parcelados para produtos, considerando variações e atributos. Os parâmetros personalizáveis permitem adaptar a exibição de acordo com as necessidades específicas de cada site ou loja virtual.

Lembre-se de ajustar os parâmetros do shortcode conforme suas preferências e requisitos.


Aqui está a versão corrigida da função para se ajustar a produtos variáveis exibir_valor_parcelado_shortcode:

function exibir_valor_parcelado_shortcode($atts) {
    $atts = shortcode_atts(
        array(
            'frase_anterior' => '',
            'frase_posterior' => '',
            'frase_anterior_atributo' => '',
            'frase_posterior_atributo' => '',
            'parcelas' => '',
            'taxa' => '',
        ),
        $atts,
        'exibir_valor_parcelado'
    );

    global $product;

    if (!$product) {
        return 'Erro: nenhum produto encontrado.';
    }

    $output = '';
    $frase_anterior = esc_html($atts['frase_anterior']);
    $frase_posterior = esc_html($atts['frase_posterior']);
    $frase_anterior_atributo = esc_html($atts['frase_anterior_atributo']);
    $frase_posterior_atributo = esc_html($atts['frase_posterior_atributo']);
    $parcelas = intval($atts['parcelas']);
    $taxa = floatval($atts['taxa']);

    if ($product->is_type('variable')) {
        $variations = $product->get_available_variations();

        if (empty($variations)) {
            return 'Erro: nenhuma variação encontrada para este produto.';
        }

        $output .= $frase_anterior_atributo . ' ';

        $variation_prices = array();

        foreach ($variations as $variation) {
            $variation_id = $variation['variation_id'];
            $variation_obj = wc_get_product($variation_id);

            if ($variation_obj) {
                $attributes = $variation_obj->get_variation_attributes();
                $variation_price = $variation_obj->get_price();
                $valor_parcela = $variation_price / $parcelas;
                $valor_parcela_com_taxa = $valor_parcela + ($valor_parcela * $taxa / 100);

                $variation_info = implode(' ', $attributes);
                $variation_prices[] = $variation_info . ' em até ' . $parcelas . 'x de ' . wc_price($valor_parcela_com_taxa);
            }
        }

        $output .= implode(', ', $variation_prices);

        if (!empty($frase_posterior_atributo)) {
            $output .= ' ' . $frase_posterior_atributo;
        }
    } else {
        $output .= $frase_anterior . ' ';

        $product_price = $product->get_price();
        $valor_parcela = $product_price / $parcelas;
        $valor_parcela_com_taxa = $valor_parcela + ($valor_parcela * $taxa / 100);

        $output .= $parcelas . 'x de ' . wc_price($valor_parcela_com_taxa) . ' ';

        if (!empty($frase_posterior)) {
            $output .= $frase_posterior;
        }
    }

    return $output;
}

add_shortcode('exibir_valor_parcelado', 'exibir_valor_parcelado_shortcode');

Exibir apenas o preço único parcelado caso todas as variações tenham o mesmo preço

Para fazer a alteração na função e exibir apenas o preço único parcelado caso todas as variações tenham o mesmo preço, você pode adicionar uma verificação adicional antes de iterar sobre as variações. Aqui está o código modificado para implementar essa alteração:

function exibir_valor_parcelado_shortcode($atts) {
    $atts = shortcode_atts(
        array(
            'frase_anterior' => '',
            'frase_posterior' => '',
            'frase_anterior_atributo' => '',
            'frase_posterior_atributo' => '',
            'parcelas' => '',
            'taxa' => '',
        ),
        $atts,
        'exibir_valor_parcelado'
    );

    global $product;

    if (!$product) {
        return 'Erro: nenhum produto encontrado.';
    }

    $output = '';
    $frase_anterior = esc_html($atts['frase_anterior']);
    $frase_posterior = esc_html($atts['frase_posterior']);
    $frase_anterior_atributo = esc_html($atts['frase_anterior_atributo']);
    $frase_posterior_atributo = esc_html($atts['frase_posterior_atributo']);
    $parcelas = intval($atts['parcelas']);
    $taxa = floatval($atts['taxa']);

    if ($product->is_type('variable')) {
        $variations = $product->get_available_variations();

        if (empty($variations)) {
            return 'Erro: nenhuma variação encontrada para este produto.';
        }

        // Check if all variations have the same price
        $same_price = true;
        $first_variation_price = null;
        foreach ($variations as $variation) {
            $variation_id = $variation['variation_id'];
            $variation_obj = wc_get_product($variation_id);
            if ($variation_obj) {
                $variation_price = $variation_obj->get_price();
                if ($first_variation_price === null) {
                    $first_variation_price = $variation_price;
                } elseif ($variation_price !== $first_variation_price) {
                    $same_price = false;
                    break;
                }
            }
        }

        if ($same_price) {
            // If all variations have the same price, show the single price
            $output .= $frase_anterior . ' ';

            $product_price = $product->get_price();
            $valor_parcela = $product_price / $parcelas;
            $valor_parcela_com_taxa = $valor_parcela + ($valor_parcela * $taxa / 100);

            $output .= $parcelas . 'x de ' . wc_price($valor_parcela_com_taxa) . ' ';

            if (!empty($frase_posterior)) {
                $output .= $frase_posterior;
            }
        } else {
            // If variations have different prices, show individual variation prices
            $output .= $frase_anterior_atributo . ' ';

            $variation_prices = array();

            foreach ($variations as $variation) {
                $variation_id = $variation['variation_id'];
                $variation_obj = wc_get_product($variation_id);

                if ($variation_obj) {
                    $attributes = $variation_obj->get_variation_attributes();
                    $variation_price = $variation_obj->get_price();
                    $valor_parcela = $variation_price / $parcelas;
                    $valor_parcela_com_taxa = $valor_parcela + ($valor_parcela * $taxa / 100);

                    $variation_info = implode(' ', $attributes);
                    $variation_prices[] = $variation_info . ' em até ' . $parcelas . 'x de ' . wc_price($valor_parcela_com_taxa);
                }
            }

            $output .= implode(', ', $variation_prices);

            if (!empty($frase_posterior_atributo)) {
                $output .= ' ' . $frase_posterior_atributo;
            }
        }
    } else {
        // If the product is not variable, show the single price
        $output .= $frase_anterior . ' ';

        $product_price = $product->get_price();
        $valor_parcela = $product_price / $parcelas;
        $valor_parcela_com_taxa = $valor_parcela + ($valor_parcela * $taxa / 100);

        $output .= $parcelas . 'x de ' . wc_price($valor_parcela_com_taxa) . ' ';

        if (!empty($frase_posterior)) {
            $output .= $frase_posterior;
        }
    }

    return $output;
}

add_shortcode('exibir_valor_parcelado', 'exibir_valor_parcelado_shortcode');


Nessa modificação, adicionamos um loop antes de iterar sobre as variações para verificar se todas elas têm o mesmo preço. Se todas as variações tiverem o mesmo preço, a função irá exibir apenas o preço único parcelado, assim como para produtos simples. Caso contrário, a função irá exibir os preços parcelados individuais para cada variação.

Dessa forma, a função agora atende à condição de exibir apenas o preço único parcelado quando todas as variações possuírem o mesmo preço.