FernandoAcosta.Netdocs

Personalizações para devs

2 min de leituraAtualizado há 5 dias

Esta página reúne hooks, snippets e personalizações para desenvolvedores que querem ajustar o comportamento do plugin sem editar o core.

Filtro: woocommerce_shortcode_products_query

Esse é o filtro nativo do WooCommerce, usado pelo WC_Shortcode_Products na renderização final da vitrine. O plugin já se engata nele pra forçar orderby = post__in e preservar a ordem de ranking de vendas.

Quando o filtro é útil pra você: ajustar outros aspectos da query (campos extras, taxonomias, meta queries, paginação) sem perder o ordenamento por vendas.

add_filter( 'woocommerce_shortcode_products_query', 'meu_ajuste_query_mais_vendidos', 20 );

function meu_ajuste_query_mais_vendidos( $query_args ) {
    // Exemplo: incluir só produtos de uma categoria específica
    $query_args['tax_query'] = array(
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'slug',
            'terms'    => array( 'eletronicos' ),
        ),
    );

    return $query_args;
}
Filtro global do WooCommerce

Esse filtro é compartilhado com qualquer outro shortcode [products], [featured_products] etc. Se aplicar incondicionalmente, seu ajuste vaza pra outras vitrines. Sempre cheque um contexto seguro antes de modificar.

Alterar a duração do cache

O cache padrão de 24h vive na constante DAY_IN_SECONDS dentro do método get_product_ids(). Pra trocar por outro intervalo sem editar o plugin, a forma mais limpa é forçar uma invalidação periódica via cron.

Snippet pra limpar o cache a cada hora (cuidado — derruba todo o ganho de performance):

add_action( 'init', function () {
    if ( ! wp_next_scheduled( 'limpar_cache_mais_vendidos' ) ) {
        wp_schedule_event( time(), 'hourly', 'limpar_cache_mais_vendidos' );
    }
} );

add_action( 'limpar_cache_mais_vendidos', function () {
    global $wpdb;

    $wpdb->query(
        "DELETE FROM {$wpdb->options}
         WHERE option_name LIKE '\_transient\_best\_selling\_by\_period\_%'
            OR option_name LIKE '\_transient\_timeout\_best\_selling\_by\_period\_%'"
    );
} );

Limpeza programática pontual

Pra invalidar o cache sob demanda — depois de uma reposição grande de estoque, ao final de uma campanha — chame a mesma rotina manualmente em qualquer hook:

function refresh_mais_vendidos() {
    global $wpdb;

    $wpdb->query(
        "DELETE FROM {$wpdb->options}
         WHERE option_name LIKE '\_transient\_best\_selling\_by\_period\_%'
            OR option_name LIKE '\_transient\_timeout\_best\_selling\_by\_period\_%'"
    );
}

// Exemplo: invalidar quando um produto volta ao estoque
add_action( 'woocommerce_product_set_stock_status', function ( $product_id, $stock_status ) {
    if ( 'instock' === $stock_status ) {
        refresh_mais_vendidos();
    }
}, 10, 2 );

Considerar mais statuses de pedido

Por padrão, apenas pedidos completed e processing entram no cálculo. Pra incluir outros (por exemplo, on-hold em lojas que mandam pedido pra produção antes da confirmação), seria preciso editar o array order_status no método get_product_ids(). Não há filtro pra modificar isso externamente — abra um issue ou ajuste no fork se for um caso de uso recorrente.

Renderizar via PHP

Quando precisar do shortcode dentro de um template do tema:

echo do_shortcode( '[best_selling_by_period limit="12" period="month"]' );

Ou montando os atributos dinamicamente:

$atts = sprintf(
    '[best_selling_by_period limit="%d" period="%s"]',
    20,
    'last_month'
);

echo do_shortcode( $atts );

Próximos passos

Foi útil?