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:
- Uma categoria que marca posts como "protegidos".
- Um meta no produto que diz quais posts ele libera.
- Um filtro no
the_contentque 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.
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: