Case Variável 5

 

Plataforma de Crowdfunding com WordPress + Gravity Forms + Posts 2 Posts

variavel5.com.br

Text

Variável 5 Home Page

Tema

Theme Hybrid

e

Hybrid Core Framework

by

Justin Tadlock

 

http://themehybrid.com/

Home

Projetos

Outras páginas

Projeto

Arquitetura da informação

Categoria

Projeto

Categoria

Projeto

Categoria

Projeto

Categoria

Modelagem dos dados

Projeto

Tipo de projeto

Status

Valor total necessário

Valor já arrecadado

Total de cotas

Cotas vendidas

...

Recompensa

Valor da cota

Total de cotas

Cotas ilimitadas?

Qtd cotas já vendidas

Data de entrega

...

Usuário

1

*

*

*

*

*

ID Registro form

ID transação Paypal

Data da compra

Total

ID Recompensa

Qtd recompensas

ID Registro form

ID transação Paypal

Data da compra

Total

Dados cadastrais

Dados das compras​

/* Cria custom post types e taxonomias */
add_action( 'init', 'v5_custom_postype_taxonomy' );

function v5_custom_postype_taxonomy() {

    register_post_type('projeto');

    register_post_type('recompensa');

    register_taxonomy('status', 'projeto');

    register_taxonomy('tipo-projeto', 'projeto');

}

Criando estruturas dos dados

Metadados são manipulados através do plugin Custom Field Suite

//conexao projeto<->recompensa
p2p_register_connection_type( array(
    'name'         => 'recompensa_to_projeto',
    'from'         => 'recompensa',
    'to'           => 'projeto',
    'cardinality'  => 'many-to-one',
    'sortable'     => 'to',
    'admin_column' => 'any'
) );

Registrando conexões

Plugin Posts 2 Posts

//conexao projeto<->user para compra das cotas
p2p_register_connection_type( array(
    'name'                  => 'variantes',
    'from'                  => 'projeto',
    'to'                    => 'user',
    'duplicate_connections' => true,
    'title'                 => 'Variantes',
    'context'               => 'advanced',
    'sortable'              => 'to',
    'admin_column'          => 'to',
    'fields'                => array( 
        'recompensa'  => 'Recompensa', 
        'count'       => 'Quantidade', 
        'entry'       => 'Registro no form', 
        'paypal_id'   => 'ID PayPal',
        'data_compra' => 'Data da compra', 
        'total'       => 'Valor total' ),
) );

Registrando conexões

Plugin Posts 2 Posts

//conexao user<->recompensa para as compras realizadas
p2p_register_connection_type( array(
    'name'                  => 'user_to_recompensa',
    'from'                  => 'user',
    'to'                    => 'recompensa',
    'duplicate_connections' => true,
    'title'                 => 'Variantes',
    'context'               => 'advanced',
    'admin_column'          => 'from',
    'fields'                => array( 
        'entry'       => 'ID Registro', 
        'data_compra' => 'Data da compra', 
        'paypal_id'   => 'ID PayPal', 
        'total'       => 'Valor total' 
    )
) );

Registrando conexões

Plugin Posts 2 Posts

Criando formulário

Gravity Forms

Fluxo do processo de compra

Usuário acessa página do projeto

projeto.php

 

  • Exibe metadados de acordo com o status do projeto
  • Busca recompensas relacionadas
    • Busca dados das recompensas
    • Checa disponibilidade de cotas e gera botão

?p=80&projeto_id=3189&recompensa_id=3197

Escolhe recompensa

page-comprar-cota.php

 

Altera objeto do form antes de renderizá-lo, através do filtro gform_pre_render, inserindo as recompensas num campo Radio e armazenando alguns dados como ID do user em campos ocultos para uso posterior.

PayPal

Processa pagamento

gform_paypal_fulfillment

 

Após receber confirmação do PayPal, através da action gform_paypal_fulfillment, processa o pagamento atualizando os respectivos metadados e fazendo as devidas conexões usando o método p2p_type()->connect().

Buscando posts conectados

$query_recompensas = new WP_Query( array(
    'connected_type'  => 'recompensa_to_projeto',
    'connected_items' => get_queried_object(),
    'posts_per_page'  => -1         
) );


$query_recompensas = get_posts( array(
    'connected_type'  => 'recompensa_to_projeto',
    'connected_items' => $_GET['projeto_id'],
    'nopaging'        => true
) );

Editando o formulário

add_filter('gform_pre_render_2', 'v5_edit_form_comprar_cota', 10, 1);

function v5_edit_form_comprar_cota( $form ) {
    //Se não tiver ID do projeto retorna sem editar $form
    if ( ! isset($_GET['projeto_id']) ) return;

    // Itera sobre cada campo do formulário e edita o campo desejado
    foreach ( $form['fields'] as &$field ) {
        //Confere ID do campo produto para alterar somente ele
        if( $field['id'] != 45 ) continue;

        //Busca e itera sobre cada recompensa para adicionar no form
        $recompensas = get_posts( ... );
        foreach( $recompensas as $recompensa ) {
            //Busca metadados da recompensa
            //Checa se há cotas disponíveis antes de add no campo
            //Checa se usuário já escolheu a recompensa
            //Cria o array com as recompensas disponíveis
        }
    }
    return $form;
}

Processando o pagamento

add_action('gform_paypal_fulfillment', 'v5_processa_pagamento', 10, 4);

function v5_processa_pagamento($entry, $config, $transaction_id, $amount) {
  
    //Armazena e prepara dados enviados no form, $entry e $amount
    
    /* Processamento dados da recompensa */ 
    //Cria conexão entre o usuário e o projeto 
    p2p_type( 'variantes' )->connect( ... );
    
    //Busca valor já arrecadado e qtd cotas já vendidas
    //Soma com valores e qtd. da transação
    //Atualiza metadados do projeto

    /* Processamento dados da recompensa */
    //Cria conexão do usuário com a recompensa
    p2p_type( 'user_to_recompensa' )->connect( ... );
    
    //Busca quantidade de cotas já vendidas da recompensa 
    //Soma com a qtd. da transação
    //Atualiza metadados da recompensa
  
}

Criando conexão automaticamente

p2p_type( 'variantes' )->connect( $projeto_id, $user_id, array(
    'recompensa' => $recompensa_id,
    'count' => $qtd,
    'entry' => $entry['id'],
    'paypal_id' => $entry['transaction_id'],
    'data_compra' => $data_compra,
    'total' => $total_compra
) );

p2p_type( 'user_to_recompensa' )->connect( $user_id, $recompensa_id, array(
    'entry' => $entry['id'],
    'paypal_id' => $entry['transaction_id'],
    'data_compra' => $data_compra,
    'total' => $total_compra
) );

Metabox das conexões

Outras ferramentas usadas

Gravity Forms + Custom Post Types

Gravity Forms User Registration Add-on

Utimate Facebook (wpmudev)

Obrigado!

Marlon Lacerda Amâncio

marlon@naveguefeliz.com.br

Plataforma de Crowdfunding com WP + GF + P2P

By Marlon Lacerda Amâncio

Plataforma de Crowdfunding com WP + GF + P2P

  • 1,325