Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Estendendo o BuddyPress com a classe BP_Component

Renato Alves
September 24, 2016

Estendendo o BuddyPress com a classe BP_Component

Renato Alves

September 24, 2016
Tweet

More Decks by Renato Alves

Other Decks in Programming

Transcript

  1. Olá Rio! Sou Renato Alves Recifense/Pernambucano/Nordestino Desenvolvedor WordPress/BuddyPress/Freelancer Desenvolvedor Full-stack

    no Inglês na Rede WordPress Engineer na agência canadense Saucal Contribuidor dos plugins bbPress e BuddyPress
  2. Nossa tarefa: Integrar a página de contas do WooCommerce no

    perfil de usuários do BuddyPress. Nessa integração, iremos utilizar a classe BP_Component do BuddyPress.
  3. BuddyPress?! O que é isso? :/ O BuddyPress é um

    plugin de rede sociais. Com ele, você será capaz de criar qualquer tipo de comunidade online/offline, intranets ou grupos de usuários.
  4. Por que integrar esses dois plugins? Exemplos de integração do

    BuddyPress e o WooCommerce Sites com assinaturas e produtos; Sites que tem como foco, componentes do BP; Evitar confundir o usuário.
  5. Classe BP_Component O que é a classe BP_Component? Por que

    ela existe? Como ela é usada no BuddyPress? Como ela está sendo utilizada por plugins? Menus; Arquivos do Component; Grupo de cache; Registra post types/taxonomies; Tabelas de banco de dados; Tabelas de metadados; Adiciona Permalinks; Rewrite rules.
  6. class IRB_WC_Account_Component extends BP_Component { public function __construct() { parent::start(

    'bp_wc_account', __( 'Apoio', 'irb' ) ); $this->setup_hooks(); } public function setup_hooks() { add_filter( 'woocommerce_get_endpoint_url', array( $this, 'get_url' ), 10, 4 ); add_filter( 'woocommerce_get_myaccount_page_permalink', array( $this, 'account_url' ), 10, 1 ); add_filter( 'woocommerce_is_account_page', array( $this, 'is_account_page' ), 10, 1 ); add_filter( 'woocommerce_locate_template', array( $this, 'disable_account_nav' ), 10, 2 ); } public function disable_account_nav( $template = '', $template_name = '' ) { if ( 'myaccount/navigation.php' === $template_name && bp_is_current_component( 'minha-conta' ) ) { $template = plugin_dir_path( __FILE__ ) . 'dummy-nav.php'; } return $template; } // Continua.... # Início do Plugin
  7. public function setup_globals( $args = array() ) { $bp =

    buddypress(); $bp->active_components[$this->id] = '1'; // Definir um slug, se necessário if ( ! defined( 'BP_WC_ACCOUNT_SLUG' ) ) { define( 'BP_WC_ACCOUNT_SLUG', 'minha-conta' ); } $args = array( 'slug' => BP_WC_ACCOUNT_SLUG, 'has_directory' => false, ); parent::setup_globals( $args ); $this->irb_wc_link = ''; if ( is_user_logged_in() ) { $this->irb_wc_link = trailingslashit( bp_loggedin_user_domain() . $this->slug ); } } # Informações Globais do Plugin
  8. public function setup_nav( $main_nav = array(), $sub_nav = array() )

    { ... tem código mais aqui em cima foreach ( wc_get_account_menu_items() as $key_item => $item ) { // if ( 'dashboard' === $key_item || 'customer-logout' === $key_item ) { // continue; // } // Não inclua a página edit-account // if ( bp_is_active( 'settings' ) && 'edit-account' === $key_item ) { // continue; // } ... continuação da criação dos menus } # Menus opcionais
  9. // O WooCommerce usa para direcionar o usuário após o

    formulário é enviado. public function account_url( $url = '' ) { global $wp; if ( ! bp_is_current_component( 'minha-conta' ) && ! isset( $wp->query_vars['customer-logout'] ) && empty( $this->was_redirected ) ) { return $url; } if ( isset( $wp->query_vars['customer-logout'] ) ) { return bp_get_root_domain(); } else { return trailingslashit( bp_loggedin_user_domain() . $this->slug ); } } # Filtro de URL
  10. public function set_screen() { if ( bp_is_current_action( 'orders' ) &&

    'view-order' === bp_action_variable( 0 ) && is_numeric( bp_action_variable( 1 ) ) ) { // WooCommerce usa a variável global $wp global $wp; unset( $wp->query_vars['orders'] ); $wp->query_vars['view-order'] = (int) bp_action_variable( 1 ); } remove_filter( 'the_title', 'wc_page_endpoint_title' ); add_action( 'bp_template_content', array( $this, 'wc_content' ) ); bp_core_load_template( 'members/single/plugins' ); } # Dizendo ao BP que tela usar
  11. public function wc_content() { global $wp; $vars = $wp->query_vars['name']; if

    ( $vars == 'billing' ) { return woocommerce_account_edit_address( $vars ); } else if ( $vars == 'view-order' ) { return woocommerce_account_view_order( $wp->query_vars['page'] ); } else if ( $vars == 'minha-conta' ) { return woocommerce_account_content(); } else { do_action( 'woocommerce_account_' . $vars . '_endpoint'); } } # Pós Woo 2.6 - Conteúdo interno de cada tela
  12. public function get_url( $url, $endpoint, $value, $permalink ) { if

    ( ! bp_is_current_component( 'minha-conta' ) ) { return $url; } $my_account_slugs = array_merge( wc_get_account_menu_items(), array( 'view-order' => true ) ); if ( isset( $my_account_slugs[ $endpoint ] ) ) { $slug = $endpoint; if ( 'view-order' === $endpoint ) { $slug = 'orders/' . $slug; } $url = trailingslashit( bp_loggedin_user_domain() . $this->slug ) . $slug; if ( ! empty( $value ) ) { $url = trailingslashit( $url ) . $value; } } return $url; } # Ajustando as URLs
  13. function irb_wc_account_component() { buddypress()->irb_wc_account = new IRB_WC_Acount_Component; } add_action( 'irb_wc_account_ready',

    'irb_wc_account_component', 20 ); # Criando a instância # Carregando o componente onde quiser private function setup_actions() { if ( class_exists('WooCommerce') ) { require( $this->plugin_dir . 'woo/bp-wp-component.php' ); } # Adicionando o component do_action( 'irb_wc_account_ready' ); }