Você tem um curso, um e-book, um material exclusivo. Quer vender o acesso a essas peças de conteúdo via WooCommerce. Vai pesquisar plugins de "membership" e cai numa lista de soluções que cobram entre US$ 99 e US$ 299 por ano: MemberPress, Restrict Content Pro, Paid Memberships Pro, WooCommerce Memberships oficial.

Você instala o trial de um deles e descobre que 80% dos recursos são coisa que você nunca vai usar: drip content avançado, regras de upgrade entre níveis, integração com 12 gateways de assinatura, fórum próprio embutido, app mobile companion…

O que você queria mesmo era simples: quem comprou o produto X tem acesso ao post Y. Só isso.

Por que os plugins de membership são tão caros

Antes de criticar, vale entender: esses plugins não são caros à toa. Eles existem porque existem casos de uso complexos. Plataformas tipo "clube de assinatura mensal com 5 níveis e drip content semanal" precisam de muita infra: gestão de billing recorrente, downgrade automático quando assinatura expira, controle granular de quem vê o quê, integração com gateway de assinatura, e por aí vai.

Mas o caso mais comum — "vendi um curso, libera o acesso" — é trivial em comparação. E é exatamente o caso que todo infoprodutor pequeno tem.

O modelo "compra libera post" em 3 partes

Com WooCommerce nativo, três peças resolvem 90% dos casos:

  1. Uma categoria que marca posts como "protegidos".
  2. Um meta no produto que diz quais posts ele libera.
  3. Um filtro no the_content que checa se o usuário comprou esse produto antes de mostrar o conteúdo.

O WooCommerce já te dá uma função pronta pra a parte 3:

wc_customer_bought_product( $customer_email, $user_id, $product_id );

Retorna true se o cliente comprou esse produto em qualquer pedido pago. Essa é a função que faz todo o trabalho pesado. O resto é só plumbing.

Estrutura mínima

Você cria uma categoria de posts chamada "Protegido" (slug protegido). Marca cada post privado com essa categoria. Em cada produto WooCommerce, você adiciona um campo customizado _conteudo_posts que é um array de IDs de posts que esse produto libera.

Quando alguém abre um post da categoria Protegido, você roda um filtro:

add_filter( 'the_content', function( $content ) {
    $post_id = get_the_ID();

    // Só processa se o post está protegido
    if ( ! has_category( 'protegido', $post_id ) ) {
        return $content;
    }

    // Admin sempre vê
    if ( current_user_can( 'administrator' ) ) {
        return $content;
    }

    // Acha quais produtos liberam esse post
    $produtos = produtos_que_liberam_post( $post_id );

    // Pra cada produto, checa se o usuário comprou
    foreach ( $produtos as $product_id ) {
        if ( wc_customer_bought_product( '', get_current_user_id(), $product_id ) ) {
            return $content; // tem acesso
        }
    }

    // Não tem acesso: mostra a mensagem de bloqueio
    return mensagem_de_compre_o_produto();
} );

Isso é o core. Tudo que falta é a parte UX (mensagem de bloqueio bonita), uma aba no admin do produto para escolher os posts, e uma área "Minha Conta" listando o que o cliente tem acesso. Mas a lógica de proteção é literalmente o snippet acima.

Os detalhes que separam um snippet de um plugin

Se você só usa o código acima, funciona — mas tem casos de borda que vão te pegar em produção:

1. REST API também precisa proteger

O WordPress expõe posts via wp-json/wp/v2/posts. Se você só filtra o the_content, o conteúdo continua acessível via API. Você precisa hookar também o rest_prepare_post:

add_filter( 'rest_prepare_post', function( $response, $post ) {
    if ( has_category( 'protegido', $post->ID ) && ! usuario_tem_acesso( $post->ID ) ) {
        $response->data['content']['rendered'] = 'Conteúdo bloqueado.';
        $response->data['excerpt']['rendered'] = 'Conteúdo exclusivo.';
    }
    return $response;
}, 10, 2 );

2. Acesso manual (grant/revoke)

Algumas vezes você quer liberar acesso pra alguém sem que a pessoa tenha comprado: um aluno bolsista, um parceiro, suporte ao cliente. Você precisa de uma camada de acesso manual. Sugiro guardar como user_meta:

$manual = get_user_meta( $user_id, '_cnp_acesso_manual', true );
if ( is_array( $manual ) && in_array( $post_id, $manual ) ) {
    return true; // tem acesso por concessão manual
}

E no admin, uma tela onde você lista usuários, escolhe posts e adiciona/remove dessa array.

3. Mensagem de bloqueio que converte

"Você não tem acesso" é péssimo. A mensagem de bloqueio é uma oportunidade de venda. Use ela:

  • Mostre o nome do curso/produto que libera esse conteúdo;
  • CTA grande indo direto pra página do produto;
  • Se o user não está logado, mostre formulário de login junto (talvez já tenha conta);
  • Se está logado mas não comprou, foque no botão de comprar.

4. Internacionalização

Se a sua loja atende Brasil + outros mercados, suas strings precisam estar prontas pra tradução. Use __() e esc_html__() com text domain consistente. Gere o .pot e tenha versões em PT-BR, ES, EN no mínimo.

5. Última visita ao conteúdo

Pra mostrar "Continuar de onde parou" na área do cliente, você precisa registrar timestamp da última vez que cada user abriu cada post protegido. Outra user_meta:

$last = get_user_meta( $user_id, '_cnp_last_access', true );
$last = is_array( $last ) ? $last : array();
$last[ $post_id ] = time();
update_user_meta( $user_id, '_cnp_last_access', $last );

🔒 Já implementamos tudo isso num plugin grátis

O Intersomos Product Content tem o filtro do the_content, proteção da REST API, grant/revoke manual, registro de último acesso, área "Minha Conta", i18n (PT-BR/ES/EN) e mensagem de bloqueio com login form. Tudo em GPL.

Baixar grátis (só seu email)

Quando você DEVE usar um plugin pago de membership

Pra ser justo: existem cenários onde os plugins caros valem a pena.

  • Assinatura recorrente com gestão de billing — não é o caso aqui (compra única).
  • Drip content — liberar uma aula por semana, gradualmente. Dá pra fazer manual, mas se você tem 30 aulas, fica trabalhoso.
  • Múltiplos níveis com upgrade automático — clube com bronze/prata/ouro e regras de transição.
  • Comunidade gerenciada — fórum, mensagens diretas, grupos privados. Aí é outra história.

Mas se você só quer "comprou → liberou", o plugin caro é overkill. E pior: traz peso, complexidade de configuração e dependência de um vendor que pode te abandonar.

O argumento da auditoria

Tem mais uma vantagem em rolar uma solução enxuta: você consegue auditar o código. Plugins grandes de membership têm 20.000+ linhas. Você nunca vai ler tudo. Já um plugin focado em "compra libera post" tem mil linhas — você abre, lê, entende, e dorme tranquilo.

Conclusão

WooCommerce já te dá 90% do que precisa pra "compra libera post" via wc_customer_bought_product. O resto é UX e edge cases. Não pague US$ 199/ano por overkill. Use um plugin focado, ou escreva o seu — é menos código do que você imagina.

Achou útil? Compartilhe:

Twitter WhatsApp LinkedIn

Continue lendo

Rastreio Melhor Envio sumiu do painel?

Os 4 meta keys onde o WooCommerce esconde o tracking.

Pedidos de convidado órfãos no WooCommerce

Por que o histórico do cliente some quando ele cria conta depois.